我真的很难过这个,我现在已经看了2天了,还没到任何地方。我使用一些C#通过RTP捕获编码的H.264数据包,并且据我所知,文件中的信息看起来很稳定。
基本上我得到的SPS告诉我高调,分辨率为1280x720。然后我按照SEI获得我的PPS。在此之后,我收到IDR图片的编码切片,然后是29 P切片,然后重复该过程。它们似乎也不同步,因为它反复做同样的事情。
在播放了被捕获的视频后,每隔5到10秒钟给出或拍摄......帧看起来像是他们混淆了一两秒,然后回到他们想要的位置,然后播放正常约5到10秒,并再次播放。
这里有一些代码:
var payloadOffset = packet.Payload.Offset;
var offset = payloadOffset + packet.HeaderOctets;
var count = packet.Payload.Count - (offset + packet.PaddingOctets);
var packetData = packet.Payload.Array;
if (count <= 2)
{
return;
}
var firstByte = packetData[offset];
var nalUnitType = (byte)(firstByte & Binary.fiveBitMaxValue);
switch (nalUnitType)
{
case NalUnitType.Unknown:
case NalUnitType.PayloadContentScalabilityInformation:
case NalUnitType.Reserved:
{
return;
}
case NalUnitType.FragmentationUnitA:
{
if (count > 2)
{
var fuHeader = packetData[++offset];
var start = (fuHeader & 0x80) >> 7 > 0;
++offset;
var fragmentSize = count - offset;
if (start)
{
var nalHeader = (byte)((firstByte & 0xE0) | (fuHeader & Binary.fiveBitMaxValue));
Buffer.Write(NalUnitType.StartCode, 0, 3);
Buffer.WriteByte(nalHeader);
}
if (fragmentSize > 0)
{
Buffer.Write(packetData, offset, fragmentSize);
}
}
return;
}
default:
{
// default becomes 1.
if (nalUnitType == 6 || nalUnitType == 7 || nalUnitType == 8)
{
Buffer.WriteByte(0);
}
Buffer.Write(NalUnitType.StartCode, 0, 3);
Buffer.Write(packetData, offset, count - offset);
return;
}
}
我取缓冲区,然后将其写入h264文件,清除缓冲区并接收更多数据包,SPS,PPS,SEI,I slice和P slice的顺序与出现的有效信息一致。
视频的质量看起来很不错,但这样做很奇怪。
显然我在这里做错了什么,希望有人能说清楚。
干杯。
修改
原来我不总是得到29 P片。查看帧编号,有时当我得到第29个P切片时,下一个数据包不是SPS,而是另一个帧数为20的P切片,然后再次计数到29,然后我得到我的SPS。
看起来这就是为什么跳过发生的原因,因为有太多的P切片并且尚未将数据包放在一起。但为什么每隔10秒左右呢?