⚠️ 这是一个非官方翻译网站,与 FFmpeg 项目无关。准确信息请参阅原文(https://ffmpeg.org/ffmpeg-bitstream-filters.html)

FFmpeg Bitstream 过滤器文档

1 描述

本文档介绍 libavcodec 库提供的 bitstream 过滤器。

bitstream 过滤器对编码后的流数据进行操作,在不解码的情况下执行 bitstream 级别的修改。

2 Bitstream 过滤器

配置 FFmpeg 构建时,所有受支持的 bitstream 过滤器默认都会启用。可以使用 configure 选项 --list-bsfs 列出所有可用的过滤器。

可以使用 configure 选项 --disable-bsfs 禁用所有 bitstream 过滤器,使用 --enable-bsf=BSF 选项有选择地启用某个 bitstream 过滤器,或使用 --disable-bsf=BSF 选项禁用特定的 bitstream 过滤器。

ff* 工具的 -bsfs 选项会显示构建中包含的所有受支持 bitstream 过滤器的列表。

ff* 工具具有按流应用的 -bsf 选项,接受以逗号分隔的过滤器列表,各过滤器的参数在过滤器名称后以 ’=’ 分隔给出。

ffmpeg -i INPUT -c:v copy -bsf:v filter1[=opt1=str1:opt2=str2][,filter2] OUTPUT

下面介绍当前可用的 bitstream 过滤器及其参数(如果有的话)。

2.1 aac_adtstoasc

将 MPEG-2/4 AAC ADTS 转换为 MPEG-4 Audio Specific Configuration bitstream。

该过滤器根据 MPEG-2/4 ADTS 头部生成 MPEG-4 AudioSpecificConfig,并删除 ADTS 头部。

例如,将 raw ADTS AAC 或 MPEG-TS container 中的 AAC 流复制到 MP4A-LATM、FLV 文件,或 MOV/MP4 及 3GP、M4A 等相关格式文件时,需要用到该过滤器。请注意,对于 MP4A-LATM 以及 MOV/MP4 及相关格式,该过滤器会自动插入。

2.2 av1_metadata

修改 AV1 流中嵌入的元数据。

td

在流的所有时间单元(temporal unit)中插入或删除时间分隔符(temporal delimiter)OBU。

‘insert’

在尚未包含 TD 的每个 TU 开头插入一个 TD。

‘remove’

从包含 TD 的每个 TU 开头删除该 TD。

color_primaries transfer_characteristics matrix_coefficients

设置流中的色彩描述字段(参见 AV1 6.4.2 节)。

color_range

设置流中的色彩范围(参见 AV1 6.4.2 节;注意,对于使用 BT.709 primaries、sRGB transfer characteristic 和 identity(RGB)matrix coefficients 的流,无法设置该项)。

‘tv’

有限范围。

‘pc’

全范围。

chroma_sample_position

设置流中的色度采样位置(参见 AV1 6.4.2 节)。这只能针对 4:2:0 流设置。

‘vertical’

左侧位置(与 MPEG-2 及 H.264 中的默认值一致)。

‘colocated’

左上位置。

tick_rate

设置序列头(sequence header)的时序信息中的 tick rate(time_scale / num_units_in_display_tick)。

num_ticks_per_picture

设置每幅图像中的 tick 数,以表明该流具有固定帧率。若未同时设置 tick_rate,则忽略此项。

delete_padding

删除 Padding OBU。

2.3 chomp

删除数据包末尾的零填充。

2.4 dca_core

从 DCA/DTS 流中提取核心部分,丢弃 DTS-HD 等扩展内容。

2.5 dovi_rpu

操作 HEVC/AV1 bitstream 中的 Dolby Vision 元数据,并可选择启用元数据压缩。

strip

若启用,则从流中剥离所有 Dolby Vision 元数据(配置记录 + RPU 数据块)。

compression

启用哪一级压缩。

‘none’

不进行元数据压缩。

‘limited’

有限的元数据压缩方案。应与大多数设备兼容。这是默认值。

‘extended’

扩展的元数据压缩。设备不要求支持此项。注意,目前该级别在 libavcodec 中的行为与 ‘limited’ 相同。

2.6 dovi_split

拆分 Dolby Vision Profile 7 的多层(multi-layer)HEVC bitstream。Profile 7 会将增强层(enhancement layer)的 HEVC bitstream 交织封装在基本层(base layer)的访问单元(access unit)内部,包裹在类型为 63(UNSPEC63)的用户未指定 NAL 单元中;RPU 元数据则以类型为 62(UNSPEC62)的伴生用户未指定 NAL 承载。

mode

指定在输出 bitstream 中保留哪些 Dolby Vision 组件。

‘bl’

仅基本层:丢弃每一个 UNSPEC63(EL)和每一个 UNSPEC62(RPU)。输出为不含任何 Dolby Vision 标记的纯 HEVC 流。这是默认值。

‘bl_rpu’

保留 RPU NAL 的基本层。

‘el’

仅增强层:对每个 UNSPEC63 NAL,剥离两字节的外层 NAL 头并输出内部有效载荷。结果是一个独立的 HEVC bitstream。UNSPEC62(RPU)将被丢弃。

‘el_rpu’

保留 RPU NAL 原样的增强层。与 ‘el’ 相同,但会随解包后的 EL NAL 一并输出 UNSPEC62 的 RPU NAL。

2.7 dump_extra

在过滤后数据包的开头添加 extradata;但如果数据包本身已经完全以打算添加的 extradata 开头,则不再添加。

freq

该附加参数指定应过滤哪些数据包。可接受以下值:

‘k’ ‘keyframe’

为所有关键数据包添加 extradata

‘e’ ‘all’

为所有数据包添加 extradata

若未指定,则默认为 ‘k’。

例如,下面的 ffmpeg 命令会为 libx264 encoder 生成的 H.264 数据包强制添加全局头(从而禁用各数据包各自的头),但会通过把存放在 extradata 中的头添加到关键数据包中来对此进行修正:

ffmpeg -i INPUT -map 0 -flags:v +global_header -c:v libx264 -bsf:v dump_extra out.ts

2.8 dv_error_marker

DV 中被标记为损坏的块会被替换为指定颜色的块。

color

用于替换损坏块的颜色

sta

一个 16 位掩码,指定 16 种可能的错误状态值中哪些应被替换为彩色块。默认值为 0xFFFE,即替换所有非 0 的错误状态值。

‘ok’

无错误,无差错掩盖

‘err’

有错误,无差错掩盖

‘res’

保留

‘notok’

有错误或有差错掩盖

‘notres’

未保留

‘Aa, Ba, Ca, Ab, Bb, Cb, A, B, C, a, b, erri, erru’

具体的错误状态代码

请参见 http://web.archive.org/web/20060927044735/http://www.smpte.org/smpte_store/standards/pdf/s314m.pdf 的第 44—46 页或第 5.5 节。

2.9 eac3_core

从 E-AC-3 流中提取核心部分,丢弃多余的声道。

2.10 eia608_to_smpte436m

EIA_608 流转换为 SMPTE_436M_ANC 数据流,把隐藏式字幕(closed caption)包装进 CTA-708 CDP VANC 数据包中。

line_number

选择生成的 VANC 数据包应放在哪一行。通常你会希望选第 9 行(默认值)或第 11 行。

wrapping_type

选择 SMPTE 436M 的封装类型,默认为 ‘vanc_frame’。可接受以下值:

‘vanc_frame’

VANC 帧(隔行或分段逐行帧)

‘vanc_field_1’ ‘vanc_field_2’ ‘vanc_progressive_frame’ sample_coding

选择 SMPTE 436M 的采样编码,默认为 ‘8bit_luma’。可接受以下值:

‘8bit_luma’

8 比特分量的亮度采样

‘8bit_color_diff’

8 比特分量的色差采样

‘8bit_luma_and_color_diff’

8 比特分量的亮度采样和色差采样

‘10bit_luma’

10 比特分量的亮度采样

‘10bit_color_diff’

10 比特分量的色差采样

‘10bit_luma_and_color_diff’

10 比特分量的亮度采样和色差采样

‘8bit_luma_parity_error’

带奇偶校验错误的 8 比特分量亮度采样

‘8bit_color_diff_parity_error’

带奇偶校验错误的 8 比特分量色差采样

‘8bit_luma_and_color_diff_parity_error’

带奇偶校验错误的 8 比特分量亮度采样和色差采样

initial_cdp_sequence_cntr

CDP 的 16 位无符号整数字段 cdp_hdr_sequence_cntrcdp_ftr_sequence_cntr 的初始值。默认为 0。

cdp_frame_rate

设置 CDP 的 cdp_frame_rate 字段。这并不会真正改变数据流的时序,只会改变生成的 CDP 数据包中该字段所插入的值。默认为 ‘30000/1001’。

2.11 extract_extradata

提取带内(in-band)extradata。

某些 codec 允许长期头(long-term header,例如 MPEG-2 的序列头,或 H.264/HEVC 的 (VPS/)SPS/PPS)以“带内”(即作为包含已编码帧的 bitstream 的一部分)或“带外”(例如在 container 层面)方式传输。后一种形式在 FFmpeg 术语中称为“extradata”。

该 bitstream 过滤器会检测带内头,并使其可作为 extradata 使用。

remove

启用此选项后,长期头会在提取之后从 bitstream 中删除。

2.12 filter_units

从流中删除类型属于或不属于给定集合的单元。

pass_types

要放行的单元类型或类型范围列表,其余全部删除。以 ’|’ 分隔的单元类型值列表指定,其中的值范围以 ’-’ 分隔。

remove_types

与 pass_types 相同,只是给定集合中的单元会被删除,其余全部放行。

pass_types 与 remove_types 所使用的类型,在 H.264、HEVC 与 H.266 中对应 NAL 单元类型(nal_unit_type,参见 H.264 与 HEVC 规范表 7-1,或 H.266 规范表 5);在 JPEG 中对应标记值(不含 0xFF 前缀);在 MPEG-2 中对应去掉起始码前缀后的起始码(即紧跟在 0x000001 之后的字节)。对于 VP8 与 VP9,每个单元的类型均为零。

此变换不会改变 extradata,但请注意,如果流中包含内联参数集,删除这些参数集后输出可能无法使用。

例如,要从 H.264 流中删除所有非 VCL NAL 单元:

ffmpeg -i INPUT -c:v copy -bsf:v 'filter_units=pass_types=1-5' OUTPUT

要从 H.265 流中删除所有 AUD、SEI 及 filler:

ffmpeg -i INPUT -c:v copy -bsf:v 'filter_units=remove_types=35|38-40' OUTPUT

要从 MPEG-2 流中删除所有用户数据(包括隐藏式字幕):

ffmpeg -i INPUT -c:v copy -bsf:v 'filter_units=remove_types=178' OUTPUT

要从 H264 流中删除所有 SEI(包括隐藏式字幕):

ffmpeg -i INPUT -c:v copy -bsf:v 'filter_units=remove_types=6' OUTPUT

要从 HEVC 流中删除所有 prefix 与 suffix SEI(包括隐藏式字幕和动态 HDR):

ffmpeg -i INPUT -c:v copy -bsf:v 'filter_units=remove_types=39|40' OUTPUT

2.13 hapqa_extract

在不重新压缩的前提下提取 HAPQA 文件中的 Rgb 或 Alpha 部分,以生成 HAPQ 或 HAPAlphaOnly 文件。

texture

指定要保留的纹理。

color alpha

将 HAPQA 转换为 HAPQ

ffmpeg -i hapqa_inputfile.mov -c copy -bsf:v hapqa_extract=texture=color -tag:v HapY -metadata:s:v:0 encoder="HAPQ" hapq_file.mov

将 HAPQA 转换为 HAPAlphaOnly

ffmpeg -i hapqa_inputfile.mov -c copy -bsf:v hapqa_extract=texture=alpha -tag:v HapA -metadata:s:v:0 encoder="HAPAlpha Only" hapalphaonly_file.mov

2.14 h264_metadata

修改 H.264 流中嵌入的元数据。

aud

在流的所有访问单元(access unit)中插入或删除 AUD NAL 单元。

‘pass’ ‘insert’ ‘remove’

默认为 pass。

sample_aspect_ratio

在 VUI 参数中设置流的采样宽高比。参见 H.264 表 E-1。

overscan_appropriate_flag

设置该流是否适合以过扫描(overscan)方式显示(参见 H.264 E.2.1 节)。

video_format video_full_range_flag

设置流中的视频格式(参见 H.264 E.2.1 节及表 E-2)。

colour_primaries transfer_characteristics matrix_coefficients

设置流中的色彩描述(参见 H.264 E.2.1 节及表 E-3、E-4、E-5)。

chroma_sample_loc_type

设置流中的色度采样位置(参见 H.264 E.2.1 节及图 E-1)。

tick_rate

在 VUI 参数中设置 tick rate(time_scale / num_units_in_tick)。这是流中可表示的最小时间单位,在许多情况下代表该流的场频(field rate,即帧率的两倍)。

fixed_frame_rate_flag

设置该流是否具有固定帧率——这通常表明帧率恰好是 tick rate 的一半,但确切含义取决于隔行方式与图像结构(参见 H.264 E.2.1 节及表 E-6)。

zero_new_constraint_set_flags

将 SPS 中的 constraint_set4_flag 与 constraint_set5_flag 置零。这些位在早期版本的 H.264 规范中曾被保留,因此一些硬件 decoder 要求它们必须为零。将其置零后得到的仍是有效的 bitstream。

crop_left crop_right crop_top crop_bottom

在 SPS 中设置帧的裁剪偏移。如果流已经被裁剪,这些值会替换当前值。

这些字段以像素为单位设置。请注意,如果色度经过二次采样或流是隔行的,某些尺寸可能无法表示(参见 H.264 7.4.2.1.1 节)。

sei_user_data

以 SEI 未注册用户数据的形式插入一个字符串。参数的形式必须是 UUID+string,其中 UUID 是可用连字符分隔的十六进制数字,字符串内容可以任意。

例如,‘086f3693-b7b3-4f2c-9653-21492feee5b8+hello’ 会插入与指定 UUID 关联的字符串“hello”。

delete_filler

同时删除 filler NAL 单元和 filler SEI 消息。

display_orientation

插入、提取或删除 Display orientation SEI 消息。语法和语义参见 H.264 D.1.27 节及 D.2.27 节。

‘pass’ ‘insert’ ‘remove’ ‘extract’

默认为 pass。

Insert 模式与 rotateflip 选项配合工作。在 insert 或 remove 模式下,任何已存在的 Display orientation 消息都会被删除。Extract 模式会将显示矩阵作为 side data 附加到数据包上。

rotate

设置 display orientation SEI 中的旋转角度(逆时针方向,单位为度)。范围为 -360 到 +360。默认为 NaN。

flip

设置 display orientation SEI 中的翻转。

‘horizontal’ ‘vertical’

默认未设置。

level

在 SPS 中设置级别(level)。参见 H.264 A.3 节及表 A-1 到 A-5。

参数必须是级别名称(例如 ‘4.2’)、level_idc 值(例如 ‘42’),或特殊名称 ‘auto’——表示由过滤器尝试根据输入流的属性推断级别。

2.15 h264_mp4toannexb

将 H.264 bitstream 从长度前缀模式转换为起始码前缀模式(定义见 ITU-T H.264 规范附录 B)。

某些流媒体格式需要这种转换,典型的例子是 MPEG-2 传输流格式(muxer mpegts)。

例如,要用 ffmpeg 将包含 H.264 流的 MP4 文件重新封装为 mpegts 格式,可以使用如下命令:

ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.ts

请注意,对于 MPEG-TS(muxer mpegts)和 raw H.264(muxer h264)输出格式,该过滤器会自动插入。

2.16 h264_redundant_pps

这会对一些包含冗余 PPS 的 Blu-ray BDMV H264 流应用特定的修复。这些 PPS 会修改流中无关紧要的参数,从而扰乱其他需要正确 extradata 的变换。

在这些受影响的流上所使用的 encoder 会在整个流中不断添加额外的 PPS,同时改变初始 QP 以及是否启用加权预测。这会在将流复制到具有全局头的 container 后引发问题,因为起始 PPS 并不适用于流的其余部分。例如,其副作用之一是:在出现新的 PPS 之前,定位(seek)操作会返回错乱的输出。

该 BSF 会删除多余的 PPS,并重写条带头,使流在全局头中只使用单一的起始 PPS,从而解决该问题。

2.17 hevc_metadata

修改 HEVC 流中嵌入的元数据。

aud

在流的所有访问单元中插入或删除 AUD NAL 单元。

‘insert’ ‘remove’ sample_aspect_ratio

在 VUI 参数中设置流的采样宽高比。

video_format video_full_range_flag

设置流中的视频格式(参见 H.265 E.3.1 节及表 E.2)。

colour_primaries transfer_characteristics matrix_coefficients

设置流中的色彩描述(参见 H.265 E.3.1 节及表 E.3、E.4、E.5)。

chroma_sample_loc_type

设置流中的色度采样位置(参见 H.265 E.3.1 节及图 E.1)。

tick_rate

在 VPS 与 VUI 参数中设置 tick rate(time_scale / num_units_in_tick)。与 num_ticks_poc_diff_one 结合,可以为流设置恒定帧率。请注意,当流被封装在 container 中时,该值很可能会被 container 参数覆盖。

num_ticks_poc_diff_one

在 VPS 与 VUI 中设置 poc_proportional_to_timing_flag,并用该值设置 num_ticks_poc_diff_one_minus1(参见 H.265 7.4.3.1 节及 E.3.1 节)。若未同时设置 tick_rate,则忽略此项。

crop_left crop_right crop_top crop_bottom

在 SPS 中设置一致性窗口(conformance window)的裁剪偏移。如果流已经被裁剪,这些值会替换当前值。

这些字段以像素为单位设置。请注意,如果色度经过二次采样,某些尺寸可能无法表示(H.265 7.4.3.2.1 节)。

width height

设置裁剪后的宽度和高度。

level

在 VPS 与 SPS 中设置级别。参见 H.265 A.4 节及表 A.6、A.7。

参数必须是级别名称(例如 ‘5.1’)、general_level_idc 值(例如级别 5.1 对应 ‘153’),或特殊名称 ‘auto’——表示由过滤器尝试根据输入流的属性推断级别。

2.18 hevc_mp4toannexb

将 HEVC/H.265 bitstream 从长度前缀模式转换为起始码前缀模式(定义见 ITU-T H.265 规范附录 B)。

某些流媒体格式需要这种转换,典型的例子是 MPEG-2 传输流格式(muxer mpegts)。

例如,要用 ffmpeg 将包含 HEVC 流的 MP4 文件重新封装为 mpegts 格式,可以使用如下命令:

ffmpeg -i INPUT.mp4 -codec copy -bsf:v hevc_mp4toannexb OUTPUT.ts

请注意,对于 MPEG-TS(muxer mpegts)和 raw HEVC/H.265(muxer h265hevc)输出格式,该过滤器会自动插入。

2.19 imxdump

修改 bitstream 使其能放入 MOV 并可被 Final Cut Pro decoder 使用。该过滤器仅适用于 mpeg2video codec,并且对于配有合适 -tag:v 的 Final Cut Pro 7 及更新版本,多半不再需要。

例如,要将 30 MB/秒的 NTSC IMX 重新封装为 MOV:

ffmpeg -i input.mxf -c copy -bsf:v imxdump -tag:v mx3n output.mov

2.20 mjpeg2jpeg

将 MJPEG/AVI1 数据包转换为完整的 JPEG/JFIF 数据包。

MJPEG 是一种视频 codec,其中每一帧视频本质上就是一幅 JPEG 图像。可以无损地提取各个独立的帧,例如通过

ffmpeg -i ../some_mjpeg.avi -c:v copy frames_%d.jpg

遗憾的是,这些数据块是不完整的 JPEG 图像,因为它们缺少解码所需的 DHT 段。引用 http://www.digitalpreservation.gov/formats/fdd/fdd000063.shtml 的说法:

Avery Lee 在 2001 年于 rec.video.desktop 新闻组撰文指出:“MJPEG,或者至少是带有 MJPG fourcc 的 AVI 中的 MJPEG,是一种采用固定——且省略——霍夫曼表的受限 JPEG。该 JPEG 必须是 YCbCr 色彩空间,必须是 4:2:2,并且必须使用基本的霍夫曼编码,不能是算术编码或渐进式编码……你确实可以提取出 MJPEG 帧并用普通的 JPEG decoder 解码,但必须先在其前面加上 DHT 段,否则 decoder 完全不知道该如何解压这些数据。所需的确切表格由 OpenDML 规范给出。”

该 bitstream 过滤器会为从 MJPEG 流中提取出的帧(带有 AVI1 头 ID 且缺少 DHT 段)修补头部,以生成完全合规的 JPEG 图像。

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

2.21 mjpegadump

向 bitstream 添加一个 MJPEG A 头,以便 Quicktime 能够解码。

2.22 mov2textsub

从 MOV 字幕中提取可呈现的文本文件,并去除每个字幕数据包中的元数据头。

另请参见 text2movsub 过滤器。

2.23 mpeg2_metadata

修改 MPEG-2 流中嵌入的元数据。

display_aspect_ratio

设置流的显示宽高比。

支持以下固定值:

4/3 16/9 221/100

其他任何值都会导致改为发出方形像素信号(参见 H.262 6.3.3 节及表 6-3)。

frame_rate

设置流的帧率。它是根据一张已知值表,结合一个较小的乘数和除数构造出来的——如果给定的值无法精确表示,则会改用最接近的可表示值(参见 H.262 6.3.3 节及表 6-4)。

video_format

设置流中的视频格式(参见 H.262 6.3.6 节及表 6-6)。

colour_primaries transfer_characteristics matrix_coefficients

设置流中的色彩描述(参见 H.262 6.3.6 节及表 6-7、6-8、6-9)。

2.24 mpeg4_unpack_bframes

解包 DivX 风格的打包 B 帧。

DivX 风格的打包 B 帧不是有效的 MPEG-4,只是针对存在缺陷的 Video for Windows 子系统的一种变通方案。它们占用更多空间,可能引发轻微的音画不同步问题,解码时需要更多 CPU 算力(除非播放器具备某种已解码图像队列以补偿每包 2,0,2,0 帧的模式),并且如果被复制进 mp4 或 mpeg-ps/ts 之类的标准 container 会造成麻烦,因为 MPEG-4 decoder 可能无法对其解码,原因是它们并非有效的 MPEG-4。

例如,要用 ffmpeg 修复包含带有 DivX 风格打包 B 帧的 MPEG-4 流的 AVI 文件,可以使用如下命令:

ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi

2.25 noise

破坏数据包的内容,或者干脆丢弃数据包,但不破坏 container 本身。可用于模糊测试(fuzzing),或测试容错能力/差错掩盖机制。

参数:

amount

接受一个表达式,其按数据包求值的结果决定该数据包中的字节被修改的频繁程度。小于 0 的值会得到一个可变的频率。默认值为 0,表示不做任何修改。但是,如果既未指定 amount 也未指定 drop,则 amount 会被设为 -1。可接受的变量见下文。

drop

接受一个按数据包求值的表达式,其值决定该数据包是否被丢弃。求值为正值会导致该数据包被丢弃。求值为负值会得到一个可变的丢弃概率,大致与该值的大小成反比。默认值为 0,表示不丢弃。可接受的变量见下文。

dropamount

接受一个非负整数,据此分配一个可变的丢弃概率,大致与该值成反比。默认值为 0,表示不丢弃。保留此选项是为了向后兼容,它等价于将 drop 设为相同大小的负值,即 dropamount=4drop=-4 相同。若同时指定了 drop,则忽略此项。

amountdrop 都可以接受包含以下变量的表达式:

‘n’

数据包的索引,从零开始。

‘tb’

数据包时间戳所用的时间基。

‘pts’

数据包的显示时间戳(presentation timestamp)。

‘dts’

数据包的解码时间戳(decoding timestamp)。

‘nopts’

表示 AV_NOPTS_VALUE 的常量。

‘startpts’

流中出现的第一个非 AV_NOPTS_VALUE 的 PTS。

‘startdts’

流中出现的第一个非 AV_NOPTS_VALUE 的 DTS。

‘duration’ ‘d’

数据包的持续时长,单位为时间基。

‘pos’

数据包在输入中的位置;未知或未设置时可能为 -1。

‘size’

数据包大小,单位为字节。

‘key’

数据包是否被标记为 keyframe。

‘state’

一个伪随机整数,主要依据数据包负载的内容导出。

2.25.1 示例

对每个字节都应用修改,但不丢弃任何数据包。

ffmpeg -i INPUT -c copy -bsf noise=1 output.mkv

丢弃时间戳 30 秒之后所有未标记为 keyframe 的视频数据包,但不修改其余任何数据包。

ffmpeg -i INPUT -c copy -bsf:v noise=drop='gt(pts*tb\,30)*not(key)' output.mkv

每 10 秒丢弃 1 秒音频,并对其余部分添加一些随机噪声。

ffmpeg -i INPUT -c copy -bsf:a noise=amount=-1:drop='between(mod(pts*tb\,10)\,9\,10)' output.mkv

2.26 null

该 bitstream 过滤器原样放行数据包,不做任何改变。

2.27 pcm_rechunk

将 PCM 音频重新分包为每个数据包固定数量的采样,或固定的每秒数据包速率。这与 (ffmpeg-filters)asetnsamples 音频滤镜 类似,但作用于音频数据包而非音频帧。

nb_out_samples, n

设置每个输出音频数据包的采样数。该数字是指_每个声道_的采样数。默认值为 1024。

pad, p

若设为 1,过滤器会用静音填充最后一个音频数据包,使其包含与之前数据包相同(或大致相同的数量,参见 frame_rate)的采样数。默认值为 1。

frame_rate, r

使用此选项会让过滤器输出固定的每秒数据包数,而非固定的每包采样数。如果音频采样率不能被帧率整除,那么采样数将不再恒定,而是略有变化,以使每个数据包尽可能地贴近帧边界开始。使用此选项的优先级高于 nb_out_samples。

使用 frame_rate 选项,你可以为 NTSC 帧率生成众所周知的 48kHz 音频 1602-1601-1602-1601-1602 模式。

ffmpeg -f lavfi -i sine=r=48000:d=1 -c pcm_s16le -bsf pcm_rechunk=r=30000/1001 -f framecrc -

2.28 pgs_frame_merge

将以“end of display set”段结尾的一系列 PGS 字幕段合并为单个数据包。

某些支持 PGS 字幕的 container(muxer matroska)需要这样做。

2.29 prores_metadata

修改 prores 流中嵌入的色彩属性元数据。

color_primaries

设置色彩基色(color primaries)。可用值有:

‘auto’

保持相同的色彩基色属性(默认值)。

‘unknown’ ‘bt709’ ‘bt470bg’

BT601 625

‘smpte170m’

BT601 525

‘bt2020’ ‘smpte431’

DCI P3

‘smpte432’

P3 D65

transfer_characteristics

设置色彩传输特性。可用值有:

‘auto’

保持相同的传输特性属性(默认值)。

‘unknown’ ‘bt709’

BT 601、BT 709、BT 2020

‘smpte2084’

SMPTE ST 2084

‘arib-std-b67’

ARIB STD-B67

matrix_coefficients

设置矩阵系数。可用值有:

‘auto’

保持相同的色彩空间属性(默认值)。

‘unknown’ ‘bt709’ ‘smpte170m’

BT 601

‘bt2020nc’

为文件的每一帧设置 Rec709 色彩空间

ffmpeg -i INPUT -c copy -bsf:v prores_metadata=color_primaries=bt709:color_trc=bt709:colorspace=bt709 output.mov

为文件的每一帧设置 Hybrid Log-Gamma 参数

ffmpeg -i INPUT -c copy -bsf:v prores_metadata=color_primaries=bt2020:color_trc=arib-std-b67:colorspace=bt2020nc output.mov

2.30 remove_extra

从数据包中删除 extradata。

接受以下参数:

freq

设置从哪些帧类型中删除 extradata。

‘k’

仅从非 keyframe 中删除 extradata。

‘keyframe’

仅从 keyframe 中删除 extradata。

‘e, all’

从所有帧中删除 extradata。

2.31 setts

在数据包中设置 PTS 和 DTS。

它接受以下参数:

ts pts dts

设置 PTS、DTS 或两者的表达式。

duration

设置持续时长的表达式。

time_base

设置输出时间基。

prescale

设置在对表达式求值之前,是否要将时间字段转换为用户设置的输出时间基。默认为 0。

这些表达式通过 eval API 求值,可以包含以下常量:

N

输入数据包的计数,从 0 开始。

TS

对于 tsdts 选项而言是输入中的解封装时间戳,对于 pts 选项而言是显示时间戳。

POS

数据包在文件中的原始位置;若当前数据包未定义该值,则为 undefined

DTS

输入中的解封装时间戳。

PTS

输入中的显示时间戳。

DURATION

输入中的持续时长。

STARTDTS

第一个数据包的 DTS。

STARTPTS

第一个数据包的 PTS。

PREV_INDTS

前一个输入 DTS。

PREV_INPTS

前一个输入 PTS。

PREV_INDURATION

前一个输入持续时长。

PREV_OUTDTS

前一个输出 DTS。

PREV_OUTPTS

前一个输出 PTS。

PREV_OUTDURATION

前一个输出持续时长。

NEXT_DTS

下一个输入 DTS。

NEXT_PTS

下一个输入 PTS。

NEXT_DURATION

下一个输入持续时长。

TB

时间字段所使用的时间基。若启用了 prescale,则为用户设置的输出时间基,否则为输入时间基。

TB_OUT

输出时间基。

SR

数据包所属流的采样率。

NOPTS

AV_NOPTS_VALUE 常量。

例如,要将 PTS 设为与 DTS 相等(若涉及 B 帧则不建议这样做):

ffmpeg -i INPUT -c:a copy -bsf:a setts=pts=DTS out.mkv

2.32 showinfo

记录基本的数据包信息。主要用于测试、调试和开发。

2.33 smpte436m_to_eia608

SMPTE_436M_ANC 数据流转换为 EIA_608 流,从 CTA-708 CDP VANC 数据包中提取隐藏式字幕,并忽略其余所有数据。

2.34 text2movsub

将文本字幕转换为带元数据头的 MOV 字幕(供 mov_text codec 使用)。

另请参见 mov2textsub 过滤器。

2.35 trace_headers

记录跟踪输出,其中包含编码后流头部(即高于单个编码块层级的所有内容)中的全部语法元素。这对调试底层流问题很有用。

支持 AV1、H.264、H.265、(M)JPEG、MPEG-2 与 VP9,但根据具体构建,可能只有其中一部分可用。

2.36 truehd_core

从 TrueHD 流中提取核心部分,丢弃 ATMOS 数据。

2.37 vp9_metadata

修改 VP9 流中嵌入的元数据。

color_space

设置帧头中的色彩空间值。请注意,任何被设为 RGB 的帧都会被隐式设为 PC 范围,且 RGB 与 profile 0、2 不兼容。

‘unknown’ ‘bt601’ ‘bt709’ ‘smpte170’ ‘smpte240’ ‘bt2020’ ‘rgb’ color_range

设置帧头中的色彩范围值。请注意,由色彩空间所施加的任何值都会优先于此值。

‘tv’ ‘pc’

2.38 vp9_superframe

将 VP9 不可见(alt-ref)帧重新合并为 VP9 超帧(superframe)。这可以修复因 alt-ref 帧与其可见对应帧被拆分而导致的、经拆分/分段的 VP9 流的合并问题。

2.39 vp9_superframe_split

将 VP9 超帧拆分为单帧。

2.40 vp9_raw_reorder

给定一个时间戳正确但可能顺序错乱的 VP9 流,插入额外的 show-existing-frame 数据包以修正顺序。

3 参见

ffmpeg, ffplay, ffprobe, libavcodec

4 作者

FFmpeg 的开发者们。

关于作者身份的详细信息,请参见项目的 Git 历史(https://git.ffmpeg.org/ffmpeg),例如在 FFmpeg 源代码目录中输入 git log 命令,或浏览在线仓库 https://git.ffmpeg.org/ffmpeg

各组件的维护者列在源代码树中的 MAINTAINERS 文件里。

主机托管由 telepoint.bg 提供