将一系列h264帧写入多个文件

时间:2017-04-12 19:50:51

标签: c++ h.264 specifications live555

我有一个h264帧流(来自RTSP流,但我认为它无关紧要),我知道序列参数集字节,我想将这些帧写入几个.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帧存储在不同文件中的正确方法是什么?

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

1 个答案:

答案 0 :(得分:0)

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

  • SPS(序列参数集)
  • PPS(图片参数集)
  • I Frame(可能是和IDR或SLICE_I)

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

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