Objective c Avassetrader没有';你不读整个文件吗?

Objective c Avassetrader没有';你不读整个文件吗?,objective-c,cocoa-touch,ios,avfoundation,Objective C,Cocoa Touch,Ios,Avfoundation,我正在使用Avassetrader和AvassetraderTrack输出从iOS上的iPod库读取音频资源。然而,当我读取数据并将数据块放回一起时,文件并不完全相同。缺少几个kB,因此音频文件无法播放 下面是我用来提取音频数据的代码 // Copy next audio samples CMSampleBufferRef buffer = [[reader_.outputs objectAtIndex:0] copyNextSampleBuffer]; // Extract bytes fr

我正在使用Avassetrader和AvassetraderTrack输出从iOS上的iPod库读取音频资源。然而,当我读取数据并将数据块放回一起时,文件并不完全相同。缺少几个kB,因此音频文件无法播放

下面是我用来提取音频数据的代码

// Copy next audio samples
CMSampleBufferRef buffer = [[reader_.outputs objectAtIndex:0] copyNextSampleBuffer];

// Extract bytes from buffer
CMBlockBufferRef dataBuffer = CMSampleBufferGetDataBuffer(buffer);

size_t bufLen = CMBlockBufferGetDataLength(dataBuffer);
UInt8 buf[bufLen];

CMBlockBufferCopyDataBytes(dataBuffer, 0, bufLen, buf);

// Pass data to delegate
if ([delegate respondsToSelector:@selector(assetStream:hasDataAvailable:)]) {
    [delegate assetStream:self hasDataAvailable:[NSData dataWithBytes:buf length:bufLen]];
}

// Invalidate buffer
CMSampleBufferInvalidate(buffer);

我做错了什么?

是的,我猜对了。
copyNextSampleBuffer
忽略了AAC头,因此媒体播放器API无法处理该文件


您可以使用其他方法复制流描述。

我不确定这是否是您看到的问题,但我怀疑CMBlockBuffer函数仅复制音频流数据包,而忽略了音频文件头,其中包含解码数据包所需的信息。您是否在十六进制编辑器中比较了输入/输出文件?是的,这个问题很老。您必须使用其他方法检索标题(音频流描述)。块缓冲区只是原始音频。我知道这是一个老问题,但你最终使用了什么方法来获取流描述呢。在我的初始搜索中找不到任何内容。