繁体   English   中英

FFmpeg无法解码H264流/帧数据

[英]FFmpeg can't decode H264 stream/frame data

最近我有机会使用两台通过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 ”字节......但这就是我所拥有的......

好的,设法使事情有效。

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

这是一张显示我的意思的小图片: 在此输入图像描述

字节“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数据。 ..有些人可能不会!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM