gpt4 book ai didi

filter - ffmpeg 中的比特流过滤器是什么?

转载 作者:行者123 更新时间:2023-12-02 18:07:05 33 4
gpt4 key购买 nike

仔细阅读FFmpeg Bitstream Filters Documentation后,我还是不明白他们到底是做什么用的。

文档指出过滤器:

performs bitstream level modifications without performing decoding

谁能给我进一步解释一下吗?一个用例可以极大地澄清事情。此外,还有明显不同的过滤器。它们有何不同?

最佳答案

让我通过例子来解释一下。 FFmpeg 视频解码器通常通过每次调用将一个视频帧转换为 avcodec_decode_video2 来工作。因此,输入预计是相当于“一张图像”的比特流数据。让我们考虑一下从文件(磁盘字节数组)到图像的问题。

对于“raw”(annexb)H264(.h264/.bin/.264 文件),各个 nal 单元数据(sps/pps header 比特流或 cabac 编码的帧数据)连接在一系列 nal 单元中,中间有一个起始代码 (00 00 01 XX),其中 XX 是最终单位类型。 (为了防止最终数据本身有00 00 01数据,所以进行了RBSP转义。)所以一个h264 frame parser可以简单地在起始代码标记处剪切文件。它们搜索以 00 00 01 开头并包含 00 00 01 的连续数据包,直到并排除下一次出现的 00 00 01。然后它们解析最终单元类型和片头以查找每个数据包属于哪个帧,并返回一组最终数据包。构成一帧的单元作为 h264 decoder 的输入.

不过,.mp4 文件中的 H264 数据有所不同。您可以想象,如果复用格式中已经包含长度标记,则 00 00 01 起始代码可以被认为是多余的,就像 mp4 的情况一样。因此,为了每帧节省 3 个字节,他们删除了 00 00 01 前缀。他们还将 PPS/SPS 放在文件头中,而不是在第一帧之前添加它,并且这些也丢失了 00 00 01 前缀。因此,如果我将其输入到 h264 解码器(该解码器需要所有 nal 单元的前缀)中,它将无法工作。 h264_mp4toannexb位流过滤器修复了这个问题,方法是识别文件头提取部分中的 pps/sps(ffmpeg 称之为“额外数据”),将其和各个帧数据包中的每个 nal 前面加上起始代码,并在输入它们之前将它们连接在一起。在 h264 解码器中。

您现在可能会觉得“解析器”和“比特流过滤器”之间存在非常细微的区别。这是真实的。我认为官方定义是解析器获取一系列输入数据并将其分割成帧,而不丢弃任何数据或添加任何数据。解析器所做的唯一事情就是更改数据包边界。另一方面,比特流过滤器允许实际修改数据。我不确定这个定义是否完全正确(参见下面的 vp9),但这是概念上的原因 mp4toannexb 是一个 BSF,而不是一个解析器(因为它添加了 00 00 01 前缀)。

在其他情况下,此类“比特流调整”有助于保持解码器简单和统一,但允许我们支持野外存在的所有文件变体:

  • mpeg4 (divx) b frame unpacking (为了获得像 IBP 这样在 AVI 中编码为 IPB 的 B 帧序列并获得正确的时间戳,人们提出了 B 帧打包的概念,其中 I-B-P/I-P-B 被打包在帧中,如 I-(PB)-() ,即第三个数据包是空的,第二个数据包有两个帧。这意味着解码阶段与 P 帧和 B 帧相关的时间戳是正确的。这也意味着一个数据包有两帧的输入数据,这违反了 ffmpeg 的一帧- in-one-frame-out 概念,因此我们编写了一个 bsf 将数据包分成两部分 - 并删除表示数据包包含两个帧的标记,因此是 BSF 而不是解析器 - 在将其输入解码器之前在实践中,这解决了帧多线程的其他难题。VP9 做了同样的事情(称为超帧),但在 parser 中分割帧,因此解析器/BSF 分割在理论上并不总是完美的;也许 VP9 应该被称为BSF)
  • hevc mp4 到annexb 转换(与上面的情况相同,但适用于 hevc)
  • aac adts to asc转换(这与 h264/hevcannexb 与 mp4 基本相同,但针对 aac 音频)

关于filter - ffmpeg 中的比特流过滤器是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32028437/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com