关于ffmpge (from manpage
)
ffmpeg
is a very fast video and audio converter
that can also grab from a live audio/video
source.
It can also convert between arbitrary sample rates
and resize video
on the fly with a high quality polyphase filter.
ffmpeg
reads from an arbitrary number of input
“files” (which can be regular files, pipes, network streams, grabbing devices, etc.), specified by the “-i” option, and writes to an arbitrary number of output
“files”, which are specified by a plain output url. Anything found on the command line which cannot be interpreted as an option is considered to be an output url.
Each input or output url can, in principle, contain any number of streams of different types (video/audio/subtitle/attachment/data). The allowed number and/or types of streams may be limited by the container format. Selecting which streams from which inputs will go into which output
is either done automatically or with the “-map” option (see the Stream selection chapter).
To refer to input files in options
, you must use their indices (0-based). E.g. the first input file is 0, the second is 1, etc. Similarly, streams within a file are referred to by their indices. E.g. “2:3” refers to the fourth stream in the third input file. Also see the Stream specifiers chapter.
Ffmpeg transcoding process:
ffmpeg
calls the libavformat
library (containing demuxers
) to read input files and get packets containing encoded data from them
. When there are multiple input files, ffmpeg tries to keep them synchronized by tracking lowest timestamp on any active input stream.
Encoded packets are then passed to the decoder
(unless streamcopy is selected for the stream, see further for a description). The decoder produces uncompressed frames
(raw video/PCM audio/…) which can be processed further by filtering
(see next section). After filtering, the frames are passed to the encoder
, which encodes them and outputs encoded packets. Finally those are passed to the muxer
, which writes the encoded packets to the output file.
-
To set the video bitrate of the output file to 64 kbit/s
1
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
-
To force the frame rate of the output file to 24 fps:
1
ffmpeg -i input.avi -r 24 output.avi
-
To force the frame rate of the input file (valid for
raw formats
only) to 1 fps and the frame rate of the output file to 24 fps:1
ffmpeg -r 1 -i input.m2v -r 24 output.avi
-
The format option may be needed for raw input files.
Filtering
Before encoding
, ffmpeg can process raw audio and video frames using filters from the libavfilter
library. Several chained filters form a filter graph. ffmpeg distinguishes between two types of filtergraphs: simple
and complex
.
- SYNOPSIS
1
2
ffmpeg [global_options] {[input_file_options] -i input_url} ...
{[output_file_options] output_url} ...
Simple filtergraphs
Simple filtergraphs are those that have exactly one input and output, both of the same type.
Simple filtergraphs are configured with the per-stream -filter option (with -vfand -af aliases for video and audio respectively).
Complex filtergraphs
Complex filtergraphs are those which cannot be described as simply a linear processing chain applied to one stream. This is the case, for example, when the graph has more than one input and/or output, or when output stream type is different from input.
Complex filtergraphs are configured with the -filter_complex option. Note that this option is global, since a complex filtergraph, by its nature, cannot be unambiguously associated with a single stream or file.
The -lavfi option is equivalent to -filter_complex.
Stream copy
Stream copy is a mode selected by supplying the “copy” parameter to the -codec option.
It makes ffmpeg omit the decoding and encoding step for the specified stream, so it does only demuxing and muxing. It is useful for changing the container format or modifying container-level metadata.
Since there is no decoding or encoding, it is very fast and there is no quality loss. However, it might not work in some cases because of many factors. Applying filters is obviously also impossible, since filters work on uncompressed data.