使用C#解码H264帧

5
我正在使用 C# 中的托管媒体聚合 - https://net7mma.codeplex.com/
我有一个 RTSP 客户端,接收经 h264 编码(负载类型为 96)的 RTP 帧。我想将帧保存到视频文件中,并能够知道视频何时开始\结束。
我阅读了一些资料,得知逐帧解码 h264 帧是个问题,但没真正理解为什么。
以下是我接收到每个 RTP 帧时引发的方法:
void Client_RtpFrameChanged(object sender, Media.Rtp.RtpFrame frame)
{
    // Decode
}
  1. 有人能解释一下为什么逐帧解码h264会有问题吗?
  2. 有没有开源/库/DLL可以做到这一点?

非常感谢!


你只能逐帧解码IDR帧,因为所有其他帧类型都引用了其他帧。例如,在IDR帧之后的P帧将引用IDR帧,因此您需要同时解码这两个帧才能解码P帧。 - wimh
1个回答

2

RtspServer项目中包含了一个内置类。

这个类叫做RFC6184Media,它包含了分组和解组的方法,并处理了所有定义的NAL单元类型。

在调用Depacketize后,会生成一个包含原始比特流有效载荷的缓冲区,您需要添加一个由0x000001组成的起始代码,然后再添加原始比特流中包含的数据。

在项目的讨论区中有几个示例。

之后,您可以将流传输给解码器进行解码,然后才能显示帧;通常是通过从编码时使用的子采样率转换为YUV到RGB。

我可以尝试添加一个小型演示,展示如何实现所需的结果,其中包括一些静态数据包,对应于一帧。

如果您在项目页面上发表讨论,我可能会更快地回复。


1
我最近更新了源代码,包括这样一个例子,请告诉我如果你有其他问题。 - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接