楼宇对讲设备中,绝大部分采用的是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 id="webcam"></video>
然后,用代码获取这个元素
<function onSuccess(stream){
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,做到自动增益、语音降噪,减少啸叫、能帮助楼宇对讲消除通话杂音,实现高清的语音音质,对于做楼宇对讲的公司来说,控制了开发成本,节省了研发时间,更有利于产品的迅速上线、获利!