QttAudio與WebRTC在Android音頻迴音消除的使用對比

樓宇對講設備中,絕大部分採用的是android系統來運行軟件,在其上語音對講功能的實現並不理想,android系統裡的webrtc、opus、speex,能做到的音頻降噪,嘯叫消除的效果是十分有限的,想做到穩定優質的呼叫對講,還需要專門的算法來實現迴音消除,否則樓宇對講裡的雜音會非常影響用戶體驗。

qttaudio是專業音頻通信技術解決方案,通過簡單易用的API,讓樓宇對講的開發者把語音通話功能迅速集成到自己的軟件系統中,免除了嘯叫、雜音這些麻煩事。

QttAudio與WebRTC在Android音頻迴音消除的使用對比

一、QttAudio的使用用法

1.Java(Android)

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

try {

//初始化QttAudioEngine

QttAudioEngine.me().init(this, "your appkey");

//創建QttAudioStream

QttAudioStream stream = QttAudioEngine.me().createStream();

//設置mic的編碼參數,pcm,單聲道,48000hz採樣率

QttAudioEngine.me().setMicCodecParams("pcm", 1, 48000, 0);

//設置mic採集回調函數

QttAudioEngine.me().setMicCaptureCb(new QttCaptureCallbak() {

@Override

public void onCapture(byte[] buf, int bufLength, Object userdata) {

QttAudioStream tmpStream = (QttAudioStream) userdata;

//將mic採集到的播放出來,實現音頻回放功能

tmpStream.playBuffer(buf, 0, bufLength);

}

}, stream);

//啟動stream,開始工作

stream.start();

} catch (QttException e) {

e.printStackTrace();

}

}

}

2. C (iOS、Windows、Linux)

static void onCapture(char *buf, size_t len, void *userdata) {

QttAudioStream *stream = (QttAudioStream *)userdata;

//將mic採集到的播放出來,實現音頻回放功能

qtt_stream_write_payload(stream, buf, len);

}

int main() {

//創建QttAudioEngine

QttAudioEngine *engine = qtt_engine_init("your appkey");

if (engine == NULL) {

fprintf(stderr, "qtt_engine_init fail\n");

return -1;

}

//創建QttAudioStream

QttAudioStream *stream = qtt_engine_create_stream(engine);

if (stream == NULL) {

fprintf(stderr, "qtt_engine_create_stream fail\n");

return -1;

}

//設置mic的編碼參數,pcm,單聲道,48000hz採樣率

qtt_engine_set_mic_codec_params(engine, "pcm", 1, 48000, 0);

//設置mic採集回調函數

qtt_engine_set_mic_capture_callback(engine, onCapture, stream);

//啟動stream,開始工作

qtt_stream_start(stream);

char c = getchar();

qtt_stream_stop(stream);

qtt_stream_free(stream);

qtt_engine_free(engine);

return 0;

}

二、webrtc的用法

WebRTC共分成三個API,讓web具備三個功能

1.MediaStream (又稱getUserMedia):獲取音頻和視頻

2.RTCPeerConnection:進行音頻和視頻通信

3.RTCDataChannel:進行任意數據的通信

  1. navigator.getUserMedia方法目前主要用於,在瀏覽器中獲取音頻(通過麥克風)和視頻(通過攝像頭),將來可以用於獲取任意數據流,比如光盤和傳感器。

(1)獲取攝像頭

需要先在網頁上放置一個video元素。圖像就展示在這個元素中。

<video>

然後,用代碼獲取這個元素

<function>

var video = document.getElementById('webcam');

}

將這個元素的src屬性綁定數據流,攝像頭拍攝的圖像就可以顯示了。

function onSuccess(stream){

var video = document.getElementById('webcam');

if (window.URL){

video.src = window.URL.createobjectURL(stream);

} else {

video.src =stream;

}

video.autoplay =true;

}

if(navigator.getUserMedia){

navigator.getUserMedia({video:true},onSuccess);

} else{

document.getElementById('webcam').src ='somevideo.mp4';

}

(2)獲取麥克風聲音

通過瀏覽器捕獲聲音,需要藉助Web Audio API。

window.AudioContext=window.AudioContext ||

window.webkitAudioContext;

var context = new AudioContext()

function onSuccess(stream){

var audioInput = =context.createMediaStreamSource(streram);

audioInput.connect(context.destination);

}

navigator.getUserMedia({audio:true},onSuccess);

2.RTCPeerConnection

RTCPeerConnection的作用是在瀏覽器之間建立數據的“點對點”(peer to peer)通信,也就是將瀏覽器獲取的麥克風或攝像頭數據,傳播給另一個瀏覽器。這裡麵包含了很多複雜的工作,比如信號處理、多媒體編碼/解碼、點對點通信、數據安全、帶寬管理等等。

不同客戶端之間的音頻/視頻傳遞,是不用通過服務器的。但是,兩個客戶端之間建立聯繫,需要通過服務器。

WebRTC協議沒有規定與服務器的通信方式,因此可以採用各種方式,比如WebSocket。通過服務器,兩個客戶端按照Session Description Protocol(SDP協議)交換雙方的元數據。

3.RTCDataChannel

RTCDataChannel的作用是在點對點之間,傳播任意數據。它的API與WebSockets的API相同。

webrtc作為google開源的音視頻播放框架,使用起來顯得非常複雜,學習成本高,

QttAudio,作為android平臺專業的音視頻迴音消除方案,無須複雜的音頻開發,就幾個簡單清晰的API,包含opus、speex,做到自動增益、語音降噪,減少嘯叫、能幫助樓宇對講消除通話雜音,實現高清的語音音質,對於做樓宇對講的公司來說,控制了開發成本,節省了研發時間,更有利於產品的迅速上線、獲利!

/<function>


分享到:


相關文章: