目标
通过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标题?
答案 0 :(得分:1)
首先,您不需要trackOutput
,它与您已经拥有的readerOutput
相同。
<强>更新强>
我的错,你是绝对正确的。我认为通常的0xFFF
同步字是 AAC的一部分,而不是他们的ADTS标头。因此,您必须为每个AAC数据包添加一个ADTS标头,以将它们作为ADTS或&#34; aac&#34;流式传输。我认为你有两个选择:
使用AudioFileInitializeWithCallbacks
+ kAudioFileAAC_ADTSType
获取AudioFile
API为您添加标头。您将AAC数据包写入AudioFileID
,它将从您可以在ADTS中流式传输AAC的位置调用您的写回调。
无论哪种方式,您都需要调用CMSampleBufferGetAudioStreamPacketDescriptions
或CMSampleBufferCallBlockForEachSample
来获取CMSampleBufferRef
的单个AAC数据包。