从 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" 进行流式传输。我想你有两个选择:
使用 AudioFileInitializeWithCallbacks
+ kAudioFileAAC_ADTSType
得到 AudioFile
API 为您添加 header。您将 AAC 数据包写入 AudioFileID
,它将从您可以在 ADTS 中流式传输 AAC 的位置调用您的写入回调。
自己将 header 添加到数据包中。它们只有 7 个字节(9 个带有校验和,但谁使用它们?)。一些可读的实现 here and here
无论哪种方式,您都需要调用 CMSampleBufferGetAudioStreamPacketDescriptions
或 CMSampleBufferCallBlockForEachSample
以从 CMSampleBufferRef
.
获取单独的 AAC 数据包
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" 进行流式传输。我想你有两个选择:
使用
AudioFileInitializeWithCallbacks
+kAudioFileAAC_ADTSType
得到AudioFile
API 为您添加 header。您将 AAC 数据包写入AudioFileID
,它将从您可以在 ADTS 中流式传输 AAC 的位置调用您的写入回调。自己将 header 添加到数据包中。它们只有 7 个字节(9 个带有校验和,但谁使用它们?)。一些可读的实现 here and here
无论哪种方式,您都需要调用 CMSampleBufferGetAudioStreamPacketDescriptions
或 CMSampleBufferCallBlockForEachSample
以从 CMSampleBufferRef
.