直播系統原始碼,常見的混音演算法有哪些?
聲音是由於物體的振動對周圍的空氣產生壓力而傳播的一種壓力波,轉成電訊號後經過抽樣,量化,仍然是連續平滑的波形訊號,量化後的波形訊號的頻率與聲音的頻率對應,振幅與聲音的音量對應,在直播系統原始碼中,量化的語音訊號的疊加等價於空氣中聲波的疊加,所以當取樣率一致時,混音可以實現為將各對應訊號的取樣資料線性疊加。反應到直播系統原始碼的音訊資料上,也就是把同一個聲道的數值進行簡單的相加而問題的關鍵就是如何處理疊加後溢位問題。
所以在直播系統原始碼中進行混音之前要先保證需要混合的音訊 取樣率、通道數、取樣精度一樣。
一、平均法
將直播系統原始碼中的每一路的語音線性相加,再除以通道數,該方法雖然不會引入噪聲,但是隨著通道數成員的增多,各路語音的衰減將愈加嚴重。具體體現在隨著通道數成員的增多,各路音量會逐步變小。
public static short[] mixRawAudioBytes(short[][] inputAudios) { int coloum = finalLength;//最終合成的音訊長度 // 音軌疊加 short[] realMixAudio = new short[coloum]; int mixVal; for (int trackOffset = 0; trackOffset < coloum; ++trackOffset) { mixVal = (inputAudios[0][trackOffset]+inputAudios[1][trackOffset])/2; realMixAudio[trackOffset] = (short) (mixVal); } return realMixAudio; }
二、歸一化
全部乘個係數因子,使幅值歸一化,但是個人認為這個歸一化因子是不好確認的。
public static short[] mixRawAudioBytes(short[][] inputAudios) { int coloum = finalLength;//最終合成的音訊長度 float f = divisor;//歸一化因子 // 音軌疊加 short[] realMixAudio = new short[coloum]; float mixVal; for (int trackOffset = 0; trackOffset < coloum; ++trackOffset) { mixVal = (inputAudios[0][trackOffset]+inputAudios[1][trackOffset])*f; realMixAudio[trackOffset] = (short) (mixVal); } return realMixAudio; }
三、 改進後的歸一化
使用可變的衰減因子對直播系統原始碼的語音進行衰減,該衰減因子代表了語音的權重,該衰減因子隨著資料的變化而變化,當資料溢位時,則相應的使衰減因子變小,使後續的資料在衰減後處於臨界值以內,沒有溢位時,讓衰減因子慢慢增大,使資料變化相對平滑。
public static short[] mixRawAudioBytes(short[][] inputAudios) { int coloum = finalLength;//最終合成的音訊長度 float f = 1;//衰減因子 初始值為1 //混音溢位邊界 int MAX = 32767; int MIN = -32768; // 音軌疊加 short[] realMixAudio = new short[coloum]; float mixVal; for (int trackOffset = 0; trackOffset < coloum; ++trackOffset) { mixVal = (inputAudios[0][trackOffset]+inputAudios[1][trackOffset])*f; if (mixVal>MAX){ f = MAX/mixVal; mixVal = MAX; } if (mixVal<MIN){ f = MIN/mixVal; mixVal = MIN; } if (f < 1) { //SETPSIZE為f的變化步長,通常的取值為(1-f)/VALUE,此處取SETPSIZE 為 32 VALUE值可以取 8, 16, 32,64,128. f += (1 - f) / 32; } realMixAudio[trackOffset] = (short) (mixVal); } return realMixAudio; }
四、newlc演算法
if A < 0 && B < 0
Y = A + B - (A * B / (-(2 pow(n-1) -1)))
else
Y = A + B - (A * B / (2 pow(n-1))
void Mix(char sourseFile[10][SIZE_AUDIO_FRAME],int number,char *objectFile) { //歸一化混音 int const MAX=32767; int const MIN=-32768; double f=1; int output; int i = 0,j = 0; for (i=0;i<SIZE_AUDIO_FRAME/2;i++) { int temp=0; for (j=0;j<number;j++) { temp+=*(short*)(sourseFile[j]+i*2); } output=(int)(temp*f); if (output>MAX) { f=(double)MAX/(double)(output); output=MAX; } if (output<MIN) { f=(double)MIN/(double)(output); output=MIN; } if (f<1) { f+=((double)1-f)/(double)32; } *(short*)(objectFile+i*2)=(short)output; } }
以上就是直播系統原始碼,常見的混音演算法有哪些的全部內容了,更多內容歡迎關注後續的文章
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69978258/viewspace-2999410/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 搭建直播系統,常見的網路傳送協議有哪些?協議
- java版工程專案管理系統原始碼及常見的模組有哪些?Java專案管理原始碼
- Linux系統常見的管理皮膚有哪些?Linux
- 常見的Linux系統有哪些?你知道嗎?Linux
- 直播商城原始碼包含哪些技術?商城直播系統開發難點有哪些?原始碼
- 語音直播系統原始碼與視訊直播系統原始碼哪些區別原始碼
- 一對一直播系統原始碼有哪些優勢原始碼
- 負載均衡常見的演算法有哪些?負載演算法
- 直播系統程式碼,三種常見的提示彈窗
- Linux系統中,常見的隱形檔案有哪些?Linux
- 語音直播系統原始碼開發有哪些技術問題原始碼
- 跨境電商ERP管理系統有哪些常見功能
- 導致linux系統快取高的常見原因有哪些Linux快取
- 【Linux入門知識分享】常見的Linux系統有哪些?Linux
- Linux驅動子系統是什麼?常見有哪些?Linux
- 常見的Linux作業系統有哪些?你都瞭解嗎?Linux作業系統
- 說說常見的排序演算法有哪些?區別?排序演算法
- app直播商城原始碼,有哪些常用的加密方式APP原始碼加密
- Linux系統中常見的檔案系統有哪些?Linux
- 使用代理時常見的錯誤程式碼有哪些?
- 面試每日一題005:常見的遊戲經濟系統有哪些?(系統向)面試每日一題遊戲
- 電商直播系統原始碼:電商app的型別都有哪些?原始碼APP型別
- 語音聊天系統原始碼有哪些特色功能原始碼
- DDOS常見的型別有哪些?型別
- 短視訊系統原始碼,幾種常見的單例模式原始碼單例模式
- 常見的資料整合有哪些方法?有哪些分類?
- 常見越權方式有哪些?
- 工控機的常見問題有哪些
- 有哪些常見的資料探勘方法?
- 常見的ERP實施方法有哪些?
- 常見的Web伺服器有哪些?Web伺服器
- 【知識分享】什麼是伺服器作業系統有哪些常見的伺服器作業系統
- python檔案的常見的操作有哪些?Python
- 直播系統原始碼--搭建直播平臺的奠基石原始碼
- 直播APP原始碼,直播系統推流SDK(Android)APP原始碼Android
- 直播系統直播原始碼整體解決方案!原始碼
- 開發教育培訓系統原始碼有哪些難點?原始碼
- 直播系統原始碼,ios系統開發的基本架構原始碼iOS架構