0,0 → 1,180 |
@chapter Bitstream Filters |
@c man begin BITSTREAM FILTERS |
|
When you configure your FFmpeg build, all the supported bitstream |
filters are enabled by default. You can list all available ones using |
the configure option @code{--list-bsfs}. |
|
You can disable all the bitstream filters using the configure option |
@code{--disable-bsfs}, and selectively enable any bitstream filter using |
the option @code{--enable-bsf=BSF}, or you can disable a particular |
bitstream filter using the option @code{--disable-bsf=BSF}. |
|
The option @code{-bsfs} of the ff* tools will display the list of |
all the supported bitstream filters included in your build. |
|
The ff* tools have a -bsf option applied per stream, taking a |
comma-separated list of filters, whose parameters follow the filter |
name after a '='. |
|
@example |
ffmpeg -i INPUT -c:v copy -bsf:v filter1[=opt1=str1/opt2=str2][,filter2] OUTPUT |
@end example |
|
Below is a description of the currently available bitstream filters, |
with their parameters, if any. |
|
@section aac_adtstoasc |
|
Convert MPEG-2/4 AAC ADTS to MPEG-4 Audio Specific Configuration |
bitstream filter. |
|
This filter creates an MPEG-4 AudioSpecificConfig from an MPEG-2/4 |
ADTS header and removes the ADTS header. |
|
This is required for example when copying an AAC stream from a raw |
ADTS AAC container to a FLV or a MOV/MP4 file. |
|
@section chomp |
|
Remove zero padding at the end of a packet. |
|
@section dump_extra |
|
Add extradata to the beginning of the filtered packets. |
|
The additional argument specifies which packets should be filtered. |
It accepts the values: |
@table @samp |
@item a |
add extradata to all key packets, but only if @var{local_header} is |
set in the @option{flags2} codec context field |
|
@item k |
add extradata to all key packets |
|
@item e |
add extradata to all packets |
@end table |
|
If not specified it is assumed @samp{k}. |
|
For example the following @command{ffmpeg} command forces a global |
header (thus disabling individual packet headers) in the H.264 packets |
generated by the @code{libx264} encoder, but corrects them by adding |
the header stored in extradata to the key packets: |
@example |
ffmpeg -i INPUT -map 0 -flags:v +global_header -c:v libx264 -bsf:v dump_extra out.ts |
@end example |
|
@section h264_mp4toannexb |
|
Convert an H.264 bitstream from length prefixed mode to start code |
prefixed mode (as defined in the Annex B of the ITU-T H.264 |
specification). |
|
This is required by some streaming formats, typically the MPEG-2 |
transport stream format ("mpegts"). |
|
For example to remux an MP4 file containing an H.264 stream to mpegts |
format with @command{ffmpeg}, you can use the command: |
|
@example |
ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.ts |
@end example |
|
@section imxdump |
|
Modifies the bitstream to fit in MOV and to be usable by the Final Cut |
Pro decoder. This filter only applies to the mpeg2video codec, and is |
likely not needed for Final Cut Pro 7 and newer with the appropriate |
@option{-tag:v}. |
|
For example, to remux 30 MB/sec NTSC IMX to MOV: |
|
@example |
ffmpeg -i input.mxf -c copy -bsf:v imxdump -tag:v mx3n output.mov |
@end example |
|
@section mjpeg2jpeg |
|
Convert MJPEG/AVI1 packets to full JPEG/JFIF packets. |
|
MJPEG is a video codec wherein each video frame is essentially a |
JPEG image. The individual frames can be extracted without loss, |
e.g. by |
|
@example |
ffmpeg -i ../some_mjpeg.avi -c:v copy frames_%d.jpg |
@end example |
|
Unfortunately, these chunks are incomplete JPEG images, because |
they lack the DHT segment required for decoding. Quoting from |
@url{http://www.digitalpreservation.gov/formats/fdd/fdd000063.shtml}: |
|
Avery Lee, writing in the rec.video.desktop newsgroup in 2001, |
commented that "MJPEG, or at least the MJPEG in AVIs having the |
MJPG fourcc, is restricted JPEG with a fixed -- and *omitted* -- |
Huffman table. The JPEG must be YCbCr colorspace, it must be 4:2:2, |
and it must use basic Huffman encoding, not arithmetic or |
progressive. . . . You can indeed extract the MJPEG frames and |
decode them with a regular JPEG decoder, but you have to prepend |
the DHT segment to them, or else the decoder won't have any idea |
how to decompress the data. The exact table necessary is given in |
the OpenDML spec." |
|
This bitstream filter patches the header of frames extracted from an MJPEG |
stream (carrying the AVI1 header ID and lacking a DHT segment) to |
produce fully qualified JPEG images. |
|
@example |
ffmpeg -i mjpeg-movie.avi -c:v copy -bsf:v mjpeg2jpeg frame_%d.jpg |
exiftran -i -9 frame*.jpg |
ffmpeg -i frame_%d.jpg -c:v copy rotated.avi |
@end example |
|
@section mjpega_dump_header |
|
@section movsub |
|
@section mp3_header_decompress |
|
@section mpeg4_unpack_bframes |
|
Unpack DivX-style packed B-frames. |
|
DivX-style packed B-frames are not valid MPEG-4 and were only a |
workaround for the broken Video for Windows subsystem. |
They use more space, can cause minor AV sync issues, require more |
CPU power to decode (unless the player has some decoded picture queue |
to compensate the 2,0,2,0 frame per packet style) and cause |
trouble if copied into a standard container like mp4 or mpeg-ps/ts, |
because MPEG-4 decoders may not be able to decode them, since they are |
not valid MPEG-4. |
|
For example to fix an AVI file containing an MPEG-4 stream with |
DivX-style packed B-frames using @command{ffmpeg}, you can use the command: |
|
@example |
ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi |
@end example |
|
@section noise |
|
Damages the contents of packets without damaging the container. Can be |
used for fuzzing or testing error resilience/concealment. |
|
Parameters: |
A numeral string, whose value is related to how often output bytes will |
be modified. Therefore, values below or equal to 0 are forbidden, and |
the lower the more frequent bytes will be modified, with 1 meaning |
every byte is modified. |
|
@example |
ffmpeg -i INPUT -c copy -bsf noise[=1] output.mkv |
@end example |
applies the modification to every byte. |
|
@section remove_extra |
|
@c man end BITSTREAM FILTERS |