FFmpeg无法解码H264流/帧数据

时间:2012-07-04 14:11:36

标签: stream ffmpeg h.264 rtsp

最近我有机会使用两台通过RTSP流式传输H264的设备。 我尝试使用FFmpeg库解压缩此流时遇到了一些问题。

每次调用“ avcodec_decode_video2 ”时 - FFmpeg只是说:

  

[h264 @ 00339220]没有框架!

我的原始H264流 I 帧数据开头如下:“ 65 88 84 21 3F F8 F8 0D ...” (据我所知,这个0x65表示它是一个IDR帧?)

一台设备的其他框架开始如下:“ 41 9A 22 07 F3 4E 48 CC ....”

和其他设备 - 如下:“ 61 9A 25 C1 1C 45 62 39 ......”

  • 我在这里错过了一些帧数据吗?
  • FFmpeg是否需要设置一些额外的参数?

我期待帧数据开始时至少有“ 00 00 00 01 ”字节......但这就是我所拥有的......

1 个答案:

答案 0 :(得分:20)

好的,设法使事情有效。

  • 我需要包含序列(SPS)和图片参数集 (PPS)在将帧发送到FFmpeg之前我的帧数据。
  • 我需要在SPS和PPS数据之后添加4个额外字节“00 00 00 01”。

这是一张显示我的意思的小图片: enter image description here

字节“65 88 ...”是我的原始帧数据开始的地方。

此SPS和PPS信息未包含在RTP数据包中。我正在使用Live555库进行RTSP流式传输,因此我使用了“ fmtp_spropparametersets ”功能来完成我需要的功能。此信息是Base64编码的。 (示例:这样的东西“Z0KAKNoC0EkQ,aM48gA ==”)请注意,有两个“参数”SPS和PPS由“,”分隔,并且这些参数没有“00 00 00 01 “包括在内,所以你需要添加它们。

一些代码示例(我在这里使用Qt库):

QByteArray        ba          = pSubSession->fmtp_spropparametersets();
QList<QByteArray> recordsList = ba.split(',');

for (int i = 0; i < recordsList.size(); i++)
{
   mExtraData.append(char(0x00));
   mExtraData.append(char(0x00));
   mExtraData.append(char(0x00));
   mExtraData.append(char(0x01));

   mExtraData += QByteArray::fromBase64(recordsList.at(i));
}

现在每一帧我做这样的事情:

QByteArray ba = QByteArray(4, 0); // Prepare the "00 00 00 01"
           ba[3] = 0x01;

mpTrackVideo->buffer.insert(0, mExtraData);
mpTrackVideo->buffer.insert(mExtraData.size(), ba);

一年前,我认为我的项目中集成了H264流支持,直到我有机会用其他设备测试它... 所以你需要记住,有些设备可能会为每个I帧发送SPS和PPS数据......有些设备可能不会![/ p>