FFmpeg Aufbaukurs, 13. März 2025 Cours avancé de FFmpeg, 14 mars 2025 AV Preservation by reto.ch und Ødegård & Bernard Restaurierung Klg Reto Kromer, Kamilla Ødegård, Eléonore Bernard COMMANDS CLI BASICS ---------- # set the working space # # on Linux/Mac/Windows Terminal or WSL/Windows locally cd Desktop # on Windows on OneDrive Cloud cd OneDrive If not working in the specific folder, the whole path of the file has to be inserted in the command! This is useful, if you do not want to save the output file in the same folder as the input file. FFMPEG HELP ----------- ffmpeg -h ffmpeg -codecs ffmpeg -decoders ffmpeg -h decoder=aac ffmpeg -encoders ffmpeg -h encoder=libx264 ffmpeg -filters ffmpeg -pix_fmts CASE STUDY - CUT COMMANDS ------------------------- # Cut command without reencoding ffmpeg -i input_file -ss hh:mm:ss -to hh:mm:ss -c:v copy -c:a copy output_file # Cut command with reencoding of MKV/ffv1 ffmpeg -accurate_seek -i input_file.mkv -ss hh:mm:ss -to hh:mm:ss -c:v ffv1 -level 3 -coder 1 -context 1 -g 1 -slices 24 -slicecrc 1 -c:a pcm_s16le output_file.mkv # Cut command with reencoding of MP4/H.264 ffmpeg -accurate_seek -i input_file.mp4 -ss hh:mm:ss -to hh:mm:ss -c:v libx264 -preset veryslow -crf 18 -pix_fmt yuv420p -c:a aac output_file.mp4 QUALITY CONTROL --------------- # Generate MD5 checksums # On Mac: md5 input_file # On Windows: certutil -hashfile input_file MD5 # generate checksums at frame level ffmpeg -i input_file -f framemd5 output_file_framemd5.txt # compare checksum files # # on Linux/Mac/Windows Terminal or WSL diff -s mandelbrot_avi_framemd5.txt mandelbrot_mov_framemd5.txt # on Windows fc mandelbrot_avi_framemd5.txt mandelbrot_mov_framemd5.txt --> can also be used for other Exports and Textfiles # FFprobe ffprobe [input_options] input_file ffprobe -show_format -show_streams -print_format json input_file.avi > input_file.txt # MediaInfo mediainfo file.ext mediainfo —Details=1 file.ext mediainfo —Output=JSON file.ext # Splitscreen ffmpeg -i input_file_1 -i input_file_2 -filter_complex "[0] crop=iw/2:ih:0:0 [left]; [1] crop=iw/2:ih:iw/2:0 [right]; [left][right] hstack [out]" -map "[out]" output_file # Differenzsignal ffmpeg -i input_file_1 -i input_file_2 -filter_complex "[1] format=yuva444p, lut=c3=128, negate [1_with_alpha]; [0][1_with_alpha] overlay [out]“ -map „[out]" output_file DVD files: merge and transcode to MP4 ------------------------------------- # Transcode several VOB files to one MPEG file (not deinterlaced file): ffmpeg -i "concat:VTS_01_1.VOB|VTS_01_2.VOB|VTS_01_3.VOB|VTS_01_4.VOB|VTS_01_5.VOB" -c:v copy -c:a copy concat.VOB # Transcode several VOB files to one MP4: ffmpeg -i "concat:VTS_01_1.VOB|VTS_01_2.VOB|VTS_01_3.VOB" -b:v 1500k -r 30 -vcodec h264 -strict -2 -acodec aac -ar 44100 -f mp4 output_file.mp4 ffmpeg -i "concat:input_file_1|input_file_2|input_file_3" -c:v libx264 -c:a aac output_file.mp4 # all Audio und Video channels berücksichtigen: ffmpeg -i "concat:input_file_1|input_file_2" -map 0:v -map 0:a -c:v libx264 -c:a aac output_file.mp4 # Source: https://amiaopensource.github.io/ffmprovisr/#dvd_to_file # includes deinterlacing SD: ffmpeg -i concat:VTS_02_1.VOB\|VTS_03_1.VOB\|VTS_04_1.VOB -filter:v "idet, bwdif, scale=1440:1080:flags=lanczos" -c:v libx264 -c:a aac output_H264.mp4 # includes deinterlacing und SD -> HD: ffmpeg -i concat:VTS_01_1.VOB\|VTS_01_2.VOB\|VTS_01_3.VOB -filter:v "idet, bwdif, scale=1440:1080:flags=lanczos, pad=1920:1080:240:0“ -c:v libx264 -c:a aac output_H264.mp4 DPX to MKV ---------- # for single images ffmpeg -f image2 -framerate 24 -i input_file_%08d.dpx -c:v ffy1 -level 3 -threads 8 -coder 1 -context 1 -g 1 -slices 24 -slicerc 1 -start_number 00086400 -c:a copy output_file.mkv # for image stream / video ffmpeg -i input_file.mxf -c:v ffv1 -level 3 -threads 8 -coder 1 -context 1 -g 1 -slices 24 -slicecrc 1 -c:a copy output_file.mkv # for single images to MP4 ffmpeg -f image2 -framerate 24 -i input_file_%06d.extension -c:v libx264 -preset veryslow -crf 18 -pix_fmt yuv420p output_file ProRes to viewing copy ---------------------- ffmpeg -i inputfile.mov -pix_fmt yuv420p -c:v libx264 -preset veryslow -crf 30 -movflags +faststart+write_colr outputfile_ProRes_H264.mp4 # source: https://avpres.net/FFmpeg/im_H264.html Uncompressed to viewing copy ---------------------------- ffmpeg -i input_file.MOV -c:v libx264 -preset veryslow -crf 18 -pix_fmt yuv420p -c:a aac output_file.MP4 # deinterlacing ffmpeg -i input_file -c:v libx264 -pix_fmt yuv420p -filter:v "idet, bwdif" output_file.MP4 # OR ffmpeg -i input_file -c:v libx264 -preset veryslow -crf 18 -pix_fmt yuv420p -c:a aac -filter:v "idet, bwdif" output_file.MP4 # 4:3 in 16:9 mit Pillarbox ffmpeg -i input_file -c:v libx264 -filter:v "yadif, scale=1440:1080:flags=lanczos, pad=1920:1080:(ow-iw)/2:(oh-ih)/2, format=yuv420p" output_file Changing Scan mode ------------------ # deinterlacing ffmpeg -i input_file -c:v libx264 -pix_fmt yuv420p -filter:v "idet, bwdif" output_file # deinterlacing (with another type of argument) ffmpeg -i input_file -c:v libx264 -vf "yadif,format=yuv420p" output_file Changing Color space -------------------- # change colormatrix: ffmpeg -i input_file -c:v libx264 -vf colormatrix=src:dst output_file # example change Rec. 601 (used for SD) to Rec. 709 (used for HD): ffmpeg -i input_file -c:v libx264 -vf colormatrix=bt601:bt709 output_file # Color space for PAL: ffmpeg -i input_file -c:v libx264 -color_primaries bt470bg -color_trc bt709 -colorspace bt470bg output_file # Color space for NTSC: ffmpeg -i input_file -c:v libx264 -color_primaries smpte170m -color_trc bt709 -colorspace smpte170m output_file Changing image resolution ------------------------- # SD ➔ HD with Pillarbox (https://avpres.net/FFmpeg/SD_HD.html) ffmpeg -i input_file -filter:v "pad=ih*16/9:ih:(ow-iw)/2:(oh-ih)/2" -c:a copy output_file ffmpeg -i input_file -filter:v "scale=1440:1080:flags=lanczos, pad=1920:1080:240:0" -c:a copy output_file # Display Aspect Ratio ändern ffmpeg -i input_file -c:a copy -c:v copy -aspect 4:3 output_file Adding to video: Watermark, Timecode, Logo, Credits --------------------------------------------------- # https://amiaopensource.github.io/ffmprovisr/#text_watermark # show which fonts are installed # # on macOS ls /Library/Fonts # on Windows dir \Windows\Fonts # add watermark ffmpeg -i Dufay_master_H264.mp4 -filter:v "drawtext=text='watermark':fontfile='/Library/Fonts/Arial.ttf':fontsize=35:fontcolor=white:alpha=0.25:x=(w-text_w)/2:y=(h-text_h)/2" with_watermark.mp4 # add watermark (source: https://amiaopensource.github.io/ffmprovisr/#text_watermark) ffmpeg -i input_file -vf drawtext="fontfile=font_path:fontsize=font_size:text=watermark_text:fontcolor=font_color:alpha=0.4:x=(w-text_w)/2:y=(h-text_h)/2" output_file # add watermark example ffmpeg -i input_file -filter:v "drawtext=text='watermark':fontfile='/Library/Fonts/Arial.ttf':fontsize=35:fontcolor=white:alpha=0.25:x=(w-text_w)/2:y=(h-text_h)/2" output_file # add logo ffmpeg -i input_file.mp4 -i logo.png -filter_complex "overlay=10:main_h-overlay_h-10" with_logo.mp4 # add timecode ffmpeg -i input_file -filter:v drawtext="timecode=starting_timecode:rate=timecode_rate:fontfile=font_path:fontsize=font_size:fontcolor=font_colour:box=1:boxcolor=box_colour:x=(w-text_w)/2:y=h/1.2" output_file # add timecode example ffmpeg -i input_file.mp4 -filter:v drawtext="timecode='01\:00\:00\:00':rate=25:fontfile='/Library/Fonts/Arial.ttf':fontsize=35:fontcolor=white:x=(w-text_w)/2:y=h/1.2" with_timecode.mp4 # add credits # idea: concat command for two videos, if credits are present as a video file # add subtitles ffmpeg -i output_archive.mkv -filter:v "subtitles=subtitles.srt" -c:v libx264 -preset veryslow -crf 18 -pix_fmt yuv420p -c:a aac -ar 48k -movflags +faststart+write_colr output_streaming.mp4