h264 到 FLV 的转换,模糊的 FrameType 定义:关键帧与帧间帧的区别是什么?

h264 to FLV conversion, ambiguous FrameType definition: What differentiates a Key Frame vs an Inter Frame?

我正在尝试在 Android 应用程序中通过 RTMP 在 FLV 容器中写出 Annex B 格式的 h264 比特流。阅读 this SO answer 和其他几篇文章后,我了解到我的 Annex B 比特流必须首先转换为 AVCC,然后才能包装在 FLV 容器中。

也就是说,FLV 容器规范在其视频标签的包装方面有点不清楚。它需要一个 FrameType,它可以是:

  1. 关键帧(对于 AVC 可搜索帧)
  2. 帧间(对于 AVC 是不可搜索的帧)
  3. 一次性中间帧(仅限 h263)
  4. 生成的关键帧(仅限服务器端)
  5. 视频信息/命令帧(消息字符串包含一个字节,0 或 1 表示客户端搜索视频帧序列的开始,或客户端搜索帧序列的结束)

在写入 IDR 或非 IDR AVC 帧时,即 VCL NAL 单元,显然应该分别使用选项 1 和 2。但是,我的 h264 比特流还包含非 VCL NAL 单元,特别是 SEI 有效负载类型 47(显示方向)。根据规范从 AVC 到 FLV 时,这是否适用尚不清楚。我是否只是将 SEI 视为不可搜索的框架?从 FLV 的角度来看,"frame" 是什么?

根据 Mathias Wien "High Efficiency Video Coding: Coding Tools and Specification" 的说法,所有 SEI(补充增强信息)消息都被定义为视频解码和重建不需要的信息。一般来说,并不是所有的视频格式都能表示这样的信息。特别是对于这个,显示方向消息不代表任何特定的视频帧,因为它是一个持续存在直到更改的标志。

没有歧义。 flv叫frame,h264叫access unit。就像您发布的 link 所说的那样,一个访问单元可以包含多个 NAL。 SEI 本身不是访问单元,因此它不是框架,因此它永远不应该单独出现在 flv 标签中,因此这个问题没有意义。

SEI 作为同一帧 (AU) 有效载荷的一部分发送,并且 flv 帧类型是该 au 中的 VCL nalus。