最近我有机会使用两台通过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 ......”
我期待帧数据开始时至少有“ 00 00 00 01 ”字节......但这就是我所拥有的......
答案 0 :(得分:20)
好的,设法使事情有效。
这是一张显示我的意思的小图片:
字节“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>