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_cntr 和 cdp_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 模式与 rotate 和 flip 选项配合工作。在 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 h265 或 hevc)输出格式,该过滤器会自动插入。
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=4 与 drop=-4 相同。若同时指定了 drop,则忽略此项。
amount 与 drop 都可以接受包含以下变量的表达式:
‘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
对于 ts 或 dts 选项而言是输入中的解封装时间戳,对于 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 提供