确定核心audioAudioBuffer中的帧数

我正在尝试访问iPhone / iPad上的audio文件的原始数据。 我有下面的代码,这是我需要的path基本开始。 但是,我有一个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; } } } 

本质上我不知道如何知道每个缓冲区有多less帧,所以我不能可靠地从中提取数据。 我是新来处理原始audio数据,所以我打开如何最好地读取AudioBuffer结构的mData属性的任何build议。 过去我也没有用过空指针,所以在这方面的帮助也会很大!

audioBuffer.mDataByteSize告诉你缓冲区的大小。 你知道吗? 只要incase你没有你不能看结构AudioBuffer的声明。 你应该总是看看头文件以及文档。

为了使mDataByteSize有意义,你必须知道数据的格式。 输出值的计数是mDataByteSize / sizeof(outputType)。 然而,你似乎对格式感到困惑 – 你必须在某处指定它。 首先你把它当作一个16位有符号整数

SInt16 *frames = audioBuffer.mData

那么你把它当作32位浮点数

Float32 currentFrame = frames[i] / 32768.0f

中间你假设有24000个值,当然如果没有24000个16位值,这个值会崩溃。 另外,您将数据称为“框架”,但您真正意义的是样本。 您称为“currentFrame”的每个值都是audio的一个样本。 “框架”通常指的是像.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,但我留下来清楚。

Interesting Posts