一、控制传输速率
- 音视频服务质量变差主要由以下几个方面
- 物理链路质量:包括丢包、延迟和抖动
- 带宽大小:带宽大小指的是每秒钟可以传输多少数据
- 传输速率:主要包括音视频压缩码率、传输控制码率
- 分辨率与帧率:视频的分辨率越高,视频就越清晰,但同时它的数据量也就越大
- 所以我们可以通过压缩码率、控制传输速度来控制速率,其中WebRTC 只使用第一种压缩码率的方式来主动控制速率
- 首先从
RTCPeerConnection
中获取视频的发送者,即 kind
为 video
的 sender
- 然后取出
sender
中的 parameters
对象 - 其中的
maxBitrate
属性就是用于控制传输码率的 - 将你期望的最大码率设置好后,再将
parameters
对象设置回去,就可以控制视频某路流的码率了
var pc = new RTCPeerConnection(null);
var vsender = null;
var senders = pc.getSenders();
senders.forEach( sender => {
if(sender && sender.track.kind === 'video'){
vsender = sender;
}
});
var parameters = vsender.getParameters();
if(!parameters.encodings){
return;
}
parameters.encodeings[0].maxBitrate = 2048*1000
sender.setParameters(parameters)
.then(()=>{
console.log('Successed to set parameters!');
}).catch(err => {
console.error(err);
});
二、关闭音视频
- 直播系统中最常见的功能:将远端的声音静音、将自己的声音静音、关闭远端的视频、关闭自己的视频
- 将远端的声音静音:将声音静音,可以在
video
标签中设置 muted
属性即可、或者在接收端丢掉音频流、或者发送端不采集音频、或者发送端关闭通道 - 将自己的声音静音:采集时停止对音频数据进行采集就可以,将
constraints
中的 auido
属性设置为 false
即可 - 关闭远端的视频:显示端不将视频数据给
video
标签来达到不显示视频的效果、一种是控制远端不发送数据,其实原理跟将声音静音类似,只是这是处理的是视频流 - 关闭本地视频:不将视频数据与
RTCPeerConnection
对象进行绑定即可
<video id="remoteVideo" autoplay muted playsinline />
var remotevideo = document.getElementById('remoteVideo');
remotevideo.muted = false;
var pc = new RTCPeerConnection();
pc.ontrack = getRemoteStream;
function getRemoteStream(e){
remoteStream = e.streams[0];
remoteStream.getAudioTracks().forEach((track)=>{
if (track.kind === 'audio') {
remoteStream.removeTrack(track);
}
});
remoteVideo.srcObject = e.streams[0];
}
navigator.mediaDevices.getUserMedia({audio: false, video: true}, function(stream) {
})
var localStream = null;
var pc = new RTCPeerConnection();
function gotStream(stream){
localStream = stream;
}
function bindTrack() {
localStream.getTracks().forEach((track)=>{
if(track.kink !== 'audio') {
pc.addTrack(track, localStream);
}
});
}