2013-02-22 131 views
1

我从IP摄像头处理H.264 RTP流。我使用的相机将每个I帧分成几个NAL单元,每个单元都被分成RTP包(开始和结束标志确定每个单元的尺寸,而不是帧的尺寸)。确定RTP流中H.264 I帧的末端

我怎么能知道帧传输何时完成,并且我有足够的数据来解压缩它?由于帧由多个单元组成 - 标志不能用于确定其结束。

我工作的大多数摄像机将每帧分割为RTP包,其中标志确定帧的开始和结束。所以我从这个等待结束标志的数据包中解压缩数据 - 这里是一个完整的框架。

NAL单元,我从这个摄像头获取的顺序是:

[NAL_UT_SPS]序列参数集+

[NAL_UT_PPS]图片参数集

[NAL_UT_SEI补充增强信息

[NAL_UT_IDR_SLICE] I帧图像数据的部件#1

[NAL_UT_IDR_SLICE]部分#2 e口帧图象数据

[NAL_UT_IDR_SLICE]零件编号的I帧的3图象数据

[NAL_UT_SLICE]第一P帧

[NAL_UT_SLICE]第二P帧

[ NAL_UT_SLICE]第三P帧

...

从该序列很明显,我可以结合[NAL_UT_SPS] + [NAL_UT_PPS] + [NAL_UT_SEI] + 3 * [NAL_U T_IDR_SLICE]合并为一个I帧,我将最近馈送给解码器。但是,我怎样才能确定有多少图片数据部分?我如何知道何时收到#X部分它不是序列中的最后一个?

任何想法?

回答

0

大多数H.264解码器接受输入流作为NAL。除非你有挑剔的解码器 - 我只是将NAL送入解码器。通常,NAL:帧或者甚至是片段之间不存在1:1关系的保证。

+0

谢谢您的回答。实际上,我强烈需要将NAL单元组合到相应的框架中。我需要的是关于如何确定帧中最后一个NAL单元的一些信息。我从这台相机获得的数据在上面编辑的问题中。 – paft 2013-02-25 06:18:49

2

我解决了这个问题。

的解决方案是:附加到帧的开始的所有非图象单元(NAL_UT_SPS,NAL_UT_PPS,NAL_UT_SEI在上面的例子)和用于容纳图像信息包(NAL_UT_IDR_SLICE,NAL_UT_SLICE)检查first_mb_in_slice字段(其对于第一片图片数据等于0,对于第二,第三等不等)。

因此,如果first_mb_in_slice == 0并且缓冲区包含图片数据,然后返回它并写入新的帧数据到缓冲区,否则只附加数据而不返回帧。这样,当我们开始接收帧#2并且可以确定是新帧时,我们返回帧#1,而不是前一帧的一部分:

[NAL_UT_SPS]帧#1(I)开始

[NAL_UT_PPS]的帧#1继续

[NAL_UT_SEI]的帧#1继续

[NAL_UT_IDR_SLICE]帧#1的图像数据,部分#1:first_mb_in_slice == 0

[NAL_UT_IDR_SLICE]帧#1图片数据,部件#2:first_mb_in_slice> 0

[NAL_UT_IDR_SLICE]帧#1的图像数据,部分#3:first_mb_in_slice> 0

[NAL_UT_SLICE]的帧#2(P)开始:first_mb_in_slice == 0 < - 在这一点,我们将返回第一帧

[NAL_UT_SLICE]帧#3(P)开始:first_mb_in_slice == 0 < - 返回第二帧

[NAL_UT_SLICE]帧#4(P)开始:first_mb_in_slice == 0 < - 返回第三帧

[NAL_UT_SPS]帧#5(我)开始< - 返回4帧

...

+0

是的,这在手动创建AVPacket时与ffmpeg完全兼容。谢谢! – sarsonj 2013-08-08 10:46:22