我正在尝试找出适当的技术,以便在使用iPhone上的AudioFileStream和AudioQueue API播放时,在MP4(或M4A)音频文件中寻求在MP4(或M4A)中寻求。

如果我将完整的MP4标头(直至MDAT框)传输到打开的AudioFileStream,则正确识别了基础音频文件类型(在我的情况下为AAC),然后当我通过文件的实际MDAT数据部分时,AudiofileStreamemestream,正确地开始生成音频数据包,这些音频数据包可以发送到AudioQueue和播放作品。

但是,如果我尝试一种随机访问方法来播放文件,除非我总是将MDAT框的第一帧发送到AudioFileStream,否则我似乎无法使其正常工作。相反,如果将MP4标头发送到AudioFileStream之后,我试图通过首先调用AudiofileStreamSeek(),然后尝试将MDAT的后面跳到MDAT的以后帧,然后传递关联数据包的数据,AudioFileStream似乎会生成音频数据包,似乎是Audio tausate Audio Packets,它似乎是但是,当我将它们传递到AudioQueue并致电AudioQueUeprime()时,我总是会返回“ nope”的错误。

我的问题是:在尝试随机播放MP4文件中的其他数据包之前,我是否总是需要至少在MDAT框的第一个数据包中传递?

我似乎找不到有关使用AudioFileStream和AudioQueue的MP4文件部分随机播放的任何文档。我发现了Apple的QuickTime文件格式PDF,该格式描述了在MP4文件中随机寻找的技术,但这只是一个高级描述,并且没有提及使用特定API(例如AudiofileStream)。

感谢您的任何见解。

有帮助吗?

解决方案

事实证明,我使用AudioFileStreamSeek()使用的方法是有效的,我只是没有将完整的初始MP4标头发送到AudioofileStreamParseBytes()例程。

问题是我认为这些数据包在MDAT框标签之后立即开始。通过检查AudioFileStream属性侦听器回调返回的数据偏移值(KaudiofileStreamProperty_dataOffset),我发现数据包数据的真实开始段是18个字节。

这些18个字节被认为是初始MP4标头的一部分,必须将其发送到AudiofileStream解析器,然后再将呼叫的任意数据包数据发送到AudioFileSteAmseek()。

如果这些额外的字节被排除在外,那么即使您可能已将有效的分析音频数据包发送到AudioQueue,AudioQueUeprime()调用始终会失败。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top