====== FFmpeg ====== ==== Installation using brew ==== - ''brew tap varenc/ffmpeg'' - ''brew install varenc/ffmpeg/ffmpeg --with-fdk-aac'' ==== x265 conversion ==== ^ Command ^ Effect ^ ^ Conversion to Apple-compatible H265 ^ | Convert non-H265 with existing AAC audio | ''for i in //*.mp4//;ffmpeg -i $i -c:v libx265 -crf 28 -preset veryfast -vtag hvc1 -movflags faststart -c:a copy ${i/.mp4}.x265.mp4'' | | Convert non-H265 without existing AAC audio | ''for i in //*.mp4//;ffmpeg -i $i -c:v libx265 -crf 28 -preset veryfast -vtag hvc1 -movflags faststart -c:a aac -b:a 128k ${i/.mp4}.x265.mp4'' | | Convert H265 MKV without existing AAC audio | ''for i in //*.mkv//;ffmpeg -i $i -vcodec copy -c:a aac -b:a 128k -pix_fmt yuv420p -tag:v hvc1 -movflags faststart ${i/.mkv}.mp4'' | | Convert hev1 tag to hvc1 | ''for i in //*.x265.mp4//;ffmpeg -i $i -c copy -map 0 -vtag hvc1 -movflags faststart -c:a copy ${i/.mp4}.hvc1.mp4'' | ==== Trimming ==== ''ffmpeg -i input.mp4 -ss 00:02:39 -to 00:03:05 -c:v copy -c:a copy output.mp4'' ==== Splitting into parts ==== ''for i in 0 30 60 90 120 150 180 210 240 270 300;ffmpeg -i dragon4.mix\ -\ Amateur\ Teikyou\ CD-ROM\ \(Japan\)\ \(NEC\ PC-FXGA\)-pBJu9J-Jw98.mp4 -ss $i -t 30 dragon_$i.mp4'' ==== Join audio and video tracks ==== ''ffmpeg -i video.mp4 -i audio.m4a -c copy output.mp4'' ==== Joining multiple videos into one ==== ''ffmpeg -i "concat:input1.mp4|input2.mp4|input3.mp4|input4.mp4" -c copy output.mp4'' ==== Remux MKV to MP4 including all streams ==== ''ffmpeg -i $i -codec copy -map 0 ${i/.mkv}.mp4'' ==== Export all audio tracks from input video files ==== - Check which tracks are present and which IDs they have. \\ ''ffprobe -v error -show_entries stream=index,codec_name,codec_type input.mkv'' - For the main conversion command, note that the first audio track in the source file is 0:a:0, the second is 0:a:1, etc. Here is an example for a batch one-line: \\ ''exportdir=/yoko/share/export; for i in *.mp4;ffmpeg -i $i -map 0:a:0 -c copy $exportdir/${i/mp4}deutsch.m4a -map 0:a:1 -c copy $exportdir/${i/mp4}english.m4a'' ==== MP4 Fast Start ==== === Check if MOOV atom is at the beginning of the file === ''ffmpeg -v trace -i file.mp4 2>&1 | grep -e type:'mdat' -e type:'moov''' [mov,mp4,m4a,3gp,3g2,mj2 @ 0x5576c36880] type:'moov' parent:'root' sz: 9919011 40 1603822784 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x5576c36880] type:'mdat' parent:'root' sz: 1593903733 9919059 1603822784 === Enable Fast Start/move MOOV atom to beginning of file === ''ffmpeg -i original.mp4 -movflags faststart -c copy new.mp4'' ===== Subtitles ===== ==== Shifting subtitle timestamps ==== ffmpeg -itsoffset 23.5 -i input.srt -c copy output.srt === Batch processing === for i in *.srt;do ffmpeg -itsoffset 23.5 -i $i -c copy ${i/srt/shifted.srt};done ===== Various utilities ===== ==== lsmedia.zsh ==== lsmedia () { ls -1rt $@ | while read -r line do echo \"$line\" mediainfo --Inform="Video;%CodecID%" $line mediainfo --Inform="Audio;%CodecID%" $line done | sed 'N;N;s/\n/\; /g' | column -t -s ";" } == lsmedia Examples == ^ Command ^ Result ^ | ''lsmedia *.MOV'' | "MVI_9797.MOV" avc1 sowt "MVI_9798.MOV" avc1 sowt "MVI_9799.MOV" avc1 sowt "MVI_9800.MOV" avc1 sowt "MVI_9801.MOV" avc1 sowt | | ''lsmedia *.MOV | sed %%'%%s/\"\ \ .*$/\"/%%'%%'' | "MVI_9797.MOV" "MVI_9798.MOV" "MVI_9799.MOV" "MVI_9800.MOV" "MVI_9801.MOV" |