目标

读取通过m4a从iTunes Store购买的AVAssetReader文件。
通过HTTP流,并由MobileVLCKit使用。

我尝试过的

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

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 header ?

最佳答案

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

更新
我的错,您说得对。我以为通常的0xFFF同步字是AAC的一部分,而是ADTS header 。因此,您必须在每个AAC数据包中添加一个ADTS header ,以将其作为ADTS或“aac”流式传输。我认为您有两种选择:

  • 使用AudioFileInitializeWithCallbacks + kAudioFileAAC_ADTSType获取AudioFile API来为您添加 header 。您将AAC数据包写入AudioFileID,它将从可在ADTS中流式传输AAC的位置调用写回调。
  • 自己将标题添加到数据包中。它们只有7个字节(9个带校验和,但谁使用它们?)。一些可读的实现herehere

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

    关于ios - 从iPod库读取m4a原始数据时,如何添加ADTS header ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29815429/

    10-11 23:51