Ffmpeg reference

From Phonlab
Revision as of 11:45, 11 February 2016 by Ronald (talk | contribs) (→‎Extracting audio from a video)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

ffmpeg is a command line tool for working with video files. In the Lab we use it to automate the creation of video stimulus files--adding features such as lead-in still frames or replacing the audio track with processed audio.

Note that some commands are not compatible with older versions of ffmpeg. These are know to work with version 1.0.7.

Visit the ffmpeg site for full documentation of the tool.

Extracting video

To extract video from a certain time, use the -ss and -t flags to specify start time and duration, respectively:

ffmpeg -ss HH:MM:SS[.CS] INFILE -t DURATION OUTFILE

This command, for example, would extract a 1.5-second clip starting at 5.3 seconds into 'longfile.avi' and save it to 'shortfile.avi':

ffmpeg -ss 00:00:05.30 longfile.avi -t 1.5 shortfile.avi


Here's one strategy for extracting video from MXF files that has worked:

1) convert to a format that has a small GOP (group of pictures) value -g 1 and keep a high video bit rate (-b:v) to keep detail in the video:

ffmpeg -i my.MXF -g 1  -b:v 35000k temp.MXF

2) seek in the temp.MXF file to just before your target start time for the extracted video - the first seek (ss) in this command jumps to 1 second before the target very quickly and the second seek steps over frames until it gets to exactly your target time. Using a small GOP value in step one makes this quick jump possible:

ffmpeg -ss target-1 -i temp.MXF -ss 1 -q 2 -t duration_of_chunk out.mpg

Extracting audio from a video

To extract only the audio portion of a video, use the -vn parameter to indicate no video output:

 ffmpeg -i longfile.avi -vn outfile.wav

Bitrate and MPEG compression

Set the bitrate of the output file with the -b:v argument. Add this argument somewhere in the command, set off by spaces--for example, right before specifying the output file. Set it closer to the original file's bitrate to reduce the amount of compression.

-b:v 30000k

Unfortunately, this parameter is not available in older versions of ffmpeg; you can use -vcodec copy to copy over the video from the original file without re-encoding it. This will override any encoding-related settings.

-c:v copy     # for newer versions of ffmpeg only
-vcodec copy  # for all versions of ffmpeg

The -q parameter can also be used to control the quality of the video output. Set -q 2 to get a pretty high quality video bitrate.

Changing the video resolution (scaling)

Select the output video resolution with the video filter parameter:

-vf scale=WIDTH:HEIGHT

Note that the video image will be stretched horizontally or vertically if the output width/height ratio is different from the ratio in the input file.

Avoiding audio compression

Many compressed video outputs will also include compressed audio by default. Since the normal goal is to use movies in a listening experiment, we usually want to avoid making unintentional changes to the audio channels when processing video files. In particular, we want to avoid applying lossy compression (perhaps multiple times) when applying MPEG compression.

To ensure that audio channels are simply copied without additional compression from input to output video files, specify copy as the output audio codec.

-c:a copy    # for newer versions of ffmpeg only
-acodec copy # for all versions of ffmpeg

The copy codec tells ffmpeg to skip the default compression (when converting to MPEG or another format with default audio compression) and to pass through the audio with the same format it has in the input file.


Add text to a video

At one point we wanted to add text to a video - creating catch trials in which subjects were instructed 'do not respond' so we can see that they have their eyes open during the experiment! The 'drawtext' filter will do this.

ffmpeg -i input.mpg -vb 100000k -y -vf drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSans.ttf:text='Do not respond':fontsize=70:box=0:x=800:y=700:fontcolor=yellow" output.mpg

Note that we have to refer to a specific font file, and the location of the font may differ from computer to computer.