【问题标题】:Zero-padded h264 in mdatmdat 中的零填充 h264
【发布时间】:2015-03-10 13:27:37
【问题描述】:

我想用从 Android 手机记录的 h.264 数据做一些事情。

我的同事告诉我,mdat 之后应该有 4 个字节,它指定了 NALU 大小,然后是一个字节与 NALU 元数据,然后是原始数据,然后(在 NALU 大小之后),另外 4 个字节与另一个 NALU 大小和以此类推。

但我在mdat 后面有很多零:

0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0e00000000000000000000000000000000000000000000000000000000000000
8100000000000000000000000000000000000000000000000000000000000000
65b84f0f87fa890001022e7fcc9feef3e7fabb8e0007a34000f2bbefffd07c3c
bfffff08fbfefff04355f8c47bdfd05fd57b1c67c4003e89fe1fe839705a699d
c6532fb7ecacbfffe82d3fefc718d15ffffbc141499731e666f1e4c5cce8732f
bf7eb0a8bd49cd02637007d07d938fd767cae34249773bf4418e893969b8eb2c

mdat 之前的原子只是 ftyp mp42isom mp42free 原子。所有其他原子(moov,...)都在文件的末尾(这就是 Android 所做的,当它写入套接字而不是文件时)。但是如果有必要,我已经从其他文件中获取了 PPS 和 SPS,并在此之前记录了相同的相机和编码器设置,只是为了获取这些 PPS 和 SPS 数据。

那么我究竟如何从中获得 NALU?

【问题讨论】:

    标签: h.264 mp4


    【解决方案1】:

    你不能。 moov atom 包含解析 mdat 所需的信息。没有它,mdat 就没有什么价值了。例如,第一个 NALU 不需要从 mdat 的开头开始,它可以在 mdat 内的任何位置开始。它开始的字节记录在(我相信)stco 框中。如果文件有音频,您会发现在 mdat 中混合了音频和视频,如果没有块偏移,则无法确定什么是什么。此外,如果视频有 B 帧,没有 cts 就无法确定渲染顺序,同样只能在 moov 中使用。从技术上讲,nalu 的大小不需要是 4 个字节,如果没有 moov,你就无法知道这一点。我建议不要使用 mp4。使用可流式传输的容器,例如 ts 或 flv。现在,如果您可以对生成文件的代码做出一些假设;就像块偏移总是一样的,并且没有 b 帧,你可以硬编码这些值。但不保证在软件更新后可以正常工作。

    【讨论】:

    • 好吧,我的代码在 80% 的时间里都能正常工作(很多类型为 1 的 NALU,有时是类型 5)。但有些时候,一开始就有那些零,然后就变成了香蕉。不幸的是,我无法在 Android 中轻松使用 mpeg4 和 3gpp 等其他容器。我知道mdat 中只有视频。
    • 那么我认为你需要完全跳过容器并使用 MediaCodec 的原始输出缓冲区。
    • 如果可以的话,我会的。但是我们想支持 Android 2.3,所以我必须使用MediaRecorder,创建ParcelFileDescriptor.createPipe() 并将一个文件描述符传递给MediaRecorder,另一个传递给处理线程并从管道读取。我有时会得到这个零填充的二进制文件。
    • github.com/fyhertz/libstreaming/blob/master/src/net/… 稍微修改过的版本就是我解决它的方法。它似乎有效。 :)
    • 太棒了,很高兴你有一个工作解决方案。我通常会尝试在我的答案中提供通用解决方案。有时可以通过做出一些假设来制定具体的解决方案。
    猜你喜欢
    • 2019-05-28
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2020-12-19
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    相关资源
    最近更新 更多