FFmpeg DVD
Introduction
This page will show how to create a DVD and converting different popular video file formats.
Guidelines for Encoding
The guidelines for encoding questionably sourced video are called "scene guides". They are signed by various release groups who will make sure their videos comply to the guide, LOL being one of these groups.
The main web site for this information is Scene Rules and a few examples are:-
How can I get high quality/low size MP4s like the LOL release group?
Stream Mapping
Single Input
Copy the first video track and the second audio track from the INPUT to the OUTPUT...
ffmpeg -y -i 'input.mkv' -map 0:v:0 -map 0:a:1 -vcodec copy -acodec copy 'output.mkv' Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:2 -> #0:1 (copy)
Copy the first video track and the second audio track and the third subtitle track from the INPUT to the OUTPUT...
ffmpeg -y -i 'input.mkv' -map 0:v:0 -map 0:a:1 -map 0:s:2 -vcodec copy -acodec copy -scodec copy 'output.mkv' Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:2 -> #0:1 (copy) Stream #0:5 -> #0:2 (copy)
Multiple Inputs
Copy the video track from the first INPUT and the audio track from the second INPUT to the OUTPUT...
ffmpeg -y -i 'input_0.mp4' -i 'input_1.mp4' -map 0:v:0 -map 1:a:0 -vcodec copy -acodec copy 'output_0.mp4'
https://trac.ffmpeg.org/wiki/Map
The 4 Movie File Formats
- SD 480p XviD MPEG-4 AAC AVI
- HD 720p AVC X264 AC3 MP4
- FHD 1080p HEVC X265 DTS MKV
- UHD 2160p HEVC HDR 10 X265 True HD Dolby Atmos MKV
Audio Formats
- AAC = Advanced Audio Codec = 2 channels @ 192 kb/s
- AC3 = Audio Codec 3 = 6 channels @ 384 kb/s
- E-AC3 = Enhanced Audio Codec 3 = 6 channels @ 640 kb/s
- DTS = Digital Theater Systems = 6 channels @ 1509 kb/s
- DTS-MA = Digital Theater Systems Master Audio = 8 channels @ 3813 kb/s
- A_TRUEHD = Dolby TrueHD with Dolby Atmos = 16 channels @ 5022 kb/s
Audio Tests - Best Sounding Dolby Atmos Movies
- Baby Driver
- Blade Runner 2049
- Doctor Sleep
- It
- Men in Black: International
- Mission: Impossible - Ghost Protocol
- Resident Evil: The Final Chapter
- Spider-Man: Into the Spider-Verse
- Terminator: Dark Fate
- The Cloverfield Paradox
https://www.avsforum.com/wordpress/10-best-sounding-dolby-atmos-movies-uhd-blu-ray/
HDR
Latest notes: 2021-10-26
How to convert Dolby Vision HDR to HDR10+ ?
- Download download a copy of hdr10plus_parser from quietviod’s repo.
- Check your video has HDR10+ info that it can read:
ffmpeg -loglevel panic -i input.mkv -c:v copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_parser --verify -
- Extract and save in the file metadata.json
ffmpeg -i input.mkv -c:v copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_parser -o metadata.json -
- Use in your expression...
ffmpeg.exe -i input.mkv -c:v libx265 -pix_fmt yuv420p10le -x265-params "colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc:master-display=G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,1):max-cll=1016,115:hdr10=1:dhdr10-info=metadata.json" -crf 20 -preset medium "output.mkv"
FastFlix
FastFlix is a simple and friendly GUI for encoding videos.
Download latest release from Github
FastFlix keeps HDR10 metadata for x265, NVEncC HEVC, and VCEEncC HEVC, which will also be expanded to AV1 libraries when available.
It needs FFmpeg (version 4.3 or greater) under the hood for the heavy lifting, and can work with a variety of encoders.
Other
Notes: 2020-03-26
Reading HDR Values
In order to pass the correct settings to ffmpeg to create your smaller MKV file, you need to analyse the source MKV file for the HDR values...
ffprobe -read_intervals "%+#2" -show_frames -show_entries side_data "input.mkv"
...this will then give you a result...
[SIDE_DATA] side_data_type=Mastering display metadata red_x=34000/50000 red_y=16000/50000 green_x=13250/50000 green_y=34500/50000 blue_x=7500/50000 blue_y=3000/50000 white_point_x=15635/50000 white_point_y=16450/50000 min_luminance=1/10000 max_luminance=10000000/10000 [/SIDE_DATA]
...which is translated as...
master-display='G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,1)'
https://x265.readthedocs.io/en/default/cli.html#cmdoption-master-display
...which is used in the ffmpeg command (which also now includes key_frame scanning)...
ffmpeg -y -i "input.mkv" -t 00:05:00 -hide_banner -stats -loglevel quiet -analyzeduration 100M -probesize 100M -max_muxing_queue_size 9999 -map 0:v:0 -map 0:a:0 -map 0:a:0 -pix_fmt yuv420p10le -vcodec libx265 -preset slow -x265-params "keyint=60:bframes=3:vbv-bufsize=75000:vbv-maxrate=75000:colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc:master-display='G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,1)'" -crf 22 -force_key_frames "expr:gte(t,n_forced*2)" -c:a:0 copy -c:a:1 dca -ab 1509k -map_metadata -1 -metadata title="${TITLE}" -metadata:s:a:0 language=eng -metadata:s:a:1 language=eng -map_chapters -1 -sn -strict -2 "output.mkv"
MakeMKV Forum Post "LINUX - ffmpeg - 4K HDR HEVC X265 - Plex"
SUCCESS!
Reducing the size of a 80Gb UHD Blu-ray video down to a more manageable 15Gb, whilst keeping a stunning 4K picture with 10-bit colour and HDR.
To prepare for future audio requirements, I have kept the original TrueHD 7.1 Dolby Atmos 16 Channels audio track and added a second Dolby DTS 5.1 audio track for my current set up.
20 minutes of movie took 12 hours to transcode, which means a 3 hour film will take 4 days to transcode!
Multiple audio...
ffmpeg -y -i "massive_4k_input_file.mkv" -t 00:20:00 -analyzeduration 100M -probesize 100M -max_muxing_queue_size 9999 -map 0:v:0 -map 0:a:0 -map 0:a:0 -pix_fmt yuv420p10le -vcodec libx265 -preset slow -x265-params "crf=26:keyint=60:bframes=3:vbv-bufsize=75000:vbv-maxrate=75000:colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc:master-display='G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,500)'" -c:a:0 copy -c:a:1 dca -ab 1509k -map_metadata -1 -metadata title="Movie Name (2017)" -metadata:s:a:0 language=eng -metadata:s:a:1 language=eng -map_chapters -1 -sn -strict -2 "Movie Name (2017) 4K ffmpeg 2 Audio.mkv"
Single audio...
ffmpeg -y -i "massive_4k_input_file.mkv" -t 00:00:30 -analyzeduration 100M -probesize 100M -max_muxing_queue_size 9999 -map 0:v:0 -map 0:a:1 -pix_fmt yuv420p10le -vcodec libx265 -preset medium -x265-params "keyint=60:bframes=3:vbv-bufsize=75000:vbv-maxrate=75000:colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc:master-display='G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,500)'" -acodec ac3 -ab 384k -ac 6 -map_metadata -1 -metadata title="Movie Name (2018)" -metadata:s:a:0 language=eng -map_chapters -1 -sn "Movie Name (2018) 4K ffmpeg.mkv"
Black Magic Forum - Formatting for HDR10
Official test video file at 60 FPS...
$ mediainfo 'Downloads/HDR/Samsung 4K HDR Demo - Chasing The Light.ts' General ID : 0 (0x0) Complete name : Downloads/HDR/Samsung 4K HDR Demo - Chasing The Light.ts Format : MPEG-TS File size : 762 MiB Duration : 1 min 35 s Overall bit rate mode : Constant Overall bit rate : 66.9 Mb/s Video ID : 257 (0x101) Menu ID : 1 (0x1) Format : HEVC Format/Info : High Efficiency Video Coding Commercial name : HDR10 Format profile : Main 10@L5.1@High Codec ID : 36 Duration : 1 min 34 s Width : 3 840 pixels Height : 2 160 pixels Display aspect ratio : 16:9 Frame rate : 59.940 (60000/1001) FPS Color space : YUV Chroma subsampling : 4:2:0 Bit depth : 10 bits Writing library : ATEME Titan File 3.7.3 (4.7.3.1002) Color range : Limited Color primaries : BT.2020 Transfer characteristics : PQ Matrix coefficients : BT.2020 non-constant Mastering display color primaries : Display P3 Mastering display luminance : min: 0.0500 cd/m2, max: 1000 cd/m2 Audio ID : 258 (0x102) Menu ID : 1 (0x1) Format : AAC LC Format/Info : Advanced Audio Codec Low Complexity Format version : Version 4 Muxing mode : ADTS Codec ID : 15-2 Duration : 1 min 34 s Bit rate mode : Variable Channel(s) : 2 channels Channel layout : L R Sampling rate : 48.0 kHz Frame rate : 46.875 FPS (1024 SPF) Compression mode : Lossy
Official test video at 30 FPS...
$ mediainfo 'Movies/Samsung Wonderland Two HDR UHD 4K Demo.ts' General ID : 0 (0x0) Complete name : Movies/Samsung Wonderland Two HDR UHD 4K Demo.ts Format : MPEG-TS File size : 802 MiB Duration : 2 min 10 s Overall bit rate mode : Constant Overall bit rate : 51.4 Mb/s Video ID : 257 (0x101) Menu ID : 1 (0x1) Format : HEVC Format/Info : High Efficiency Video Coding Commercial name : HDR10 Format profile : Main 10@L5.1@High Codec ID : 36 Duration : 2 min 9 s Width : 3 840 pixels Height : 2 160 pixels Display aspect ratio : 16:9 Frame rate : 23.976 (24000/1001) FPS Color space : YUV Chroma subsampling : 4:2:0 Bit depth : 10 bits Writing library : ATEME Titan File 3.7.9 (4.7.9.0) Color range : Limited Color primaries : BT.2020 Transfer characteristics : PQ Matrix coefficients : BT.2020 non-constant Mastering display color primaries : Display P3 Mastering display luminance : min: 0.0500 cd/m2, max: 1000 cd/m2 Audio ID : 258 (0x102) Menu ID : 1 (0x1) Format : AAC LC Format/Info : Advanced Audio Codec Low Complexity Format version : Version 4 Muxing mode : ADTS Codec ID : 15-2 Duration : 2 min 9 s Bit rate mode : Variable Channel(s) : 2 channels Channel layout : L R Sampling rate : 48.0 kHz Frame rate : 46.875 FPS (1024 SPF) Compression mode : Lossy
4K UHD movie extracted using MakeMKV...
Video ID : 1 ID in the original source medium : 4113 (0x1011) Format : HEVC Format/Info : High Efficiency Video Coding Commercial name : HDR10 Format profile : Main 10@L5.1@High Codec ID : V_MPEGH/ISO/HEVC Duration : 2 h 43 min Bit rate : 49.5 Mb/s Width : 3 840 pixels Height : 2 160 pixels Display aspect ratio : 16:9 Frame rate mode : Constant Frame rate : 23.976 (24000/1001) FPS Color space : YUV Chroma subsampling : 4:2:0 (Type 2) Bit depth : 10 bits Bits/(Pixel*Frame) : 0.249 Stream size : 56.5 GiB (78%) Language : English Default : No Forced : No Color range : Limited Color primaries : BT.2020 Transfer characteristics : PQ Matrix coefficients : BT.2020 non-constant Mastering display color primaries : Display P3 Mastering display luminance : min: 0.0050 cd/m2, max: 4000 cd/m2 Maximum Content Light Level : 457 cd/m2 Maximum Frame-Average Light Level : 179 cd/m2 Original source medium : Blu-ray
https://stevens.li/guides/video/converting-hdr-to-sdr-with-ffmpeg/
-color_trc smpte2084
https://forum.videohelp.com/threads/385404-HDR-encoding
ffmpeg -y -i "in.mkv" -analyzeduration 100M -probesize 100M -max_muxing_queue_size 9999 -map 0:v -map 0:a -map 0:s? -c:s copy -c:a copy -pix_fmt yuv420p10le -vf scale=out_color_matrix=bt2020:out_h_chr_pos=0:out_v_chr_pos=0,format=yuv420p10 -c:v libx265 -preset medium -x265-params "high-tier=1:level-idc=5.1:open-gop=1:crf=22:crf-min=5:crf-max=40:aq-mode=1:colorprim=bt2020:colormatrix=bt2020nc:transfer=smpte2084:colormatrix=bt2020nc:hdr=1:hdr=1:info=1:repeat-headers=1:max-cll=0,0:master-display=G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(12000000,200)" "out.mkv"
X265 Log Level Quiet No Output
-x265-params log-level=error
Force Encoding In 8-Bit
-pix_fmt yuv420p
Combine Video Filters
To crop and deinterlace...
-vf "crop=704:416:8:80,yadif"
Convert 3D To 2D
ffmpeg -y -i "movie.mp4" -vf "stereo3d=sbsl:ml" -metadata:s:v:0 stereo_mode="mono" -aspect 16:9 "output.mp4"
Ffmpeg Documentation - Steroscopic
Detect Top Bottom Widescreen Black Bars
1. Detect with cropdetect
The filter cropdetect can be used to provide the parameters for the crop filter. In this example the first 90 seconds is skipped and 10 frames are processed...
ffmpeg -ss 90 -i input.mp4 -vframes 10 -vf cropdetect -f null - [Parsed_cropdetect_0 @ 0x220cdc0] x1:0 x2:1279 y1:0 y2:719 w:1280 h:720 x:0 y:0 pts:215 t:0.215000 crop=1280:720:0:0 [Parsed_cropdetect_0 @ 0x220cdc0] x1:0 x2:1279 y1:0 y2:719 w:1280 h:720 x:0 y:0 pts:257 t:0.257000 crop=1280:720:0:0 [Parsed_cropdetect_0 @ 0x220cdc0] x1:0 x2:1279 y1:0 y2:719 w:1280 h:720 x:0 y:0 pts:299 t:0.299000 crop=1280:720:0:0
...so according to cropdetect we can use crop=1280:720:0:0
2. Preview with ffplay
ffplay -vf crop=1280:720:0:0 input.mp4
3. Reencode using the crop filter
ffmpeg -i input.mp4 -vf crop=1280:720:0:0 -c:a copy output.mp4
Explanation
- "crop=W:H:X:Y" means we're using the "crop" video filter, with 4 values:
- w is the width of the output video (so the width of the cropped region)
- h is the height of the output video (the height of the cropped region)
- x is the horizontal position from where to begin cropping, starting from the left (with the absolute left margin being 0)
- y is the vertical position from where to begin cropping, starting from the top of the video (the absolute top being 0)
Script Integration
CROP=$( ffmpeg -ss 90 -i "$1" -vframes 10 -vf cropdetect -f null - &>/tmp/ffmpeg_cropdetect.txt && grep 'Parsed_cropdetect_0' /tmp/ffmpeg_cropdetect.txt | tail -n1 | awk '{ print $14 }' ) "${FFMPEG}" -y -i "$1" -hide_banner -stats -loglevel quiet ${TEST} -map 0:v:0 -map 0:a:${AUDIO} -vf "${CROP}"
4K UHD Crop Detect
Display aspect ratio = 2.40:1 --> crop=3840:1600:0:280
1080 Full HD Crop Detect
Display aspect ratio = 2.40:1 --> crop=1920:800:0:140 Display aspect ratio = 2.39:1 --> crop=1920:816:0:132 Display aspect ratio = 2.35:1 --> crop=1920:816:0:130
576 SD Crop Detect
Display aspect ratio = 2.40:1 --> crop=720:416:0:80
Detect Interlaced Video
ffmpeg -i "input.mkv" -filter:v idet -frames:v 200 -an -f rawvideo -y /dev/null
http://www.aktau.be/2013/09/22/detecting-interlaced-video-with-ffmpeg/
Remove Interlacing Combing
ffmpeg -i input.vob -vf yadif -c:v libx264 -preset slow -crf 19 -c:a aac -b:a 256k output.mp4
Desaturate Colour To Monochrome And Increase Contrast
-vf "eq=saturation=0:contrast=1"
Denoise
- atadenoise: very fast, temporal only with no motion compensation
- hqdn3d: fast, both spatial and temporal, does basically lowpass by destroying high frequencies, blurs with extreme settings
- nlmeans: very slow, currently implemented as spatial only, algorithm considered as one of the state of art denoisers
- bm3d: very very slow, currently implemented as spatial only, algorithm considered as one of the state of art denoisers
- vaguedenoiser: slow, spatial only, pretty good, wavelet
- dctdnoiz: very very slow: spatial only, blurs too much
- fftdnoiz: slow, spatial and limited temporal, using Fast Fourier Transform
- owdenoise: very very very slow, spatial only, wavelet
- removegrain: fast, spatial only, limited usecase
Cut Video Based On Start And End Time
ss = start time t = length
This is 5 minutes...
ffmpeg -ss 00:00:00 -t 00:05:00 -i movie.mp4 -acodec copy -vcodec copy -async 1 cut.mp4
Find Total Time Of Video Files In Folder
NEW
#!/bin/sh # convert_seconds.sh # Convert seconds to h:m:s format [ -z ${1} ] && echo "Usage: $(basename $0) <seconds>" && exit||secs=${1} printf ""%dh:%dm:%ds"\n" $(($secs/3600)) $(($secs%3600/60)) $(($secs%60)) exit
~/Bin/convert_seconds.sh $( find . -maxdepth 1 -iname '*.mkv' -exec ffprobe -v quiet -of csv=p=0 -show_entries format=duration {} \; | paste -sd+ -| bc | awk '{print int($1)}' )
OLD
find . -maxdepth 1 -iname '*.mp4' -exec ffprobe -v quiet -of csv=p=0 -show_entries format=duration {} \; | paste -sd+ -| bc
Scale Video Keeping Correct Aspect Ratio
Use the scale filter to have ffmpeg work out the corresponding height or width. So, for videos which have already been cropped top and bottom, you would specify the correct width and let it work out the new height to keep the cropping and correct aspect ratio.
256x144, 426x240, 640x360, 854x480, 960x540, 1024x576, 1280x720, 1920x1080, 2560x1440, 3840x2160
e.g. a video that would have been specified as 'hd480' (854x480) is...
-vf "scale=854:-2"
...for 'hd720' it is...
-vf "scale=1280:-2"
...and for 'hd1080' it is...
-vf "scale=1920:-2"
Complete examples below for the 3 file types and resolutions...
LATEST METHODS JULY 2019
Now including CROP of top and bottom black bars. It has to crop _then_ scale so the order of the video filter is important :-)
# # 480p mpeg4 aac avi # "${FFMPEG}" -y -i "${INPUT}" -hide_banner -stats -loglevel quiet ${TEST} -map 0:v:0 -map 0:a:$AUDIO -f avi -vf "${CROP},scale=854:-2" -vcodec mpeg4 -vtag xvid -qscale:v 8 -mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -acodec aac -ab 128k -ac 2 -ar 44100 -threads 1 -map_metadata -1 -metadata title="${TITLE}" -metadata:s:a:0 language=eng -map_chapters -1 -sn "${OUTPUT}" # # 720p x264 ac3 mp4 # "${FFMPEG}" -y -i "${INPUT}" -hide_banner -stats -loglevel quiet ${TEST} -map 0:v:0 -map 0:a:$AUDIO -f mp4 -vf "${CROP},scale=1280:-2" -vcodec libx264 -crf 23 -preset veryslow -tune "${X264TUNE}" -profile:v high -level 4.1 -acodec ac3 -ab 384k -ac 6 -map_metadata -1 -metadata title="${TITLE}" -metadata:s:a:0 language=eng -map_chapters -1 -sn "${OUTPUT}" # # 1080p x265 dts mkv # "${FFMPEG}" -y -i "${INPUT}" -hide_banner -stats -loglevel quiet ${TEST} -map 0:v:0 -map 0:a:$AUDIO -f matroska -vf "${CROP},scale=1920:-2" -vcodec libx265 -crf 26 -preset slow -x265-params log-level=quiet -acodec dca -ab 1509k -map_metadata -1 -metadata title="${TITLE}" -metadata:s:a:0 language=eng -map_chapters -1 -sn -strict -2 "${OUTPUT}"
LATEST METHODS JUNE 2019
# # 480p mpeg4 aac avi # "${FFMPEG}" -y -i "${INPUT}" -hide_banner -stats -loglevel quiet ${TEST} -map 0:v:0 -map 0:a:$AUDIO -f avi -vf scale=854:-2 -vcodec mpeg4 -vtag xvid -qscale:v 8 -mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -acodec aac -ab 128k -ac 2 -ar 44100 -threads 1 -map_metadata -1 -metadata title="${TITLE}" -metadata:s:a:0 language=eng -map_chapters -1 -sn "${OUTPUT}" # # 720p x264 ac3 mp4 # "${FFMPEG}" -y -i "${INPUT}" -hide_banner -stats -loglevel quiet ${TEST} -map 0:v:0 -map 0:a:$AUDIO -f mp4 -vf scale=1280:-2 -vcodec libx264 -crf 23 -preset veryslow -tune "${X264TUNE}" -profile:v high -level 4.1 -acodec ac3 -ab 384k -ac 6 -map_metadata -1 -metadata title="${TITLE}" -metadata:s:a:0 language=eng -map_chapters -1 -sn "${OUTPUT}" # # 1080p x265 dts mkv # "${FFMPEG}" -y -i "${INPUT}" -hide_banner -stats -loglevel quiet ${TEST} -map 0:v:0 -map 0:a:$AUDIO -f matroska -vf scale=1920:-2 -vcodec libx265 -crf 26 -preset slow -x265-params log-level=quiet -acodec dca -ab 1509k -map_metadata -1 -metadata title="${TITLE}" -metadata:s:a:0 language=eng -map_chapters -1 -sn -strict -2 "${OUTPUT}"
Screen Resolutions
'hd480' = 852x480 'hd720' = 1280x720 'hd1080' = 1920x1080 'uhd2160' = 3840x2160
https://ffmpeg.org/ffmpeg-utils.html#Video-size
ffmpeg -s hd720 ...
16:9 aspect ratio resolutions: 640×360, 720x404, 852×480, 1024×576, 1152×648, 1280×720, 1366×768, 1600×900, 1920×1080, 2560×1440 and 3840×2160.
Old, now using scale filter.
Aspect Ratios
16:9 = 1.78:1
Video Track Copy And Encode Multiple Audio Tracks
From this...
Stream #0.0(und): Video: h264, yuv420p, 720x424, 911 kb/s, 25 fps, 25 tbr, 90k tbn, 180k tbc Stream #0.1(eng): Audio: ac3, 48000 Hz, 5.1, fltp, 448 kb/s
To this...
Stream #0.0(und): Video: h264, yuv420p, 720x424, 911 kb/s, 25 fps, 25 tbr, 90k tbn, 180k tbc Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, fltp, 160 kb/s Stream #0.2(eng): Audio: ac3, 48000 Hz, 5.1, fltp, 448 kb/s
Using this...
ffmpeg -i INPUT -map 0:0 -map 0:1 -map 0:1 -codec:0 copy -codec:1 libfdk_aac -b:1 160k -ar:1 48k -ac:1 2 -codec:2 copy OUTPUT
Many thanks - https://forum.handbrake.fr/viewtopic.php?f=10&t=34844&p=163056#p163060
Converting File Formats
ffmpeg -i film.avi -target pal-dvd dvd.mpg
DVD Authoring
Make dvd files without menu in a dvd/ folder...
dvdauthor -o dvd/ -t dvd.mpg
Create the table of contents...
dvdauthor -o dvd/ -T
DVD Burning
Now burn the DVD...
growisofs -Z /dev/dvd -dvd-video dvd/
Blu-ray Copying Transcoding
Usual Routine
Check which track to rip (look for correct duration and chapters)...
makemkvcon --robot --minlength=1000 info disc:0
Make the file...
makemkvcon --minlength=1000 mkv disc:0 0 /tmp/
Transcode the file...
HandBrake bla bla bla
Tricky Disc
If you have a disc that will not complete the 'usual routine' above, then you have to take a backup of the entire disc, get information on the disc, join the correct files together in the correct order, extract specific tracks and then create the mkv file ready for HandBrake or ffmpeg transcoding...
- makemkv disc backup
- makemkv info save to text file
- cat join tracks
- ffmpeg copy specific tracks
- ffmpeg x265
Backup Disc
Create a directory for the disc contents...
mkdir -p ~/Videos/Movie
Backup the entire disc to that directory...
makemkvcon backup disc:0 ~/Videos/Movie
You will end up with the following folders...
|-- BDMV | |-- AUXDATA | |-- BACKUP | | |-- BDJO | | |-- CLIPINF | | |-- JAR | | `-- PLAYLIST | |-- BDJO | |-- CLIPINF | |-- JAR | | |-- 00010 | | |-- 00011 | | |-- 00012 | | |-- 04518 | | |-- 09709 | | |-- 15631 | | `-- 18912 | |-- META | | `-- DL | |-- PLAYLIST | `-- STREAM |-- CERTIFICATE | `-- BACKUP `-- MAKEMKV |-- AACS | `-- DUPLICATE `-- CMAP
Get Information
Find out which tracks are used and what files are used for those tracks...
makemkvcon --robot --minlength=1000 info disc:0 > ~/Videos/Movie/makemkv_info.txt
Join Correct Tracks
Find the correct order for the files for a track...
grep '26,0' ~/Videos/Movie/makemkv_info.txt TINFO:1,26,0,"1,4,9,10,11,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37"
Change to the directory which stores the many video files...
cd ~/Videos/Movie/BDMV/STREAM
Now join the files together (tab is your friend here) using the list order above, into one big M2TS file...
cat 00001.m2ts 00004.m2ts 00009.m2ts ... 00036.m2ts 00037.m2ts > allparts.m2ts
Create MKV File
There will be about 10 tracks in that big file, and we only want 2 - one video track and one audio (preferably DTS) track.
Use ffmpeg to list the tracks...
ffmpeg -i allparts.m2ts Input #0, mpegts, from 'allparts.m2ts': Duration: 02:27:59.44, start: 4198.000000, bitrate: 31651 kb/s Program 1 Stream #0:0[0x1011]: Video: vc1 (Advanced) (VC-1 / 0x312D4356), yuv420p(bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 90k tbn, 47.95 tbc Stream #0:1[0x1100]: Audio: dts (DTS-HD MA) ([134][0][0][0] / 0x0086), 48000 Hz, 5.1(side), s32p (24 bit) Stream #0:2[0x1101]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 640 kb/s Stream #0:3[0x1102]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 640 kb/s Stream #0:4[0x1103]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 640 kb/s Stream #0:5[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090) Stream #0:6[0x1201]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090) Stream #0:7[0x1202]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090), 1920x1080 Stream #0:8[0x1203]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090) Stream #0:9[0x1204]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090) Stream #0:10[0x1205]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090) Stream #0:11[0x1206]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090) Stream #0:12[0x1207]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090) Stream #0:13[0x1208]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090) Stream #0:14[0x1209]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090)
Use ffmpeg's copy track feature to create an MKV file with only 2 tracks.
This command uses the first video track with the first audio track and removes subtitle tracks...
ffmpeg -y -i allparts.m2ts -map 0:v:0 -map 0:a:0 -acodec copy -vcodec copy -sn allparts.mkv
Transcode
1080p X265 DTS MKV...
ffmpeg -y -i "allparts.mkv" -hide_banner -nostats -loglevel quiet -map 0:v:0 -map 0:a:0 -vcodec libx265 -crf 26 -preset slow -acodec dca -b:a 1509k -map_metadata -1 -metadata title="Movie" -metadata:s:a:0 language=eng -map_chapters -1 -sn -strict -2 "Movie.mkv"
720p X264 AC3 MP4...
ffmpeg -y -i "allparts.mkv" -hide_banner -nostats -loglevel quiet -map 0:v:0 -map 0:a:0 -s hd720 -aspect 16:9 -vcodec libx264 -crf 23 -preset veryslow -tune film -profile:v high -level 4.1 -acodec ac3 -ab 384k -ac 6 -map_metadata -1 -metadata title="Movie" -metadata:s:a:0 language=eng -map_chapters -1 -sn "Movie.mp4"
Copy to Plex
cp -av "Movie.mp4" "Movie.mkv" /path/to/Plex/Movies/
Enjoy
Turn the lights down, turn the surround sound up and enjoy your movie in Plex - make sure you choose "Play Version" :-)
Converting From One Format To Another
HVC X265 - https://trac.ffmpeg.org/wiki/Encode/H.265
Test file, 5 minutes long, CFR of 25, audio of DTS surround at 1509 Kbps...
ffmpeg -ss 00:00:00 -t 00:05:00 -i input.mkv -c:v libx265 -crf 25 -c:a dca -b:a 1509k -strict -2 output.mkv
Test file, 5 minutes long, CFR of 28, audio of AC3 surround at 384 Kbps...
ffmpeg -ss 00:00:00 -t 00:05:00 -i input.mkv -c:v libx265 -crf 28 -c:a ac3 -b:a 384k output.mp4
Test file, 5 minutes long, CFR of 22, audio of AAC, 6 channels at 160 Kbps...
ffmpeg -ss 00:00:00 -t 00:05:00 -i input.mkv -c:v libx265 -crf 22 -c:a libfdk_aac -b:a 160k -ac 6 output.mp4
WEBM - https://trac.ffmpeg.org/wiki/Encode/VP8
ffmpeg -i input-file.mp4 -c:v libvpx -crf 10 -b:v 1M -c:a libvorbis output-file.webm
Using HandBrake...
MKV - https://trac.ffmpeg.org/wiki/Encode/H.264
HandBrakeCLI --input input_file.vob --title 1 --markers --encoder x264 --x264-preset veryslow --x264-tune animation --audio 1 --aencoder copy --subtitle 1 --output output_file.mkv
Using ffmpeg...
MKV
ffmpeg -y -i input_file.mkv -s hd720 -f matroska -vcodec libx264 -profile:v main -level 41 -preset veryslow -tune film -crf 22 -threads 0 -b 1152k -metadata title="Movie Title" -metadata:c title="" -metadata:s title="" -acodec ac3 -ab 384k -ac 6 -ar 48000 -sn output_file.mkv
AVI
"/usr/local/bin/ffmpeg" -y -i "input.mkv" -map 0:v:0 -map 0:a:0 -s 852x356 -f avi -vcodec mpeg4 -vtag xvid -b 1152k -mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -acodec aac -ab 128k -ac 2 -ar 44100 -threads 1 -map_metadata -1 -metadata title="Movie Title (YEAR)" -metadata:s:a:0 language=eng -map_chapters -1 -sn "output.avi"
Command line to convert a MKV file to a smaller xVid AVI file, by reducing the video bit rate and audio quality...
ffmpeg -y -i input_file.mkv -s 640x360 -aspect 16:9 -f avi -vcodec mpeg4 -vtag xvid -b 1152k -mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -acodec mp2 -ab 128k -ac 2 -ar 44100 -threads 1 output_file.avi
Command line to convert a large HD (1280x720) video at 1Gb into a smaller 350Mb video...
ffmpeg -y -i input_file.m4v -s 640x360 -aspect 16:9 -f avi -vcodec mpeg4 -qscale 3 -acodec libmp3lame -ab 128k -ac 2 -ar 44100 output_file.avi
Command line to convert a Full HD mkv video at 17Gb into a smaller HD avi video at 2Gb but keeping excellent quality...
ffmpeg -y -i input_file.mkv -s hd720 -f avi -vcodec libx264 -vpre hq -crf 22 -threads 0 -b 1152k -acodec libmp3lame -ab 128k -ac 2 -ar 44100 output_file.avi
Before and after (the 4 hours of re-encoding [on a Quad-Core with 8Gb of RAM])...
-rw-r--r-- 1 paully paully 17G 2010-08-31 22:43 input_file.mkv -rw-r--r-- 1 paully paully 2.1G 2010-09-01 05:12 output_file.avi
Using Mplayer On A DVD To Produce A VOB File
mplayer dvd://1 -dumpstream -dumpfile mydvd.vob
Using Mplayer On An ISO To Produce A VOB File
Extract whole film...
mplayer dvd://1 -dvd-device mydvd.iso -dumpstream -dumpfile mydvd.vob
Extract just one chapter...
mplayer dvd://1 -dvd-device mydvd.iso -chapter 1-1 -dumpstream -dumpfile mydvd-1.vob
Change Metadata In A MKV File
mkvpropedit movie.mkv --edit info --set "title=The movie" --edit track:a1 --set language=fre --edit track:a2 --set language=ita
https://mkvtoolnix.download/doc/mkvpropedit.html#mkvpropedit.examples
Extract and Convert Subtitles
https://github.com/dracostheblack/roku-MKV-ass-to-srt/blob/master/ripsubtitles.sh
Extract The Subtitles From a VOB File
mencoder mydvd.vob -nosound -ovc copy -o /dev/null -vobsubout mydvd -sid 0 -vobsuboutindex 0 -vobsuboutid en
Extract The Subtitles From an MKV File
mkvinfo "movie.mkv" mkvextract tracks "movie.mkv" 6:"movie.eng.srt"
Extract Just The Audio Track From A Video File
This command will jump to a specific point in the video then only get 30 seconds of mp3 audio...
(The -vn helps because it tells ffmpeg to ignore the video stream)
ffmpeg -i input_file.avi -ss 00:03:51 -t 00:00:30 -vn -acodec libmp3lame -ab 128k -ac 2 -ar 44100 output_file.mp3
Convert M4A To MP3
for f in *.m4a; do ffmpeg -i "$f" -acodec libmp3lame -ab 320k "${f%.m4a}.mp3"; done
Convert FLAC To MP3
for f in *.flac; do ffmpeg -i "$f" -acodec libmp3lame -ab 320k "${f%.flac}.mp3"; done
Installing the LATEST Release of ffmpeg in Ubuntu Linux
NEW NOTES
- nasm
- x264
- x265 (Release Notes) MULTILIB (April 2019)
- fdk-aac
- zimg
- lame
- ffmpeg
sudo apt-get remove ffmpeg x264 libx264-dev yasm nasm lame cd ~/Downloads wget https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.gz tar -xzvf nasm-2.15.05.tar.gz cd nasm-2.15.05/ ./configure make sudo make install sudo ldconfig which nasm nasm --version cd ~/Downloads git clone https://code.videolan.org/videolan/x264.git cd x264/ git pull ./configure --enable-shared make sudo make install sudo ldconfig which x264 x264 --version cd ~/Downloads sudo apt-get install cmake cmake-curses-gui git clone https://github.com/videolan/x265.git cd x265/ git pull cd build/linux/ ./multilib.sh cd 8bit/ sudo make install sudo ldconfig which x265 x265 --version x265 [info]: HEVC encoder version 3.2_RC1 x265 [info]: build info [Linux][GCC 5.4.0][64 bit] 8bit+10bit+12bit x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX XOP FMA4 FMA3 BMI1 cd ~/Downloads sudo apt-get install autoconf libtool git clone https://github.com/mstorsjo/fdk-aac.git cd fdk-aac/ git pull ./autogen.sh ./configure make sudo make install sudo ldconfig cd ~/Downloads git clone https://github.com/sekrit-twc/zimg.git cd zimg/ git pull ./autogen.sh ./configure make sudo make install sudo ldconfig cd ~/Downloads wget https://netix.dl.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz tar -xzvf lame-3.100.tar.gz cd lame-3.100/ ./configure make sudo make install sudo ldconfig which lame lame -v cd ~/Downloads sudo apt-get install pkg-config git clone git://git.videolan.org/ffmpeg cd ffmpeg/ git pull ./configure --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-libzimg --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libass --enable-libfontconfig --enable-libfreetype --enable-openssl make clean make sudo make install sudo ldconfig which ffmpeg ffmpeg
OLD NOTES
Uninstall and Install the necessary software...
sudo apt-get remove ffmpeg x264 libx264-dev sudo apt-get update sudo apt-get install build-essential subversion git-core checkinstall yasm texi2html libfaac-dev \ libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libvorbis-dev \ libx11-dev libxfixes-dev libxvidcore-dev zlib1g-dev
Create the necessary new application install directories...
sudo mkdir /usr/local/include sudo mkdir /usr/local/lib/pkgconfig sudo mkdir /usr/local/share/man
Install x264 first...
cd sudo rm -rf x264/ git clone git://git.videolan.org/x264.git cd x264 ./configure --enable-static make sudo checkinstall --pkgname=x264 --pkgversion "svn`date +%Y%m%d`+`git rev-list HEAD -n 1 | head -c 7`" --backup=no --default cd which x264 x264 --version echo x264 hold | sudo dpkg --set-selections
Then install ffmpeg...
cd sudo rm -rf ffmpeg/ git clone git://git.ffmpeg.org/ffmpeg.git ffmpeg cd ffmpeg ./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac \ --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvorbis \ --enable-libx264 --enable-libxvid --enable-x11grab --enable-pthreads make sudo checkinstall --pkgname=ffmpeg --pkgversion "svn`date +%Y%m%d`+`git rev-list HEAD -n 1 | head -c 7`" --backup=no --default cd which ffmpeg ffmpeg echo ffmpeg hold | sudo dpkg --set-selections
HEVC H.265 X265
https://trac.ffmpeg.org/wiki/Encode/H.265
- Choose a CRF. The default is 28, and it should visually correspond to libx264 video at CRF 23, but result in about half the file size. Other than that, CRF works just like in x264.
- Choose a preset. The default is medium. The preset determines how fast the encoding process will be – at the expense of compression efficiency. Put differently, if you choose ultrafast, the encoding process is going to run fast, but the file size will be larger when compared to medium. The visual quality will be the same. Valid presets are ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow and placebo.
- Choose a tune. By default, this is disabled, and it is generally not required to set a tune option. x265 supports the following -tune options: psnr, ssim, grain, zerolatency, fastdecode. They are rexplained in the H.264 guide.
Example #1 X265: First chapter (3 minutes) of the Wall-E Blu-ray, 1080p MKV to 1080p MP4 with CRF 25, FDK AAC Surround Sound, edited Metadata and NO chapter markers...
ffmpeg -ss 00:00:00 -t 00:03:36 -i "input.mkv" -c:v libx265 -crf 25 -c:a libfdk_aac -b:a 384k -ac 6 -map_metadata -1 -metadata title="Wall-E (2008)" -map_chapters -1 "output.mp4" FILE SIZE = 40Mb
Example #2 X264: For size comparison...
ffmpeg -ss 00:00:00 -t 00:03:36 -i "input.mkv" -c:v libx264 -crf 22 -c:a libfdk_aac -b:a 384k -ac 6 -map_metadata -1 -metadata title="Wall-E (2008)" -map_chapters -1 "output.mp4" FILE SIZE = 80Mb
Quiet Output
-hide_banner -nostats -loglevel quiet
Verbose Media Information
ffprobe -v quiet -print_format json -show_format -show_streams movie.mp4
Rename Chapter Titles
Export the current metadata...
ffmpeg -i input.mkv -f ffmetadata metadata.txt
It will look like this...
;FFMETADATA1 title=Rush - Clockwork Angels Deluxe encoder=Lavf58.26.101 [CHAPTER] TIMEBASE=1/1000000000 START=0 END=435201433333 title=Chapter 01 [CHAPTER] TIMEBASE=1/1000000000 START=435201433333 END=779044933333 title=Chapter 02
Edit the file...
nano metadata.txt
;FFMETADATA1 title=Rush - Clockwork Angels Tour (2013) encoder=Lavf58.26.101 [CHAPTER] TIMEBASE=1/1000000000 START=0 END=435201433333 title=Subdivisions [CHAPTER] TIMEBASE=1/1000000000 START=435201433333 END=779044933333 title=The Big Money
Import the edited metadata file...
ffmpeg -i input.mkv -i metadata.txt -map_metadata 1 -codec copy output.mkv
http://ffmpeg.org/ffmpeg-formats.html#Metadata-1
Remove Chapter Markers
-map_chapters -1
Thanks - https://video.stackexchange.com/questions/20270/ffmpeg-delete-chapters#20324
Add Subtitles
Hardsub
The subtitles video filter can be used to hardsub, or burn-in, the subtitles. This requires re-encoding and the subtitles become part of the video itself.
Softsub
These are additional streams within the file. The player simply renders them upon playback. More flexible than hardsubbing because:
- You do not need to re-encode the video.
- You can have multiple subtitles (various languages) and switch between them.
- You can toggle them on/off during playback.
- They can be resized with any player worth using.
- Of course sometimes hardsubs are needed if the device or player is unable to utilize softsubs.
To mux subtitles into a video file using stream copy mode:
ffmpeg -i input.mkv -i subtitles.srt -codec copy -map 0 -map 1 output.mkv
Nothing is re-encoded, so the whole process will be quick and the quality and formats will be preserved.
Using SubStation Alpha (ASS) subtitles will allow you to format the subtitles however you like.
Info
https://stackoverflow.com/questions/8672809/use-ffmpeg-to-add-text-subtitles#17584272
https://en.wikibooks.org/wiki/FFMPEG_An_Intermediate_Guide/subtitle_options
Remove Subtitles
-sn
Copy Subtitle Track
-map 0:s:0 -scodec copy
Set Audio Metadata Language
AVI
Include both the 'IAS1' tag and the 'title' tag...
-metadata IAS1=eng -metadata:s:a:0 title="English"
Thanks - https://superuser.com/questions/783895/ffmpeg-edit-avi-metadata-and-audio-track-naming
MP4
-metadata:s:a:0 language=eng
MKV
-metadata:s:a:0 language=eng
Set Subtitle Metadata Language
-metadata:s:s:0 language=eng
https://en.wikibooks.org/wiki/FFMPEG_An_Intermediate_Guide/subtitle_options#Set_Subtitle_Language
Set Subtitle Forced Flag
-disposition:s:s:0 forced
https://stackoverflow.com/questions/26956762/ffmpeg-set-subtitles-track-as-default
Set Movie Title
-metadata title="Movie Name (YEAR)"
Allow DTS
-acodec dca -strict -2 "/path/to/output.mkv"
Cropping The Black Bars
You would not believe the lack of SIMPLE, clear documentation with _examples_ on the internet for this!
It took me over 2 hours of mucking around to get this right...
Basically, you resize your picture, crop from the top, and then state your finished picture size.
The magic formula was scaled height - cropped height divided by 2 e.g. 720 - 544 / 2 = 88
It makes perfect sense now, but why has no-one provided examples for dummies by now?!
ffmpeg -y -i input_file.mkv -s 1280X720 -vf crop=0:88:1280:544 -f avi -vcodec libx264 -vpre hq \ -crf 22 -threads 0 -b 1152k -acodec libmp3lame -ab 128k -ac 2 -ar 44100 output_file.avi
-s the scaled picture size to start cropping -vf the video filter to use crop=pixels_from_left:pixels_from_top:final_picture_width:final_picture_height
xVid Compatible AVI
ffmpeg -y -i Title_S01E09.vob -f avi -vcodec mpeg4 -vtag xvid -b 1152k -mbd rd -flags +mv4+aic \ -trellis 2 -cmp 2 -subcmp 2 -g 300 -acodec libmp3lame -ab 128k Title_S01E09.avi
ffmpeg: How To Strip Metadata
-map_metadata -1
ffmpeg -i input.mkv -map_metadata -1 -vcodec copy -acodec copy output.mkv
ffmpeg: How To Add Metadata
MKV
This will copy both video and audio tracks, plus keep existing metadata but add the audio track language as English (eng)...
ffmpeg -i input.mkv -c copy -map_metadata 0 -metadata:s:a:0 language=eng output.mkv
MP4
-map_metadata -1 -metadata title="Movie Name" -metadata:s:a:0 language=eng
AVI
Set language code to 'English'...
ffmpeg -i input.mkv -c copy -map_metadata -1 -metadata IAS1=eng -metadata:s:a:0 title="English" output.avi
Android and Playstation 3 Compatible MP4
The Sony Playstation 3 is fussy about what video files it can play.
- Container: MP4
- Video: H264 AVC Profile Main Level 3.1
- Audio: AAC
nice -19 ffmpeg -y -i ~/Videos/Film/Film.mkv -map_metadata -1 -s 960x540 -f mp4 -vcodec libx264 -profile:v main -level 31 -preset veryslow -tune film -crf 22 -threads 0 -b 1152k -metadata title="Film" -acodec libvo_aacenc -ab 160k -ac 2 -ar 44100 ~/Videos/Film/Film.mp4
Android Compatible AVI
Don't use this, use the MP4 above.
This will create an .avi movie file suitable for playing with MX Player on HD Android devices.
Example #1 - film, medium speed
ffmpeg -y -i ~/Videos/Film/Film.mkv -s hd720 -f avi -vcodec libx264 -preset medium -tune film -crf 22 -threads 0 -b 1152k -acodec libmp3lame -ab 128k -ac 2 -ar 44100 ~/Videos/Film/Film.avi
Example #2 - animation, slower, clearing stream metadata, forcing profile main and level 3.1
ffmpeg -y -i ~/Videos/Film/Film.mkv -s hd720 -f avi -vcodec libx264 -profile:v main -level 31 -preset slower -tune animation -crf 22 -threads 0 -b 1152k -metadata:s title="" -acodec libmp3lame -ab 128k -ac 2 -ar 44100 ~/Videos/Film/Film.avi
Example #3 - film, very slow, profile main, level 3.1, setting and clearing metadata, plus nice value
nice -19 ffmpeg -y -i ~/Videos/Film/Film.mkv -s hd720 -f avi -vcodec libx264 -profile:v main -level 31 -preset veryslow -tune film -crf 22 -threads 0 -b 1152k -metadata title="Film" -metadata:c title="" -metadata:s title="" -acodec libmp3lame -ab 128k -ac 2 -ar 44100 ~/Videos/Film/Film.avi
ALSO - you can use cpulimit to stop frying your processor when transcoding...
sudo cpulimit -b -e ffmpeg -l 80
Why do this? You do this because the slower it takes, the better the result. You also finish with a smaller sized file!
If you do this correctly, a 32Gb FullHD MKV movie can come right down to 1Gb.
** This will take about 12 hours so leave it running overnight :-) **
You can read more about the x264 settings here:-
http://mewiki.project357.com/wiki/X264_Settings
x264 Presets
These are the new main x264 presets. In a nutshell, the slower the encoding produces a better quality and smaller size file.
- ultrafast
- superfast
- veryfast
- faster
- fast
- medium (32 fps)
- slow (16 fps)
- slower (8 fps)
- veryslow (4 fps)
- placebo (2 fps)
** UPDATE - Thursday, May 5 2016 **
http://dev.beandog.org/x264_preset_reference.html
** UPDATE - Monday, April 25 2011 **
You call the x264 presets with ffpmpeg differently now.
(OLD METHOD) -vcodec libx264 -vpre veryslow (NEW METHOD) -vcodec libx264 -preset veryslow -tune film
Here's a list of the preset settings in x264...
ultrafast: cabac=0 / ref=1 / deblock=0:0:0 / analyse=0:0 / me=dia / subme=0 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=0 / me_range=16 / chroma_me=1 / trellis=0 / 8x8dct=0 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=0 / threads=6 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=0 / weightp=0 / keyint=250 / keyint_min=23 / scenecut=0 / intra_refresh=0 / rc=crf / mbtree=0 / crf=16.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=0 superfast: cabac=1 / ref=1 / deblock=1:0:0 / analyse=0x3:0x3 / me=dia / subme=1 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=0 / me_range=16 / chroma_me=1 / trellis=0 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=0 / threads=6 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=1 / keyint=250 / keyint_min=23 / scenecut=40 / intra_refresh=0 / rc=crf / mbtree=0 / crf=16.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / pb_ratio=1.30 / aq=1:1.00 veryfast: cabac=1 / ref=1 / deblock=1:0:0 / analyse=0x3:0x113 / me=hex / subme=2 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=0 / me_range=16 / chroma_me=1 / trellis=0 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=0 / threads=6 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=1 / keyint=250 / keyint_min=23 / scenecut=40 / intra_refresh=0 / rc_lookahead=10 / rc=crf / mbtree=1 / crf=16.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00 faster: cabac=1 / ref=2 / deblock=1:0:0 / analyse=0x3:0x113 / me=hex / subme=4 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=0 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=0 / threads=6 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=1 / keyint=250 / keyint_min=23 / scenecut=40 / intra_refresh=0 / rc_lookahead=20 / rc=crf / mbtree=1 / crf=16.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00 fast: cabac=1 / ref=2 / deblock=1:0:0 / analyse=0x3:0x113 / me=hex / subme=6 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=6 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=1 / keyint=250 / keyint_min=23 / scenecut=40 / intra_refresh=0 / rc_lookahead=30 / rc=crf / mbtree=1 / crf=16.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00 medium: cabac=1 / ref=3 / deblock=1:0:0 / analyse=0x3:0x113 / me=hex / subme=7 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=6 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=23 / scenecut=40 / intra_refresh=0 / rc_lookahead=40 / rc=crf / mbtree=1 / crf=16.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00 slow: cabac=1 / ref=5 / deblock=1:0:0 / analyse=0x3:0x113 / me=umh / subme=8 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=6 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=23 / scenecut=40 / intra_refresh=0 / rc_lookahead=50 / rc=crf / mbtree=1 / crf=16.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00 veryslow: cabac=1 / ref=16 / deblock=1:0:0 / analyse=0x3:0x133 / me=umh / subme=10 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=24 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=6 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=8 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=23 / scenecut=40 / intra_refresh=0 / rc_lookahead=60 / rc=crf / mbtree=1 / crf=16.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00 placebo: cabac=1 / ref=16 / deblock=1:0:0 / analyse=0x3:0x133 / me=tesa / subme=11 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=24 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=0 / chroma_qp_offset=-2 / threads=6 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=16 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=23 / scenecut=40 / intra_refresh=0 / rc_lookahead=60 / rc=crf / mbtree=1 / crf=16.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00
MythTV To AVI Script
Transcode a MythTV recording into an xvid .avi with the title and subtitle as filename.
Put this in /usr/local/bin/ and create a new MythTV User Job called 'Export to AVI' with the command input line:
myththto.sh %FILE%
Latest version: 2012-08-11: http://wiki.indie-it.com/images/5/5f/Mythtvto.sh
MKV To AVI Script
#!/bin/bash # # mkvtoavi.sh # # Description: convert a really big Full HD Matroska video file into a much smaller Standard HD Audio Video Interleave file. # # Details: Conversion will take 4 x length of movie using the X264 codec at 'veryslow' preset. # For an average movie this will mean about 8 hours - so leave it running overnight! # # Usage: ./mkvtoavi.sh input.file output.file # INPUTFILE="$1" X264PRESET="veryslow" # (superfast,veryfast,faster,fast,medium,slow,slower,veryslow,placebo) OUTPUTFILE="$2" if [ ! $# == 2 ] then echo "Usage: ./mkvtoavi.sh input.file output.file" else time ffmpeg -y -i "$INPUTFILE" -s hd720 -f avi -vcodec libx264 -preset "$X264PRESET" -crf 22 -threads 0 -b 1152k -acodec libmp3lame -ab 128k -ac 2 -ar 44100 "$OUTPUTFILE" fi
FFHEVC and FFX264
Wow, a really impressive script for doing HDR to SDR conversion... the blackest of black arts.
If this works, I'll eat my hat...
UPDATE - yeah, it worked. Hat eaten :-)
https://ffhevc.sourceforge.io/
https://forum.doom9.org/showthread.php?t=172558
https://ffx264.sourceforge.io/
https://forum.doom9.org/showthread.php?t=172558
Mencoder
UPDATE: 2013-05-16
Check the correct tile track of a DVD...
lsdvd
Two pass encode with target size of 700Mb...
mencoder dvd://1 -alang en -vobsub 999 -ovc xvid -oac mp3lame -lameopts cbr:br=128 -xvidencopts pass=1 -o /dev/null mencoder dvd://1 -alang en -vobsub 999 -ovc xvid -oac mp3lame -lameopts cbr:br=128 -xvidencopts pass=2:bitrate=-700000 -o output.avi
Two pass encode with black bar cropping of a 2.35:1 Widescreen UK PAL 720x576 picture and fixed bitrate for smaller final size...
mplayer dvd://1 -chapter 3 -vf cropdetect mencoder dvd://1 -vf crop=720:416:0:80,scale=640:256 -ovc xvid -xvidencopts bvhq=1:chroma_opt:quant_type=mpeg:bitrate=658:pass=1 -oac copy -o /dev/null mencoder dvd://1 -vf crop=720:416:0:80,scale=640:256 -ovc xvid -xvidencopts bvhq=1:chroma_opt:quant_type=mpeg:bitrate=658:pass=2 -alang en -oac mp3lame -lameopts br=96:cbr:vol=6 -o output.avi
Same, but for a 16:9 Widescreen UK PAL 720x576 picture...
mencoder dvd://1 -alang en -vf crop=720:410:0:80,scale=720:400 -vobsub 999 -ovc xvid -oac mp3lame -lameopts cbr:br=96:vol=6 -xvidencopts bvhq=1:chroma_opt:quant_type=mpeg:bitrate=658:pass=1 -o /dev/null mencoder dvd://1 -alang en -vf crop=720:410:0:80,scale=720:400 -vobsub 999 -ovc xvid -oac mp3lame -lameopts cbr:br=96:vol=6 -xvidencopts bvhq=1:chroma_opt:quant_type=mpeg:bitrate=658:pass=2 -o output.avi
Same, but for a 4:3 Standard Definition UK PAL picture...
mencoder dvd://1 -alang en -vf crop=688:560:18:8,scale=640:480 -vobsub 999 -ovc xvid -oac mp3lame -lameopts cbr:br=96:vol=6 -xvidencopts bvhq=1:chroma_opt:quant_type=mpeg:bitrate=658:pass=1 -o /dev/null mencoder dvd://1 -alang en -vf crop=688:560:18:8,scale=640:480 -vobsub 999 -ovc xvid -oac mp3lame -lameopts cbr:br=96:vol=6 -xvidencopts bvhq=1:chroma_opt:quant_type=mpeg:bitrate=658:pass=2 -o output.avi
http://ubuntuguide.org/wiki/Video_Conversion
http://www.axllent.org/docs/video/mencoder-dvd-to-mpeg4
Transcode
Example #1
Create an XviD .avi video of the 5th chapter of the 3rd title of a DVD ISO file, reducing the picture size to 640x360, whilst keeping the 16:9 aspect ratio...
transcode -i ~/Videos/Being_Human_S01D01.iso -T 3,5 -Z 640x360 -y xvid4,tcaud -o ~/Videos/Being_Human_S01E01-5.avi
-i = input filename. -T = title and chapter. -Z = resize video. -y = output format. -o = output filename.
Example #2
Create an XviD .avi video of a MythTV recording, using mplayer to probe for video and audio types, just use the first 2 streams for video and audio, reducing the picture size to 640x360, whilst keeping the 16:9 aspect ratio...
transcode -q 0 -i 7335_20110329090000.mpg --mplayer_probe -S 0,0-1 -Z 640x360 -y xvid4,tcaud -o /var/lib/mythtv/exports/test.avi
-q = debug level - quiet. --mplayer_probe = use mplayer. -S = stream and channel(s). -i = input filename. -T = title and chapter. -Z = resize video. -y = output format. -o = output filename.
Troubleshooting
Error...
[export_xvid4.so] warning: Usage of this module for audio encoding is deprecated. [export_xvid4.so] warning: Consider switch to export_tcaud module.
Fix...
-y xvid4,tcaud
Full example...
trancode - i /dev/dvd -y xvid4,tcaud -o /path/to/filename.avi
ffmpeg Audio Channel Layouts
-channel_layout
7.1: Front: L C R, Surround: L R, Back: L R, LFE 6.1: Front: L C R, Surround: L R, Back: C, LFE 5.1: Front: L C R, Surround: L R, LFE
layout_map[] = { { 1, CHANNEL_LAYOUT_MONO , "mono" }, { 2, CHANNEL_LAYOUT_STEREO , "stereo" }, { 4, CHANNEL_LAYOUT_QUAD , "quad" }, { 6, CHANNEL_LAYOUT_5POINT1 , "5.1" }, { 8, CHANNEL_LAYOUT_5POINT1|CHANNEL_LAYOUT_STEREO_DOWNMIX, "5.1+downmix" }, { 8, CHANNEL_LAYOUT_7POINT1 , "7.1" }, { 8, CHANNEL_LAYOUT_7POINT1_WIDE , "7.1(wide)" }, { 10, CHANNEL_LAYOUT_7POINT1|CHANNEL_LAYOUT_STEREO_DOWNMIX, "7.1+downmix" }, { 0 }
Downconvert 7.1 DTS-HD to DTS 5.1:-
ffmpeg -i in.mkv -strict -2 -map 0:a:0 -c dts -af "channelmap=channel_layout=5.1" dts.mkv
Downconvert 7.1 DTS-HD to AC3 5.1:-
ffmpeg -i in.mkv -map 0:a:0 -c ac3 -ac 6 -ab 640k ac3.mkv
Add downconverted audio streams via ffmpeg:-
ffmpeg -i in.mkv -i dts.mkv -i ac3.mkv -map 0:v -c:v copy -map 0:a -c:a copy -map 1:a -c:a copy -map 2:a -c:a copy -map 0:s -c:s copy out.mkv
Set Language For Tracks In MKV
For a single audio track file, setting the language to English ...
mkvpropedit movie.mkv --edit track:a1 --set language=eng
For a multiple audio tracks file, setting the language to French and Italian ...
mkvpropedit movie.mkv --edit track:a1 --set language=fre --edit track:a2 --set language=ita
Set Movie Name In MKV
mkvpropedit movie.mkv --edit info --set "title=The movie"
Set Default Subtitles In MKV
Set for 1 track...
mkvpropedit movie.mkv --edit track:s1 --set flag-default=1
Remove from 1 track and set it for another track...
mkvpropedit movie.mkv --edit track:s1 --set flag-default=0 --edit track:s2 --set flag-default=1
Rename Chapters
Make your chapters text file...
CHAPTER01=00:00:00.000 CHAPTER01NAME=So What CHAPTER02=00:05:34.360 CHAPTER02NAME=Creeping Death CHAPTER03=00:12:24.120 CHAPTER03NAME=Sad But True
Then run this command to remove the existing chapters and add the new chapters into a second new movie file...
mkvmerge --no-chapters --chapters chapters.txt -o output.mkv input.mkv
Join MKV Files Together
sudo apt-get install mkvtoolnix mkvmerge -o output.mkv input1.mkv +input2.mkv
Join MP4 Files Together
METHOD A
cat mylist.txt file '/path/to/file1' file '/path/to/file2' file '/path/to/file3' ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4
https://stackoverflow.com/questions/7333232/how-to-concatenate-two-mp4-files-using-ffmpeg
METHOD B
Install GPAC first, easily from ubuntu repository:
sudo apt-get install gpac
Then using one of GPAC's tool, named MP4Box, we can join or merge multiple mp4 files by concatenating into one file. With concatenating we save a huge amount of processing time which is usually spent for rendering/re-encoding.
MP4Box -cat file1.mp4 -cat file2.mp4 -cat file3.mp4 OutputFile.mp4
HOWTO: FIX: Error: Too many packets buffered for output stream 0:1 Conversion Failed
This will occur when you are trying to transcode 4K UHD Blu-ray rips with Dolby Atmos 7.1 audio.
The fix is to add a parameter to limit the amount of data read in one go...
-max_muxing_queue_size 1024
Add this to the end of the VIDEO options...
"/usr/local/bin/ffmpeg" -y -i "Movie Name (YEAR) UHD.mkv" -hide_banner -stats -loglevel quiet -t 00:05:00 -map 0:v:0 -map 0:a:0 -s uhd2160 -aspect 16:9 -vcodec libx265 -crf 26 -preset slow -max_muxing_queue_size 1024 -acodec copy -map_metadata -1 -metadata title="Movie Name (YEAR)" -metadata:s:a:0 language=eng -map_chapters -1 -sn "output_4K.mkv"
HOWTO: FIX: ERROR: ffmpeg: libmp3lame not found
sudo apt-get install libavcodec-extra-53
HOWTO: FIX: Incorrect Channel Number When Transcoding Downmix From TrueHD to DTS
With the latest version 6 of ffmpeg, if you don't specify the channel layout, when you transcode downmix from Dolby TrueHD 8 channel (7.1) to DTS 5.1 it will leave off the LFE channel so only give you 5.0 channel mix. To fix this, add the following audio filter option ...
-acodec dca -ab 1509k -af channelmap=channel_layout=5.1
https://gist.github.com/thielemans/73968c4eecee620d9c3dcb4c3442d8ef
HOWTO: Install Latest ffmpeg In Ubuntu Linux
Ubuntu seems to be straying behind again, and the latest Ubuntu build is version 9.
However, the libav developers are up to version 11 now.
This is the latest daily build for Ubuntu. Things may break, but they might not. So, you'll be fine.
It will give you version 12. Which means that youtube-dl won't complain anymore :)
sudo add-apt-repository ppa:motumedia/libav-daily sudo aptitude update sudo aptitude -y safe-upgrade which ffmpeg ffmpeg -version
Now you need to move the old FFMPEG out of the way, and make it a symlink to the new ffmpeg.
sudo mv /usr/bin/ffmpeg /usr/bin/ffmpeg.old sudo ln -s /usr/bin/ffmpeg /usr/bin/ffmpeg
Thanks - https://launchpad.net/~motumedia/+archive/ubuntu/libav-daily
HOWTO: Screenshots
NEW
ffmpeg -ss 00:23:00 -i Mononoke.Hime.mkv -frames:v 1 out1.jpg
OLD
ffmpeg -ss 1 -i <input_filename>.ts -f image2 -vf "select='eq(pict_type,I)'" -vframes 1 -vsync 2 <output_filename>.png