【问题标题】:Write a sequence of h264 frames into several files将一系列 h264 帧写入多个文件
【发布时间】:2017-04-12 19:50:50
【问题描述】:

我有一个 h264 帧流(来自 RTSP 流,但我认为这无关紧要),我知道 sequence parameter set 字节,我想将这些帧以多个 .h264 文件写入磁盘(每个大约 N 帧)。

如果我写

sequence parameter set - 0x00 0x00 0x00 0x01 - frame1 - 0x00 0x00 0x00 0x01 - frame2 - 0x00 0x00 0x00 0x01 - frame3 - 

等到磁盘(没有破折号,只是一堆字节),我会得到一个正确的文件(至少,它可以通过vlc播放)

但如果我会写文件:

sequence parameter set - 0x00 0x00 0x00 0x01 - frame1 - ...
sequence parameter set - 0x00 0x00 0x00 0x01 - frameN - ...
sequence parameter set - 0x00 0x00 0x00 0x01 - frame2N - ...
sequence parameter set - 0x00 0x00 0x00 0x01 - frame3N - ...

其中一些是正确的(在 vlc 可以播放的意义上),而另一些则不是(而且不仅第一个文件是正确的!) 显然,不是每一帧都可以在 h264 文件的开头,但是哪个可以呢?或者将 h264 帧存储在不同文件中的正确方法是什么?

说到工具,我使用 c++ 和 live555 库,并且可以使用 h264bitstream 库获取帧类型,但我想没关系。 我不想使用任何命令行工具(如 ffmpeg),而是可以在 c++ 中使用一些额外的库来实现的解决方案。

【问题讨论】:

  • h.264 中有三种类型的帧。 I、P 和 B 帧。 P 和 B 帧被编码为与前一帧的差异。因此,它们本身无法显示。只有 I 帧是“自包含的”。我的猜测是那些有效的,恰好是从一个 I 框架开始的。

标签: c++ h.264 specifications live555


【解决方案1】:

为了可播放(无需其他信息),每个文件应包含:

  • SPS(序列参数集)
  • PPS(图片参数集)
  • I 帧(可以是 IDR 或 SLICE_I)

接下来解码器可以解码其他切片类型(P,B)。

一种简单的方法是存储传入的 SPS 和 PPS 帧,并在每个 IDR 帧之前写入它们(使用 00 00 00 01 开始代码)(也使用 00 00 00 01 开始代码)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2023-03-22
    • 2021-09-06
    • 2021-08-24
    • 2012-03-23
    • 1970-01-01
    • 2019-02-14
    相关资源
    最近更新 更多