【发布时间】: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