gpt4 book ai didi

ios - 如何解释 AudioBuffer 并获得权力?

转载 作者:行者123 更新时间:2023-12-01 15:36:12 24 4
gpt4 key购买 nike

我正在尝试为我的应用程序制作一个音量计,它将在录制视频时显示。我发现很多对 iOS 仪表的支持,但主要是为 AVAudioPlayer ,这对我来说是没有选择的。我正在使用 AVCaptureSession进行记录,然后以如下所示的委托(delegate)方法结束:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer);

CFRetain(sampleBuffer);
CFRetain(formatDescription);

if(connection == audioConnection)
{
CMBlockBufferRef blockBuffer;
AudioBufferList audioBufferList;

CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer,
NULL, &audioBufferList, sizeof(AudioBufferList), NULL, NULL,
kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment,
&blockBuffer);

SInt16 *data = audioBufferList.mBuffers[0].mData;
}
//Releases etc..
}

(只显示相关代码)

据我了解,我收到一个“样本缓冲区”,其中包含音频或视频。一旦我确认连接确实是音频,然后我从缓冲区中“提取”audioBufferList,我就坐在左边,列出一个(或多个?)audioBuffers。据我了解,实际数据表示为 SInt16 ,或“16 位有符号整数”,据我所知,其范围为 -32,76832,767 .但是,如果我只是打印出这个收到的值,我会得到很多弹跳数字。当处于“沉默”状态时,我得到的值在 -200 之间快速反弹。和 200 ,当有噪音时,我会从 -4,000 获取值至 13,000 ,完全不正常。
正如我从阅读中了解到的,值 0将代表沉默。但是,我不明白负值和正值之间的区别,也不知道它们是否能够一直向上/向下到达 +-32,768 .

我相信我需要一定比例的“响亮”,但一直找不到任何东西。

我已经阅读了一些关于此事的教程和引用资料,但对我来说没有任何意义。我遵循了一个指南(附加到上面的代码,在 if 内):
float accumulator = 0;
for(int i = 0; i < audioBufferList.mBuffers[0].mDataByteSize; i++)
accumulator += data[i] * data[i];
float power = accumulator / audioBufferList.mBuffers[0].mDataByteSize;
float decibels = log10f(power);
NSLog(@"%f", decibels);

显然,这段代码应该与 -1 对齐。至 +1 ,但这并没有发生。我现在得到的值大约是 6.194681当沉默时, 7.773492对于一些噪音。这感觉像是正确的“范围”,但在“错误的地方”。我不能简单地从数字中减去 7 并假设我介于 -1 之间。和 +1 .这应该如何工作背后应该有一些逻辑和科学,但我对数字音频的工作原理知之甚少。

有谁知道这背后的逻辑?在 -32,768 时始终为 0和 32,767噪音很大吗?然后我可以简单地将所有负值乘以 -1总是得到正值,然后找出它们的百分比(0到32767之间)?不知何故,我不相信这会起作用,因为我猜负值是有原因的。我不完全确定要尝试什么。

最佳答案

您问题中的代码在几个方面是错误的。此代码试图从下面的文章中复制它,但您没有正确处理它从文章中的基于浮点数的代码转换为 16 位整数数学。您还循环了错误数量的值(最大 i),最终会拉入垃圾数据。所以这是各种各样的错误。

https://www.mikeash.com/pyblog/friday-qa-2012-10-12-obtaining-and-interpreting-audio-data.html

文章中的代码是正确的。这就是它的内容,扩展了一点。这只是查看 32 位浮点缓冲区列表中的第一个缓冲区。

float accumulator = 0;
AudioBuffer buffer = bufferList->mBuffers[0];
float * data = (float *)buffer.mData;
UInt32 numSamples = buffer.mDataByteSize / sizeof(float);

for (UInt32 i = 0; i < numSamples; i++) {
accumulator += data[i] * data[i];
}
float power = accumulator / (float)numSamples;
float decibels = 10 * log10f(power);

正如文章所说,这里的结果是分贝使用 0dB 引用。例如,0.0 是最大值。例如,这与 AVAudioPlayer 的 averagePowerForChannel 返回的内容相同。

要在 16 位整数上下文中使用它,您需要 a) 适本地循环遍历每个 16 位样本,b) 将 data[i] 值从 16 位整数转换为 [ -1.0, 1.0] 在平方和添加到累加器之前的范围。

关于ios - 如何解释 AudioBuffer 并获得权力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25253291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com