- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想增加语音数据缓冲区的音量。关键是我正在使用 DirectSound,并且我有一个主缓冲区和一个辅助缓冲区 - 所有流混合都是手动完成的。在语音聊天中,所有参与者都可以有独立的音量级别。我将每个流数据乘以一个值(增益)并将其加到一个缓冲区中。一切正常,但当我尝试将数据乘以大于 1.0f 的值时 - 我听到一些削波或其他声音。
我试过使用 Audacity 效果压缩器,但这无助于减少奇怪的噪音。
也许我应该以其他方式修改增益?或者只是使用另一种后处理算法?
更新:哇,我刚刚发现了一件有趣的事情!我在增加音量之前和之后都转储了音频。
这是图片
对不起质量 - 我认为这就是声音应该出现的方式(我自己画了红线)。看起来值确实超出了示例数据类型。但我不明白为什么?我的样本缓冲区是 BYTE,但我只能通过短指针访问它。它已签名,但即使 *ptr 约为 15-20 千时也会发生裁剪。
最佳答案
对于每个样本 - 将其转换为某种更大的数据类型 - 如果您有 16 位有符号样本,它们最初适合 SHORT - 从流中提取它,然后转换为本地 double ,然后乘法,然后 CLIP,然后转换回做空。
它必须这样工作......
如果需要,我什至可以提供代码示例。
编辑:
您的图片是您在乘法之前没有扩展到更大类型的确切证据 - 您无法在 SHORT 上“捕获”裁剪条件,因为它会自动换行。
short* sampleBuffer;
...
short sample=*sampleBuffer;
double dsample=(double)sample * gain;
if (dsample>32767.0) {dsample=32767.0;}
if (dsample<-32768.0) {dsample=-32768.0;}
*sampleBuffer=(short)dsample;
sampleBuffer++;
还有一个编辑:
如果您有多个声音 - 首先将它们全部加倍 - 然后对每个声音进行增益 - 然后添加它们 - 最后将它们剪辑。
再编辑(+1 激励我):
如果你有 STEREO,同样的东西也可以工作,只需计算所有样本 x2 即
短裤数量
=
样本数量
*
2
.
关于c++ - 修改音频样本缓冲区的音量增益,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4300995/
我试过了 alBufferf (myChannelId, AL_MAX_GAIN (and AL_GAIN), volumeValue); 并收到错误0xA002。 最佳答案 0xA002是Linux
我正在使用 Matlab 从 2 点灰度相机 (Flea2) 捕捉图像,我想更改相机的一些参数,例如自动曝光、增益和快门速度。到目前为止,我已经使用了这些命令: %Creating the two v
我正在尝试调整网络摄像头的亮度。我需要 3 张不同亮度设置的不同照片。我不想让它成为手动的,所以如果想在程序中包含设置。 下面是我正在使用的代码。使用方法 GetFrame() 可以从网络摄像头获取下
我想问一个我试图自己回答但无法想出任何解决方案的问题。 我想知道任何具有这些属性的算法(或者是否有可能至少证明一个算法是否存在) +-----------+ status_
我有一个OSX应用程序,该应用程序使用音频单元记录音频数据。可以将音频单元的输入设置为任何可用的输入源,包括内置输入。问题是,我从内置输入获得的音频经常被剪切,而在诸如Audacity(甚至Quick
我是一名优秀的程序员,十分优秀!