FFmpeg的不能解码H264流/帧数据(FFmpeg can't decode H264

2019-06-26 00:42发布

最近,我有机会与那些流通过RTSP H264的两个设备的工作。 我也遇到了一些问题,尝试解压缩使用的FFmpeg库此流。

每次“avcodec_decode_video2”之称- FFmpeg的只是说是这样的:

[H264 @ 00339220]无框架!

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

为一个装置的其它帧开始,如: “41 22 9A 07 F3 48 4E CC ....”

和用于其它装置-这样的: “61 25 9A C1 1C 45 62 39 ...。”

  • 我在这里缺少一些帧数据?
  • 是否FFMPEG需要有一些额外的参数设置?

我在开始的帧数据预期至少为“00 00 00 01”字节......但是这是我的本钱..

Answer 1:

好吧,设法使事情工作。

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

这里是在我的意思是一点点的画面:

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

这一SPS和PPS的信息不包括在RTP数据包。 我使用LIVE555库RTSP流,所以我用的subsessions“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流支持集成在我的项目,直到我有机会与一些其他设备进行测试......所以,你需要记住一些设备可能发送SPS和PPS的数据为每一个I帧。 ..有的可能不!



文章来源: FFmpeg can't decode H264 stream/frame data