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

How do I add ADTS header when reading m4a raw data from iPod library?

Objective

正在读取通过 AVAssetReader 从 iTunes Store 购买的 m4a 文件。 通过 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" 进行流式传输。我想你有两个选择:

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

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

无论哪种方式,您都需要调用 CMSampleBufferGetAudioStreamPacketDescriptionsCMSampleBufferCallBlockForEachSample 以从 CMSampleBufferRef.

获取单独的 AAC 数据包