在没有MOOV Atom的MDAT Atom中识别音频样本

时间:2014-06-06 11:38:55

标签: ios objective-c audio video mp4

我正在尝试从ios设备上通过RTSP编写实时视频广播器。我正在使用AVAssetWriter,所以我可以利用硬件编码。要通过RTSP发送,我必须从MOOV块中获取avcC信息,但是当您完成会话时,MOOV块仅从AVAssetWriter写入,当然,由于我正在实时流式传输,因此未完成。

通过编码,编写,然后完成单个样本缓冲区到文件,以及解析文件以获取avcC信息,我已经了解了这个视频。这很好用。

之后对于实时流,由于AVAssetWriter只会写入文件,我将其写入文件,然后使用追踪文件偏移从该文件读取。当我只使用视频进行此操作时,我可以在写入的文件中从MDAT Atom读取Nalu,而没有任何MOOV信息,因为每个Nalu的大小在Nalu的前4个字节中给出。所以我可以读取该数量,处理它,并通过RTSP流发送它。所以只有视频,一切都运行得很好,我得到了一个真正好的高清流到流服务器。

我现在遇到的问题是当我尝试将音频合并到麦克风的流中时。我可以使用AVAssetWriter对其进行编码,我可以使用适当的交错格式化mp4文件进行读取,但与H264 Nalu不同,文件中的音频样本不具有样本的大小作为其第一个字节。到目前为止,我可以看到定义的唯一方法是使用MOOV中的STSZ和STCO Atoms,当然我没有,因为它是一个实时流。

考虑到所有这些,有没有人知道如何在没有MOOV Atom信息的情况下识别MDAT Atom中的音频样本段?我一想到这一点,我就回家了。

提前感谢任何见解。

1 个答案:

答案 0 :(得分:1)

经过大量的研究和电子邮件发送给人们,我至少得到了答案,答案是,我不能这样做。通常,没有索引的流中的AAC样本被包装在ADTS头中,该头包含数据包的长度字段。但是,由于我使用AVAssetWriter作为音频,并且AVAssetWriter直接写入MP4文件,因为将在MOOV Atom中的索引,ADTS包装被剥离。

因此,我必须以不同方式对音频进行编码,可能是通过音频队列服务进行编码,并在应用于RTSP流时将其合并到视频数据包中。

也许这将有助于其他人在未来看不起这条道路。

非常感谢Geraint Davies在http://www.gdcl.co.uk带领我走上了正确的道路。