樓宇對講設備中,絕大部分採用的是android系統來運行軟件,在其上語音對講功能的實現並不理想,android系統裡的webrtc、opus、speex,能做到的音頻降噪,嘯叫消除的效果是十分有限的,想做到穩定優質的呼叫對講,還需要專門的算法來實現迴音消除,否則樓宇對講裡的雜音會非常影響用戶體驗。
qttaudio是專業音頻通信技術解決方案,通過簡單易用的API,讓樓宇對講的開發者把語音通話功能迅速集成到自己的軟件系統中,免除了嘯叫、雜音這些麻煩事。
一、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:進行任意數據的通信
- 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>閱讀更多 QttAudio 的文章