| @@ -79,6 +79,126 @@ The format option may be needed for raw input files. | |||||
| @c man end DESCRIPTION | @c man end DESCRIPTION | ||||
| @chapter Detailed description | |||||
| @c man begin DETAILED DESCRIPTION | |||||
| The transcoding process in @command{avconv} for each output can be described by | |||||
| the following diagram: | |||||
| @example | |||||
| _______ ______________ _________ ______________ ________ | |||||
| | | | | | | | | | | | |||||
| | input | demuxer | encoded data | decoder | decoded | encoder | encoded data | muxer | output | | |||||
| | file | ---------> | packets | ---------> | frames | ---------> | packets | -------> | file | | |||||
| |_______| |______________| |_________| |______________| |________| | |||||
| @end example | |||||
| @command{avconv} calls the libavformat library (containing demuxers) to read | |||||
| input files and get packets containing encoded data from them. When there are | |||||
| multiple input files, @command{avconv} 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 again. Finally those are | |||||
| passed to the muxer, which writes the encoded packets to the output file. | |||||
| @section Filtering | |||||
| Before encoding, @command{avconv} can process raw audio and video frames using | |||||
| filters from the libavfilter library. Several chained filters form a filter | |||||
| graph. @command{avconv} distinguishes between two types of filtergraphs - | |||||
| simple and complex. | |||||
| @subsection Simple filtergraphs | |||||
| Simple filtergraphs are those that have exactly one input and output, both of | |||||
| the same type. In the above diagram they can be represented by simply inserting | |||||
| an additional step between decoding and encoding: | |||||
| @example | |||||
| _________ __________ ______________ | |||||
| | | | | | | | |||||
| | decoded | simple filtergraph | filtered | encoder | encoded data | | |||||
| | frames | -------------------> | frames | ---------> | packets | | |||||
| |_________| |__________| |______________| | |||||
| @end example | |||||
| Simple filtergraphs are configured with the per-stream @option{-filter} option | |||||
| (with @option{-vf} and @option{-af} aliases for video and audio respectively). | |||||
| A simple filtergraph for video can look for example like this: | |||||
| @example | |||||
| _______ _____________ _______ _____ ________ | |||||
| | | | | | | | | | | | |||||
| | input | ---> | deinterlace | ---> | scale | ---> | fps | ---> | output | | |||||
| |_______| |_____________| |_______| |_____| |________| | |||||
| @end example | |||||
| Note that some filters change frame properties but not frame contents. E.g. the | |||||
| @code{fps} filter in the example above changes number of frames, but does not | |||||
| touch the frame contents. Another example is the @code{setpts} filter, which | |||||
| only sets timestamps and otherwise passes the frames unchanged. | |||||
| @subsection Complex filtergraphs | |||||
| Complex filtergraphs are those which cannot be described as simply a linear | |||||
| processing chain applied to one stream. This is the case e.g. when the graph has | |||||
| more than one input and/or output, or when output stream type is different from | |||||
| input. They can be represented with the following diagram: | |||||
| @example | |||||
| _________ | |||||
| | | | |||||
| | input 0 |\ __________ | |||||
| |_________| \ | | | |||||
| \ _________ /| output 0 | | |||||
| \ | | / |__________| | |||||
| _________ \| complex | / | |||||
| | | | |/ | |||||
| | input 1 |---->| filter |\ | |||||
| |_________| | | \ __________ | |||||
| /| graph | \ | | | |||||
| / | | \| output 1 | | |||||
| _________ / |_________| |__________| | |||||
| | | / | |||||
| | input 2 |/ | |||||
| |_________| | |||||
| @end example | |||||
| Complex filtergraphs are configured with the @option{-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. | |||||
| A trivial example of a complex filtergraph is the @code{overlay} filter, which | |||||
| has two video inputs and one video output, containing one video overlaid on top | |||||
| of the other. Its audio counterpart is the @code{amix} filter. | |||||
| @section Stream copy | |||||
| Stream copy is a mode selected by supplying the @code{copy} parameter to the | |||||
| @option{-codec} option. It makes @command{avconv} 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. The | |||||
| diagram above will in this case simplify to this: | |||||
| @example | |||||
| _______ ______________ ________ | |||||
| | | | | | | | |||||
| | input | demuxer | encoded data | muxer | output | | |||||
| | file | ---------> | packets | -------> | file | | |||||
| |_______| |______________| |________| | |||||
| @end example | |||||
| 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. | |||||
| @c man end DETAILED DESCRIPTION | |||||
| @chapter Stream selection | @chapter Stream selection | ||||
| @c man begin STREAM SELECTION | @c man begin STREAM SELECTION | ||||