我正在尝试访问iPhone/iPad上的音频文件的原始数据。我有以下代码,这是我所需要的路径的基本开始。然而,一旦我有了AudioBuffer,我就被难住了。
AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:urlAsset error:nil];
AVAssetReaderTrackOutput *assetReaderOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[urlAsset tracks] objectAtIndex:0] outputSettings:nil];
[assetReader addOutput:assetReaderOutput];
[assetReader startReading];
CMSampleBufferRef ref;
NSArray *outputs = assetReader.outputs;
AVAssetReaderOutput *output = [outputs objectAtIndex:0];
int y = 0;
while (ref = [output copyNextSampleBuffer]) {
AudioBufferList audioBufferList;
CMBlockBufferRef blockBuffer;
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(ref, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer);
for (y=0; y<audioBufferList.mNumberBuffers; y++) {
AudioBuffer audioBuffer = audioBufferList.mBuffers[y];
SInt16 *frames = audioBuffer.mData;
for(int i = 0; i < 24000; i++) { // This sometimes crashes
Float32 currentFrame = frames[i] / 32768.0f;
}
}
}从本质上说,我不知道如何判断每个缓冲区包含多少帧,所以我不能可靠地从中提取数据。我刚开始处理原始音频数据,所以我愿意听取任何关于如何最好地阅读AudioBuffer结构的mData属性的建议。我在过去也没有做过太多关于空指针的工作,所以在这种情况下对它的帮助也会很大!
发布于 2010-11-29 07:07:07
audioBuffer.mDataByteSize会告诉您缓冲区的大小。你知道这个吗?为了防止您不了解,您不可能看过结构AudioBuffer的声明。您应该始终查看头文件和文档。
要使mDataByteSize有意义,您必须知道数据的格式。输出值的计数为mDataByteSize/sizeof(outputType)。但是,您似乎对格式感到困惑--您一定是在某个地方指定了它。首先,您将其视为一个16位带符号的int
SInt16 *frames = audioBuffer.mData
然后将其视为32位浮点数
Float32 currentFrame = frames[i] / 32768.0f
在这两者之间,假设有24000个值,当然,如果没有恰好24000个16位值,这将会崩溃。此外,您将数据称为“帧”,但您真正的意思是样本。你称之为“currentFrame”的每个值都是音频的一个样本。“‘Frame”通常指的是像.mData这样的样本块
因此,假设数据格式为32位浮点型(请注意,我不知道是否为浮点型,可能是8位整型,也可能是32位固定型)
for( int y=0; y<audioBufferList.mNumberBuffers; y++ )
{
AudioBuffer audioBuffer = audioBufferList.mBuffers[y];
int bufferSize = audioBuffer.mDataByteSize / sizeof(Float32);
Float32 *frame = audioBuffer.mData;
for( int i=0; i<bufferSize; i++ ) {
Float32 currentSample = frame[i];
}
}注意,sizeof(Float32)总是4,但为了清楚起见,我把它留在了里面。
https://stackoverflow.com/questions/4299419
复制相似问题