Home ffmpeg - ffmpeg
Post
Cancel

ffmpeg - ffmpeg

关于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.

This post is licensed under CC BY 4.0 by the author.