HTML5实时语音通话聊天,MP3压缩传输3KB每秒

Posted web前端开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTML5实时语音通话聊天,MP3压缩传输3KB每秒相关的知识,希望对你有一定的参考价值。

来源 | https://www.jianshu.com/p/017a158b6b18
自从Recorder H5 GitHub开源库优化后,对边录边转码成小语音片段文件实时上传服务器这种操作支持非常良好,因此以前不太好支持的H5语音通话已经有了更好的突破空间。
因此花了两晚时间打造了一个H5语音通话聊天的demo。
HTML5实时语音通话聊天,MP3压缩传输3KB每秒


一、把玩方法

  • 准备局域网内两台设备(Peer A、Peer B)用最新版本浏览器(demo未适配低版本)分别打开demo页面(也可以是同一浏览器打开两个标签)。

  • 勾选页面中的H5版语音通话聊天,在Peer A中点击新建连接。

  • 把Peer A的本机信手动复制传输给Peer B,粘贴到远程信息中,并点击确定连接。

  • 把Peer B自动生成的本机信息手动复制传输给Peer A,粘贴到远程信息中,并点击确定连接。

  • 双方P2P连接已建立,使用页面上方的录音功能,随时开启录音,音频数据会实时发送给对方。

二、技术特性

(1)数据传输

github demo中考虑到减少对服务器的依赖,因此采用了WebRTC P2P传输功能,无需任何服务器支持即可实现局域网内的两个设备之间互相连接,连接代码也算简单。有服务器支持可能就要逆天了,不过代码也会更复杂。
如果正式使用,可能不太会考虑使用WebRTC,用WebSocket通过服务器进行转发可能是最佳的选择。
WebRTC局域网P2P连接要点(实际代码其实差不多,只不过多做了点兼容):
 
   
   
 
/******Peer A(本机)******/
var peerA=new RTCPeerConnection(null,null)

//开启会话,等待远程连接
peerA.createOffer().then(function(offer){
peerA.setLocalDescription(offer);
peerAOffer=offer;
});

var peerAICEList=[......] //通过peerA.onicecandidate监听获得所有的ICE连接信息候选项,如果有多个网络适配器,就会有多个候选

//创建连接通道对象,A端通过这个来进行数据发送
var peerAChannel=peerA.createDataChannel("RTC Test");



/******Peer B(远程)******/
var peerB=new RTCPeerConnection(null,null)

//连接到Peer A
peerB.setRemoteDescription(peerAOffer);

//开启应答会话,等待Peer A确认连接
peerB.createAnswer().then(function(answer){
peerB.setLocalDescription(answer);
peerBAnswer=answer;
});

//把Peer A的连接点都添加进去
peerB.addIceCandidate(......peerAICEList)

var peerBICEList=[......] //通过peerB.onicecandidate监听获得所有的ICE连接信息候选项,如果有多个网络适配器,就会有多个候选

var peerBChannel=... //通过peerB.ondatachannel得到连接通道对象,B端通过这个来进行数据发送


/*******最终完成连接********/
//连接到Peer B
peerA.setRemoteDescription(peerBAnswer);

//把Peer B的连接点都添加进去
peerA.addIceCandidate(......peerBICEList)

/*
peerA peerB分别等待peerA/BChannel.onopen回调即完成P2P连接
,然后通过监听peerA/BChannel.onmessage获得对方发送的信息
,通过peerA/BChannel.send(data) 发送数据。
*/

(2)音频采集和编码

由于是在我的Recorder库中新加的demo,因此音频采集和编码都是现成的,Recorder库有好的兼容性和稳定性,因此节省了最大头的工作量。
编码最佳使用MP3格式,因为此格式已优化了实时编码性能,可做到边录边转码,16kbps 16khz的情况下可做到2kb每秒的文件大小,音质还可以,实时传输时为3kb每秒,15分钟大概3M的流量。
用wav格式也可以,不过此格式编码出来的数据量太大,16位 16khz接近50kb每秒的实时传输数据,15分钟要37M多流量。其他格式由于暂未对实时编码进行优化,使用中会导致明显卡顿。
降噪、静音检测等高级功能是没有的,毕竟是非专业人员

以上是关于HTML5实时语音通话聊天,MP3压缩传输3KB每秒的主要内容,如果未能解决你的问题,请参考以下文章

带有自定义语音 mp3 文件的 Android 通话

使用 HTML5 websockets 实现基于 web 的实时视频聊天

11┃音视频直播系统之 WebRTC 进行文本聊天并实时传输文件

微信通话怎么录音

ipad2018蓝牙音频传输格式

HTML5中的audio在react中的使用----语音播放进度条倍速播放下载等