从Quicktime MOV文件中解析H.264 NAL单元

4
我正在尝试从iPhone的MOV文件中获取h.264 NAL单元,以便从iPhone相机向服务器传输RTP h.264视频。由于Apple的API不允许直接访问相机输出的编码比特流,因此我只能在MOV文件被写入时访问它。我已经按照苹果的MOV结构参考链接解析了MOV文件为“原子”,但现在需要从“mdat atom”中提取“NAL units”才能将其打包到RTP并进行流式传输。由于我找不到关于“mdat结构”的文档,所以希望得到一些帮助。谢谢!

Steve McFarlin(http://stackoverflow.com/users/227021/steve-mcfarlin)有这样一个库。 - magma
@avishic 你最终是如何解决这个问题的?你使用了任何库还是手动解析帧?能否在这里发布你的问题答案?谢谢。 - some.birdie
1
@Anastasia 还没有完全解决。如果mdat包含多个视频通道,则解析它似乎非常复杂。但是,如果只包含一个视频通道,则mdat只是NAL单元的集合。因此,根据它们的头(mdat和nal单元),您可以知道每个nal单元中有多少字节,并自行解析它。虽然不是理想的解决方案,但是可以工作。 - Avishay Cohen
@avishic,现在你可以从硬件编码器获取H.264帧了,对吗?你能分享一下你的代码吗?请联系我(查看我的个人资料)。 - some.birdie
@Anastasia 抱歉,我不能分享代码,因为它有法律权利。但请查看上面问题中关于原子和mdat的苹果文档链接。 - Avishay Cohen
@avishic SPS/PPS在文件完成之前不会被编写。那么你怎么获取它们?你使用“流式传输”快速时间文件设置movieFragmentInterval属性,以便在任何其他帧之前编写SPS+PPS吗?或者...? - some.birdie
1个回答

3
mdat原子是一个包含大量数据的二进制块,单独看并没有意义。要理解其中的内容,必须首先解析moov原子。你提到你将MOV文件分解为原子 - 你有没有深入挖掘除了moov、mdat、ftyp和其他一些顶层原子之外的内容?你需要解析moov原子(其中包含大量原子)以获取所需的数据(额外的编解码器数据附加到与H.264 stsd原子组合的数据中,后者又与由stco或co64原子索引的H.264块的数据相结合)。
或者使用一个已经为您完成所有繁琐工作的库。

3
嗨,Mike,我不能使用其他库,因为所有库都假定文件是封闭的,而我正在解析一个在读取时编写的文件。如果我只使用单个H264视频轨道,那么从'mdat'中获取NAL单元并不难 - 它是唯一的东西(实际上,它们的头部被其大小替换)。如何使用'moov'原子信息来解析同时包含音频的文件?有什么好的参考资料吗?谢谢! - Avishay Cohen

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