ts nalu到mp4 mdat似乎既不包含nalu也不包含avcc

时间:2016-11-06 08:43:18

标签: ffmpeg mp4 h.264 mpeg2-ts muxer

我创建了一个java程序来解析mp4和ts段。我将一个带有ffmpeg的ts片段复制到mp4中。我试图理解为什么ffmpeg以它的方式形成了mdat。

以下是从十六进制的TS-PES中提取的原始4 NALU,按起始码( fig.1 )排序:

00 00 00 01 |09 e0
00 00 00 01 |67 42 c0 0d 96 56 1e 33 7f e0 08 00 05 be a0 a0 a0 be 00 00 07 d0 00 00 ea 61 28
00 00 00 01 |68 da 8f 20
00 00 00 01 |65 88 80 40 20 7f 3e 21 11 c2 18 78 b0 00 40 81 0e 04 1a 24 05 48 09 84 67 36 61 14 33 8f eb 05 d6 a5 e4 1e 34 d1 f8 65 08 8c 00 f0 00 ...

根据我的解析器( fig.2 ),它们看起来像合法的NALU:

fzb:false nri:0x0 nut:9 [[DATA]] : 09 E0
fzb:false nri:0x3 nut:7 seq_parameter_set_rbsp [[DATA]] : 67 42 C0 0D 96 56 1E 33 7F E0 08 00 05 BE A0 A0 A0 BE 00 00 07 D0 00 00 EA 61 28
fzb:false nri:0x3 nut:8 pic_parameter_set_rbsp [[DATA]] : 68 DA 8F 20
fzb:false nri:0x3 nut:5 slice_layer_without_partitioning_rbsp() fmis:0 st:7(I_2) ppsi:0x0 [[DATA]] : 65 88 80 40 20 7F 3E 21 11 C2 18 78 B0 00 40 81 0E 04 1A 24 05 48 09 84 67 36 61 14 33 8F EB 05 D6 A5 E4 1E 34 D1 F8 65 08 8C 00 F0 00

然后我的多重mp4 mdat被SampleTableBox分块包含这个十六进制数据,按照格式错误 NALU&#39; s 图3 的顺序排列:< / p>

00 00 00 02 |09 e0
00 00 00 1b |67 42 c0 0d 96 56 1e 33 7f e0 08 00 05 be a0 a0 a0 be 00 00 07 d0 00 00 ea 61 28
00 00 00 04 |68 da 8f 20
00 00 1e ac |65 88 80 40 20 7f 3e 21 11 c2 18 78 b0 00 40 81 0e 04 1a 24 05 48 09 84 67 36 61 14 33 8f eb 05 d6 a5 e4 1e 34 d1 f8 65 08 8c 00 f0 00

请注意ITU-T H264 7.4.1中上述数据的简写参考:

fbz = forbidden_zero_bit
nri = nal_ref_idc
nut = nal_unit_type
fmis = first_mb_in_slice
st = slice_type
ppsi = pic_parameter_set_id

另请注意,有效负载是相同的。

我认为mp4是正确的,因为它可以在任何播放器中正常工作。但是我不确定mdat多路复用器对NALU起始码做了什么。我对此有点陌生,并且很难弄清楚为什么会这样。

他们看起来不像NALU,因为起始代码并不以01结尾。

有人建议它们是AvcC(ISO / IEC 14996-15 5.2.4.1.1),但是每个数据集中的第一个字节以00表示,就像NALU一样,并且不会通过configurationVersion测试(第一个字节01)。

我想知道在这种情况下mdat是如何规范的。如果有人能够指出我正确的方向或未被充分利用的大部分,我将非常感激。谢谢!

1 个答案:

答案 0 :(得分:1)

看起来您正在尝试将MP4 mdat解析为H.264的附件B格式,这是不正确的,因为MP4使用AVCC格式用于H.264。在Possible Locations for Sequence/Picture Parameter Set(s) for H.264 Stream

中对这种格式有很好的解释