2014-06-06 36 views
1

我正试图通过ios设备在RTSP上编写实况视频广播器。我正在使用AVAssetWriter,所以我可以利用硬件编码。要通过RTSP发送,我必须从MOOV块中获取avcC信息,但MOOV块只有在完成会话时才从AVAssetWriter写入,当然,由于我现场直播,所以当然还没有完成。在没有MOOV的MDAT Atom中识别音频样本原子

我已经通过编码,写入,然后完成单个样本缓冲区到文件,解析文件以获取avcC信息来解决这个问题。这工作得很好。

之后,直播流,因为AVAssetWriter只会写入一个文件,我写它出文件,然后用追逐文件偏移量从该文件读取。当我只用视频做这件事时,我可以在没有任何MOOV信息的情况下从MDAT Atom读取Nalu,因为每个Nalu的大小在Nalu的前4个字节中给出。因此,我可以读取该数量,处理数据,并通过RTSP流发送。因此,只有视频,一切工作完好,我得到真正的高清流到流服务器。

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

考虑到这一切,是否有人知道一种方法来识别MDAT Atom中的音频采样段,而无需MOOV Atom的信息?只要我明白,我就免费。

在此先感谢您的任何见解。

回答

0

经过大量的研究和电子邮件给人们,我至少有一个答案,答案是,我不能这样做。通常情况下,AAC中没有索引的流采样包含在包含数据包长度字段的ADTS报头中。但是,由于我正在使用AVAssetWriter作为音频,并且AVAssetWriter直接写入MP4文件,所以ADTS包装会因MOOV Atom中的索引而被剥离。

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

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

非常感谢Geraint Davies在http://www.gdcl.co.uk的领导下我的正确道路。

+0

嗨丹,我也试图实施相同的请你指导我如果可能的话。 – Dinesh