【问题标题】:Identify audio sample in MDAT Atom without MOOV Atom在没有 MOOV Atom 的情况下识别 MDAT Atom 中的音频样本
【发布时间】:2014-06-06 11:38:54
【问题描述】:

我正在尝试通过 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 Atom,我当然没有,因为它是直播。

考虑到所有这些,是否有人知道在没有来自 MOOV Atom 的信息的情况下识别 MDAT Atom 中的音频样本片段的方法?一旦我弄清楚了,我就可以回家了。

提前感谢您的任何见解。

【问题讨论】:

    标签: ios objective-c audio video mp4


    【解决方案1】:

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

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

    也许这会帮助其他人在未来看到同样的道路。

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

    【讨论】:

    • 嗨,丹,我也在尝试实现同样的方法,如果可能的话,请您指导我正确的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多