好的,设法使事情正常进行。
- 在将帧发送到 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 数据。 ..有些可能不会!