目标
读取通过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的位置调用写回调。 无论哪种方式,您都需要调用
CMSampleBufferGetAudioStreamPacketDescriptions
或CMSampleBufferCallBlockForEachSample
来从CMSampleBufferRef
获取单个AAC数据包。关于ios - 从iPod库读取m4a原始数据时,如何添加ADTS header ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29815429/