我使用NVENC SDK对OpenGL帧进行编码,并在RTSP上对它们进行流。NVENC以几个NAL单元的形式给我编码数据。为了使用Live555对它们进行流处理,我需要找到启动码 (0x000x000x01)并删除它。我想避免这次手术。
NVENC有一个sliceOffset属性,我可以参考,但它表示片,而不是NAL单元。它只指向SPS和PPS头的结尾,实际数据从这里开始。我知道一个片段不等于一个NAL (如果我错了,请纠正我)。我已经在强制对编码数据进行单片处理。
有下列任何一种可能吗?
发布于 2014-09-26 18:46:49
似乎有一个点,每一个人试图在RTSP/RTP上做H.264可以归结为这个问题。这是我的两分钱:
1)有一个接入单元的概念。接入单元是一组表示编码帧的NAL单元(也可以是唯一的)。这就是你应该工作的逻辑层次。如果您想要编码器给您单个NAL单元,那么当编码过程从一个原始帧(例如SPS + PPS +编码图片)产生多个NAL单元时,您期望的是什么行为。尽管如此,还是有一些方法可以配置编码器以减少访问单元中的NAL单元数量(比如不包括AUD NAL,不重复SPS/PPS,不包括SEI NAL )--有了这些知识,您实际上可以知道期望什么,并强制编码器为每个帧提供单个NAL(当然,这并不适用于所有帧,但有了您对解码器所能处理的了解)。我不是NVENC的专家,我也刚刚开始使用它,但至少对于Intel Quick,关闭AUD,SEI和禁用PPS/SPS的重复使用给了我大约1 NAL的帧2 N.
2)无法回答这个问题,因为正如我所提到的,我对API并不熟悉,但我对此深表怀疑。
3) SPS和PPS应该位于第一个访问单元(从编码器获得的第一个比特流),您可以在比特流中找到正确的NAL并提取它们,或者可能有一个特殊的API调用来从编码器获取它们。
尽管如此,我并不认为实际运行比特流、解析开始代码和提取NAL单元的代码并将它们一个接一个地提供给Live555并不难。当然,如果编码器提供以AVCC格式输出比特流(与起始代码或附件B相比,它使用NAL单元之间的交错长度值,所以您可以跳到下一个单元而不查找前缀),那么您应该使用它。当只是RTP时,很容易自己实现传输,因为我在GStreamer方面运气不好,它没有对FU-A分组化的适当支持,如果使用RTSP,传输基础设施的开销更大,使用第三方库(如Live555 )是合理的。
https://stackoverflow.com/questions/26058428
复制相似问题