我正在尝试通过 ios 设备的 RTSP 编写实时视频广播。我正在使用 AVAssetWriter,所以我可以利用硬件编码。要通过 RTSP 发送,我必须从 MOOV block 中获取 avcC 信息,但是 MOOV block 仅在您完成 session 后才从 AVAssetWriter 写入,当然这还没有完成,因为我正在直播。
我通过对视频进行编码、写入、然后将单个样本缓冲区写入文件以及解析文件以获取 avcC 信息来解决此问题。效果很好。
在直播之后,由于 AVAssetWriter 只会写入文件,因此我将其写入文件,然后使用跟踪文件偏移量从该文件中读取。当我仅对视频执行此操作时,我可以从写入文件中的 MDAT Atom 读取 Nalu,而无需任何 MOOV 信息,因为每个 Nalu 的大小在 Nalu 的前 4 个字节中给出。因此,我可以读取该数量,对其进行处理,然后通过 RTSP 流将其发送出去。所以只有视频,一切都很好,我可以将真正好的高清流传输到流服务器。
我现在遇到的问题是当我尝试将音频合并到来自麦克风的流中时。我可以使用 AVAssetWriter 对其进行很好的编码,并且可以从中读取正确的交错格式的 mp4 文件,但是与 H264 Nalu 不同的是,文件中的音频样本的第一个字节没有样本的大小。到目前为止,我能看到的唯一定义方法是使用 MOOV 中的 STSZ 和 STCO Atom,我当然没有,因为它是直播。
考虑到所有这些,是否有人知道在没有来自 MOOV Atom 的信息的情况下识别 MDAT Atom 中的音频样本片段的方法?一旦我弄清楚了,我就可以回家了。
提前感谢您的任何见解。
Best Answer-推荐答案 strong>
经过大量研究和发给人们的电子邮件后,我至少有一个答案,答案是,我不能这样做。通常,没有索引的流中的 AAC 样本包含在 ADTS header 中,该 header 包含数据包的长度字段。但是,由于我将 AVAssetWriter 用于音频,并且 AVAssetWriter 直接写入 MP4 文件,因此由于 MOOV Atom 中的索引,ADTS 包装被剥离。
因此,我必须对音频进行不同的编码,可能是通过音频队列服务,并在应用于 RTSP 流时将其融合到视频数据包中。
也许这会帮助其他人在未来看到同样的道路。
非常感谢 http://www.gdcl.co.uk 上的 Geraint Davies引导我走上正确的道路。
关于ios - 在没有 MOOV Atom 的情况下识别 MDAT Atom 中的音频样本,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/24080961/
|