AVAssetReader无法读取整个文件?

3
我正在iOS上使用AVAssetReader和AVAssetReaderTrackOutput从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);

我在这里做错了什么?


我不确定你看到的是否是问题,但我怀疑CMBlockBuffer函数仅复制音频流数据包,而忽略了包含解码数据所需信息的音频文件头。你在十六进制编辑器中比较了输入/输出文件吗? - Costique
是的,这个问题很老了。你必须使用其他方法检索头文件(音频流描述)。块缓冲区只是原始音频。 - user187676
1个回答

0

没错,我猜对了。 copyNextSampleBuffer 确实省略了 AAC 头文件,因此媒体播放器 API 无法处理该文件。

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


旧问题,我知道,但你最终使用了哪些方法来获取流描述?在我的初始搜索中找不到任何东西。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接