通过RTP捕获H.264在播放后提前跳过

时间:2016-04-28 18:45:03

标签: c# h.264

我真的很难过这个,我现在已经看了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秒左右呢?

0 个答案:

没有答案