簡體   English   中英

修改音頻樣本緩沖區的音量增益

[英]Modify volume gain on audio sample buffer

我想用語音數據增加緩沖區的音量。 關鍵是我正在使用DirectSound,我有一個主緩沖區和一個輔助緩沖區 - 所有流混合都是手工完成的。 在語音聊天中,所有參與者可以具有獨立的音量級別。 我將每個流數據乘以一個值(增益)並將其加到一個緩沖區。 一切正常,但當我嘗試將數據乘以大於1.0f的值時 - 我聽到一些剪輯或什么。

我嘗試使用Audacity效果壓縮器,但這無助於減少奇怪的噪音。

可能我應該以其他方式改變收益? 或者只是使用另一種后處理算法?

更新:哇,我剛發現有趣的事情! 在增加音量之前,我已經放棄了音頻。

這是照片 剪輯的音頻

對不起質量 - 我認為這應該是聲音出現的方式(我自己畫了紅線)。 真的看起來像超過樣本數據類型的值。 但我無法理解為什么? 我的samplebuffer是BYTE,但我只通過短指針訪問它。 它已簽名但即使* ptr約為15-20萬時也會發生剪輯。

對於每個樣本 - 將其轉換為更大的數據類型 - 如果您有16位簽名樣本,它們最初適合SHORT - 從流中提取它,然后轉換為本地double,然后乘以,然后CLIP,然后轉換回SHORT。

它必須以這種方式工作......

如果需要,我甚至可以提供代碼示例。

編輯:

您的圖片確實證明您在乘法之前沒有擴展到更大的類型 - 您無法在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++;

還有一個編輯:

如果你有幾個聲音 - 首先將它們全部加倍 - 然后加入每個聲音 - 然后添加它們 - 並將它們作為最后一步進行CLIP。

還有一個編輯(+ 1s鼓舞了我):

如果你有STEREO,同樣的東西也會起作用,只計算所有的樣本x2即

number of shorts number of samples = number of samples * 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM