doc/avconv: add some details about the transcoding process.
This commit is contained in:
		
							parent
							
								
									a982e5a031
								
							
						
					
					
						commit
						2b1f105f1b
					
				
							
								
								
									
										120
									
								
								doc/avconv.texi
									
									
									
									
									
								
							
							
						
						
									
										120
									
								
								doc/avconv.texi
									
									
									
									
									
								
							@ -79,6 +79,126 @@ The format option may be needed for raw input files.
 | 
			
		||||
 | 
			
		||||
@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
 | 
			
		||||
@c man begin STREAM SELECTION
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user