ios – 确定核心音频AudioBuffer中的帧数

ios – 确定核心音频AudioBuffer中的帧数,第1张

概述我正在尝试访问iPhone / iPad上的音频文件的原始数据.我有以下代码,这是我需要的路径的基本开始.但是,一旦我有了一个AudioBuffer,我就不知道该怎么做了. AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:urlAsset error:nil];AVAssetReaderTrackOutput *a 我正在尝试访问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),&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属性有任何建议.我在过去也没有做过很多关于voID指针的事情,所以在这种情况下对它的帮助也会很棒!

解决方法 audioBuffer.mDataByteSize告诉您缓冲区的大小.你知道吗?只是因为你没有,你不能看看struct AudioBuffer的声明.您应该始终查看头文件以及文档.

要使mDataByteSize有意义,您必须知道数据的格式.输出值的计数是mDataByteSize / sizeof(outputType).但是,您似乎对格式感到困惑 – 您必须在某处指定它.首先,您将其视为16位符号int

SInt16 * frames = audioBuffer.mData

然后你把它当作32位浮点数

float32 currentFrame = frames [i] / 32768.0f

inbetween你假设有24000个值,当然如果没有24000个16bit值,这将会崩溃.此外,您将数据称为“帧”,但您真正的意思是样本.您调用’currentFrame’的每个值都是音频的一个示例. ‘Frame’通常指的是像.mData这样的样本块

所以,假设数据格式是32位浮点数(请注意,我不知道它是否是,它可能是8位int,或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,但我把它留下来清楚.

总结

以上是内存溢出为你收集整理的ios – 确定核心音频AudioBuffer中的帧数全部内容,希望文章能够帮你解决ios – 确定核心音频AudioBuffer中的帧数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1101330.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存