[英]FFMPEG audio decoding: efficient conversion from short to float sample buffer
[英]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.