从iPod库中读取m4a原始数据时如何添加ADTS标头?

时间:2015-04-23 06:31:19

标签: ios audio avfoundation libvlc

目标

通过m4a阅读从iTunes Store购买的AVAssetReader文件。 通过HTTP流式传输并由MobileVLCKit消费。

我尝试了什么

据我所知,AVAssetReader只生成音频原始数据,所以我想我应该在每个样本前添加ADTS标题。

NSError *error = nil;
AVAssetReader* reader = [[AVAssetReader alloc] initWithAsset:asset error:&error];
if (error != nil) {
    NSLog(@"%@", [error localizedDescription]);
    return -1;
}

AVAssetTrack* track = [asset.tracks objectAtIndex:0];
AVAssetReaderTrackOutput *readerOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track
                                                                                        outputSettings:nil];
[reader addOutput:readerOutput];
    [reader startReading];
    while (reader.status == AVAssetReaderStatusReading){
        AVAssetReaderTrackOutput * trackOutput = (AVAssetReaderTrackOutput *)[reader.outputs objectAtIndex:0];
        CMSampleBufferRef sampleBufferRef;
        @synchronized(self) {
            sampleBufferRef = [trackOutput copyNextSampleBuffer];
        }
        CMItemCount = CMSampleBufferGetNumSamples(sampleBufferRef);
        ...
    }

所以,我的问题是,如何循环每个样本并添加ADTS标题?

1 个答案:

答案 0 :(得分:1)

首先,您不需要trackOutput,它与您已经拥有的readerOutput相同。

<强>更新
我的错,你是绝对正确的。我认为通常的0xFFF同步字 AAC的一部分,而不是他们的ADTS标头。因此,您必须为每个AAC数据包添加一个ADTS标头,以将它们作为ADTS或&#34; aac&#34;流式传输。我认为你有两个选择:

  1. 使用AudioFileInitializeWithCallbacks + kAudioFileAAC_ADTSType获取AudioFile API为您添加标头。您将AAC数据包写入AudioFileID,它将从您可以在ADTS中流式传输AAC的位置调用您的写回调。

  2. 自己将标题添加到数据包中。他们只有7个字节(9个校验和,但谁使用它们?)。一些可读的实现herehere

  3. 无论哪种方式,您都需要调用CMSampleBufferGetAudioStreamPacketDescriptionsCMSampleBufferCallBlockForEachSample来获取CMSampleBufferRef的单个AAC数据包。