Skip to content

Instantly share code, notes, and snippets.

@steven2358
Last active December 18, 2024 09:08
Show Gist options
  • Save steven2358/ba153c642fe2bb1e47485962df07c730 to your computer and use it in GitHub Desktop.
Save steven2358/ba153c642fe2bb1e47485962df07c730 to your computer and use it in GitHub Desktop.
FFmpeg cheat sheet

FFmpeg cheat sheet

A list of useful commands for the FFmpeg command line tool.

Download FFmpeg: https://www.ffmpeg.org/download.html

Full documentation: https://www.ffmpeg.org/ffmpeg.html

Basic conversion

ffmpeg -i in.mp4 out.avi

Remux an MKV file into MP4

ffmpeg -i in.mkv -c:v copy -c:a copy out.mp4

High-quality encoding

Use the crf (Constant Rate Factor) parameter to control the output quality. The lower crf, the higher the quality (range: 0-51). The default value is 23, and visually lossless compression corresponds to -crf 18. Use the preset parameter to control the speed of the compression process. Additional info: https://trac.ffmpeg.org/wiki/Encode/H.264

ffmpeg -i in.mp4 -preset slower -crf 18 out.mp4

Trimming

Without re-encoding:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c copy out.mp4
  • -ss specifies the start time, e.g. 00:01:23.000 or 83 (in seconds)
  • -t specifies the duration of the clip (same format).
  • Recent ffmpeg also has a flag to supply the end time with -to.
  • -c copy copies the first video, audio, and subtitle bitstream from the input to the output file without re-encoding them. This won't harm the quality and make the command run within seconds.

With re-encoding:

If you leave out the -c copy option, ffmpeg will automatically re-encode the output video and audio according to the format you chose. For high quality video and audio, read the x264 Encoding Guide and the AAC Encoding Guide, respectively.

For example:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c:v libx264 -c:a aac -strict experimental -b:a 128k out.mp4

Mux video and audio from another video

To copy the video from in0.mp4 and audio from in1.mp4:

ffmpeg -i in0.mp4 -i in1.mp4 -c copy -map 0:0 -map 1:1 -shortest out.mp4

Concat demuxer

First, make a text file.

file 'in1.mp4'
file 'in2.mp4'
file 'in3.mp4'
file 'in4.mp4'

Then, run ffmpeg:

ffmpeg -f concat -i list.txt -c copy out.mp4

Delay audio/video

Delay video by 3.84 seconds:

ffmpeg -i in.mp4 -itsoffset 3.84 -i in.mp4 -map 1:v -map 0:a -vcodec copy -acodec copy out.mp4

Delay audio by 3.84 seconds:

ffmpeg -i in.mp4 -itsoffset 3.84 -i in.mp4 -map 0:v -map 1:a -vcodec copy -acodec copy out.mp4

Burn subtitles

Use the libass library (make sure your ffmpeg install has the library in the configuration --enable-libass).

First convert the subtitles to .ass format:

ffmpeg -i sub.srt sub.ass

Then add them using a video filter:

ffmpeg -i in.mp4 -vf ass=sub.ass out.mp4

Extract the frames from a video

To extract all frames from between 1 and 5 seconds, and also between 11 and 15 seconds:

ffmpeg -i in.mp4 -vf select='between(t,1,5)+between(t,11,15)' -vsync 0 out%d.png

To extract one frame per second only:

ffmpeg -i in.mp4 -fps=1 -vsync 0 out%d.png

Rotate a video

Rotate 90 clockwise:

ffmpeg -i in.mov -vf "transpose=1" out.mov

For the transpose parameter you can pass:

0 = 90CounterCLockwise and Vertical Flip (default)
1 = 90Clockwise
2 = 90CounterClockwise
3 = 90Clockwise and Vertical Flip

Use -vf "transpose=2,transpose=2" for 180 degrees.

Download "Transport Stream" video streams

  1. Locate the playlist file, e.g. using Chrome > F12 > Network > Filter: m3u8
  2. Download and concatenate the video fragments:
ffmpeg -i "path_to_playlist.m3u8" -c copy -bsf:a aac_adtstoasc out.mp4

If you get a "Protocol 'https not on whitelist 'file,crypto'!" error, add the protocol_whitelist option:

ffmpeg -protocol_whitelist "file,http,https,tcp,tls" -i "path_to_playlist.m3u8" -c copy -bsf:a aac_adtstoasc out.mp4

Mute some of the audio

To replace the first 90 seconds of audio with silence:

