首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定核心音频AudioBuffer中的帧数

确定核心音频AudioBuffer中的帧数
EN

Stack Overflow用户
提问于 2010-11-29 06:13:23
回答 1查看 6.6K关注 0票数 7

我正在尝试访问iPhone/iPad上的音频文件的原始数据。我有以下代码,这是我所需要的路径的基本开始。然而,一旦我有了AudioBuffer,我就被难住了。

代码语言:javascript
复制
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属性的建议。我在过去也没有做过太多关于空指针的工作,所以在这种情况下对它的帮助也会很大!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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位固定型)

代码语言:javascript
复制
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,但为了清楚起见,我把它留在了里面。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4299419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档