最近,我有机会与那些流通过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”字节......但是这是我的本钱..
好吧,设法使事情工作。
- 我需要发送帧到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帧。 ..有的可能不!