FFmpeg is a command line video processing tool. Below you will find many common tasks you might need to do with a video clip and explanations on how to do these with FFmpeg. This document assumes that you have FFmpeg setup and installed.
Table of Contents
- FFmpeg Basics
- Extracting a Video Clip Out of a Video
- Extracting Audio Out of a Video
- Extracting a Frame (Picture) Out of a Video
- Combine Video and Audio Into One File
- Making Title or Image Slides
- Combine (Stitch) Multiple Videos Into One Video
- Speed Up (Time-lapse) or Slow Down a Video
- Change Aspect Ratio (ie: 16:9 -> 4:3) - Letterboxing
I. FFmpeg Basics
If you are new to FFmpeg, you will find a few things a bit odd about it. We will start with the time format. Times can be written in either HH:MM:SS where HH is the hours, MM is the minutes, SS is the seconds. Times may also be written as the total number of seconds. For example, if you want to specify 5 minutes and 23.5 seconds, you could write it in the following ways:
Codec vs. Container
In general for video processing, you need to know the difference between a codec versus a container. A container is the file format that you will be storing the video and audio in. This can be AVI, MPG, MOV, etc. Typically, the file extension represents the container type.
The codec is the format that the video or audio is stored in. FFmpeg will attempt to automatically choose the video and audio codec based on the file extension you use. For example, for an AVI file, unless you specify otherwise, FFmpeg will use MPEG-4 for the video codec, and MPEG-2 for the audio codec. NOT ALL CONTAINERS ARE COMPATIBLE WITH EACH CODEC. Unless you have a specific need, it is best to let FFmpeg chose the codecs.
General Command Structure
When sending parameters to FFmpeg, the order you send them in matters. Input parameters must come before output parameters. Also, the input parameters must come before the input file, and output parameters must come before the output file. Here is the general structure of an FFmpeg command:
ffmpeg [input parameters] -i [input file] [output parameters] [output file]
If you are not starting at the beginning of an input file, it is best to tell FFmpeg to ensure that the video and audio are synchronized. This can be achieved by using the “-async 1” parameter. You will see it used in the examples below.
As soon as you do any processing on a video, you will lose quality. To minimize the losses, keep the video/audio bitrate that you are using high. Typically for HD (1280x720) videos, I use 14000 kbit/s. For VGA (640x480) videos, I use 8000 kbit/s. For audio, I use 128 kbit/s. If you don’t specify a bitrate, FFmpeg will use 200 kbit/s for video and 64 kbit/s for audio.
Those bitrates are constant bitrates, and are useful when you have multiple videos that you later want to combine using the method I use in this tutorial. If want to use a variable bitrate you can use the “-qscale” parameter. You can specify a number from 0-31, 0 being the highest quality and 31 being the worst. In general I use the values 3-11. This parameter is an output parameter.
II. Extracting a Video Clip Out of a Video
ffmpeg -async 1 -ss 00:05:34 -t 60 -i input.avi -b 14000k -ab 128k -ar 44100 output.avi
Extracts a video from “input.avi” starting at 5m 34s and going for 60s, encoding it at a bitrate of 14000kbit/s video and 128kbit/s audio with an audio sampling rate of 44100Hz and outputs it as “output.avi”.
ffmpeg -async 1 -ss 00:05:34 -t 60 -i input.avi -vcodec copy -acodec copy output.avi
This does the same as the above command, except it tries to copy the raw video and audio data which prevents loss of quality. However, this doesn’t work with all formats and can make combining videos from multiple sources a pain. I recommend using the first command instead.
III. Extracting Audio Out of a Video
ffmpeg -i input.avi output.wav
Extracts the audio channel out of “input.avi” and outputs it to “output.wav” with the default settings for a wav file. You can use different file formats, but keep in mind that MP3 is not supported in all versions of FFmpeg and using anything other than FLAC or WAV files will result in a loss of quality.
IV. Extracting a Frame (Picture) Out of a Video
ffmpeg -ss 00:05:34.05 -i input.avi -vframes 1 -sameq output.jpg
Extracts a picture from input.avi at the time 5m 34s 5ms and outputs it as output.jpg. If you want the best quality, you can output it to a PNG file instead of JPEG file.
V. Combine Video and Audio Into One File
ffmpeg -shortest -i input.avi -i input.wav -map 0:0 -map 1:0 output.avi
Takes the video from “input.avi”: and the audio from “input.wav” and combines them together to form “output.avi”. The reason we use the “-shortest” parameter is to stop the output as soon as one of the inputs ends. If you allow it to continue, this can cause unpredictable behavior during playback. Most commonly, the symptom would be that combined videos experience video/audio synchronization issues.
The “-map” parameter is used to map an input channel to an output channel. In general, channel 0 is for video and 1 is for audio in a device that has mono audio. It is applied in the order of the input parameters, so the first “-map” goes with the first “-i”. The general form is:
VI. Making Title or Image Slides
ffmpeg -loop_input -t 5 -i title.jpg title_slide.avi
Takes the image “title.jpg” and turns it into a 5 second video file, “title_slide.avi”. The parameter “-loop_input” tells FFmpeg that you want to repeat the input until output ends, otherwise it would just record one frame (picture) and end the video since it has reached the end of the input.
In general, if you want to combine videos, you will need to add an audio track. I usually use a silent audio file (right click and “save as” to download). To do this, simply take the command for combining a video with audio, and replace “-shortest” with “-loop_input -t 5”.
Note: the silent audio file I linked to is only 3 minutes long, if you try to go longer than this, you will have problems. The file was created in Audacity using the Generate->Silence... menu item.
VII. Combine (Stitch) Multiple Videos Into One Video
mencoder -ovc copy -oac copy 0.avi 1.avi 2.avi ... -o merged.avi
Takes the videos 0.avi, 1.avi, 2.avi, etc. and concatenates them together into one big video file, merged.avi. Mencoder is a seperate command that is another command line video processing command.
“-ovc copy” and “-oac copy” tell Mencoder that you want to copy the data out of the videos, rather than encode it (it has already been encoded by FFmpeg). This works with very few formats. It was tested and works with the default settings of the mpg container and the default settings for the avi container.
IMPORTANT: All the video files must have the same video and audio properties for this to work. That means they must be the same resolution, have the same number of audio channels (e.g., stereo vs mono), and must be encoded with the same bitrate (video and audio), framerate, and audio sampling rate. That means every command you use to process these videos must have the -b, -ab, -ar, and -r parameters specified.