ffmpeg -i in.mp4 -vcodec copy -af "volume=enable='lte(t,90)':volume=0" out.mp4

To replace all audio between 1'20" and 1'30" with silence:

ffmpeg -i in.mp4 -vcodec copy -af "volume=enable='between(t,80,90)':volume=0" out.mp4

Deinterlace

Deinterlacing using "yet another deinterlacing filter".

ffmpeg -i in.mp4 -vf yadif out.mp4

Create a video slideshow from images

Parameters: -r marks the image framerate (inverse time of each image); -vf fps=25 marks the true framerate of the output.

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4

Extract images from a video

  • Extract all frames: ffmpeg -i input.mp4 thumb%04d.jpg -hide_banner
  • Extract a frame each second: ffmpeg -i input.mp4 -vf fps=1 thumb%04d.jpg -hide_banner
  • Extract only one frame: ffmpeg -i input.mp4 -ss 00:00:10.000 -vframes 1 thumb.jpg

Display the frame number on each frame

ffmpeg -i in.mov -vf "drawtext=fontfile=arial.ttf: text=%{n}: x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000099: fontsize=72" -y out.mov

Metadata: Change the title

ffmpeg -i in.mp4 -map_metadata -1 -metadata title="My Title" -c:v copy -c:a copy out.mp4

Tools

https://ffmpeg.lav.io/ is an interactive resource to compose FFmpeg actions.

@JayRugMan
Copy link

This is great. Thanks for compiling this. Here is a bash script I wrote for easily adding metadata tags to audio files. Feel free to crack it open and add functionality for video files or adding more tags.

My Script https://github.com/JayRugMan/fun_with_bash/blob/master/metatag.sh
list of ffmpeg metadata tags: https://wiki.multimedia.cx/index.php/FFmpeg_Metadata

@fufatujuba
Copy link

Your list is very useful. But I have question.
How to use two filters to extract frames from .h265 at the same time?
ffmpeg -i input.h265 -vf "select=not(mod(n\,10))" -vsync 0 frame-%04d.png works fine to extract stepped frames . But later I realized that it always outputs frames with constant size which is 1920x1080. I have to add an other filter to scale the size like this: ffmpeg -i input.h265 -vf "select=not(mod(n\,10))" "scale=w=3840:h=2160" -vsync 0 frame-%04d.png for 4k resolution and etc... then the extraction started producing 0 frames

@laurentlbm
Copy link

One issue I've had on Plex is videos with closed captioning. I use this little snippet to remove them:

ffmpeg -i in.mp4 -codec copy -bsf:v "filter_units=remove_types=6" out.mp4

If you want to extract those captions first, you can run:

ffmpeg -f lavfi -i "movie='in.mp4'[out0+subcc]" -map s out.srt

@AlkisPis
Copy link

Great ref for exploring ffmpeg! Thanks for sharing!

@debuti
Copy link

debuti commented Aug 27, 2023

https://ffmpeg.lav.io/ is a great interactive resource to compose ffmpeg actions

@steven2358
Copy link
Author

https://ffmpeg.lav.io/ is a great interactive resource to compose ffmpeg actions

Excellent. Added.

@AlkisPis
Copy link

https://ffmpeg.lav.io/ is a great interactive resource to compose ffmpeg actions

Great interactive tool! Thanks @debuti for bringing this up!

@asifajrof
Copy link

asifajrof commented Dec 23, 2023

i once used this (found from some StackOverflow answer, can't find the link now) to convert a video to gif

ffmpeg -i in.mp4 -vf "fps=10,scale=720:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif

Edit: found the original stack post. here

@AlkisPis
Copy link

@asifajrof, nice setup. But what's the use? It creates a huge GIF file. (It can be 15 to 50 times larger, depending on the scale.) The reverse process is more useful. The resulted MP4 file can be about 20 times smaller. (I tested all that with a small MP4 file.)

@asifajrof
Copy link

asifajrof commented Dec 25, 2023

But what's the use? It creates a huge GIF file.

You are right. It does output a larger file. The one time when I used it was for a very small video file, so the size of the GIF also didn't bother me much. I mentioned it here because I didn't see any process of converting a video to GIF in this cheat sheet.

@AlkisPis
Copy link

@asifajrof, you did very well posting this FFMPEG setup. It's a very useful just by itself. I have worked for a while with FFMPEG, both with the S/W itself (i.e. using console commands) and and with programming, using a Python FFMPEG library. Yet, I couldn't master --actually, I didn't even try-- its too complicated, highly compacted and symbolic commands, an example of which you offered yourself.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment