作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为我的应用程序制作一个音量计,它将在录制视频时显示。我发现很多对 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..
}
SInt16
,或“16 位有符号整数”,据我所知,其范围为
-32,768
至
32,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);
关于ios - 如何解释 AudioBuffer 并获得权力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25253291/
我是一名优秀的程序员,十分优秀!