Ffmpeg

From XPUB & Lens-Based wiki
Website http://www.ffmpeg.org/
License LGPL, GPL
OS GNU/Linux
Media Audio, Video
Format OGG, WEBM, MPEG, AVI, MP4, MOV, QT
Interface Command-line interface,
Wikipedia http://en.wikipedia.org/wiki/FFmpeg

Swiss army knife of video command line video tool originally written by Fabrice Bellard (under the pseudonym "Gerard Lantau")

Be sure to check you / print your own ffmpeg documentation!
http://ffmpeg.mplayerhq.hu/ffmpeg-doc.html

Usage

Like many "swiss army knife" commandline tools, ffmpeg has lots of options, with often many ways of doing something, and takes some getting used to.

-i INPUT

With ffmpeg you always use -i NAMEOFFILE to set an input, and eventually simply give another NAMEOFFILE at the end to specify an output. (NB: This is the opposite of tools like mencoder where -o sets an output, and input files are the default).

Inspect a video

Running ffmpeg with an input and no options / output dumps out information about a file. Despite the complaint that no output file has been specified, this command is very useful to check a video (file or URL!) for what kind of structure/format it has.

ffmpeg -i http://constantvzw.org:8000/variable.ogg

Convert a video into individual frames

The -r option sets the framerate. A framerate of .01 (or 1/100) means 100 seconds per frame. In this way you can easily make an overview of a movie:

ffmpeg -i rearwindow.avi -f image2 -y -r .01 -an rearwindow%06d.jpg

The "%06d" means to "pad" (or fill) the filename to having always 6 places (so adding extra 0's before the number as necessary so that the filenames all have the right size and avoiding any problem with sorting later). This follows the convention of the C printf command).

Extract 1 frame per second (padding to 3 places):

ffmpeg -i inputfile.avi -r 1 -f image2 image-%3d.jpeg

Setting a start time

Extract 2 fps (-r) starting at 1:45:02 (-ss) and process 10 seconds of the input (-t 10).

ffmpeg -i inputfile.avi  -r 2 -ss 01:45:02 -t 10 image-%d.jpeg

Alternately -vframes lets you specify how many output frames you want (rather than input time)?

ffmpeg -i inputfile.avi  -r 2 -ss 01:45:02 -vframes 10 image-%d.jpeg

Extracting a specific part of a media file

The general form is:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c copy out.mp4

Where:

   -ss specifies the start time, e.g. 00:01:23.000 or 83 (in seconds)
   -t specifies the duration of the clip (same format).
   Instead of -t you can also 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.

Assemble images into a video

ffmpeg -f image2 -r 1/5 -i img%03d.png -r 30 out.mp4

using a glob

ffmpeg -f image2 -pattern_type glob -i 'anim*.png' -s 160x120 -y anim.ogv

Resources

Concatenation / Assembling a sequence

https://trac.ffmpeg.org/wiki/Concatenate

https://cects.com/concatenating-windows-ffmpeg/

Audio volume Manipulation

https://trac.ffmpeg.org/wiki/AudioVolume

Filters / Processing Audio with ffmpeg

https://ffmpeg.org/ffmpeg-filters.html

Audio Channel Manipulation

https://trac.ffmpeg.org/wiki/AudioChannelManipulation

metadata

 ffmpeg -i in.avi -metadata title="my title" out.flv