前言
最近在學(xué)習(xí)基于Webrtc、Kurento來實(shí)現(xiàn)web遠(yuǎn)程通話,爬了很多的坑,記錄下。
音視頻通話通常會(huì)有切換靜音設(shè)置的功能,即一端設(shè)置靜音之后不再有音頻內(nèi)容向?qū)Ψ桨l(fā)送,那么在webrtc中,又當(dāng)如何實(shí)現(xiàn)呢?
思路
1、修改WebRtcPeer的options
在創(chuàng)建WebRtcPeer時(shí),可以設(shè)置配置項(xiàng)options,其中mediaConstraints里可以設(shè)置是否使用音視頻。
constraints 參數(shù)是一個(gè)包含了video 和 audio兩個(gè)成員的MediaStreamConstraints 對(duì)象,用于說明請(qǐng)求的媒體類型。必須至少一個(gè)類型或者兩個(gè)同時(shí)可以被指定。
{
audio: false,
video: true
}
此處設(shè)置代表使用視頻設(shè)備,不使用音頻設(shè)備。運(yùn)行之后,確實(shí)不再聽到web端的音頻輸入,但是后續(xù)如何取消靜音又是個(gè)問題。
2、MediaStreamTrack
將本地的音視頻內(nèi)容發(fā)送到對(duì)方,創(chuàng)建WebRtcPeerSendonly(參考Kurento官方文檔說明)。

查看其
localVideo里的具體內(nèi)容,如下:
srcObject在此處是MediaStream對(duì)象(當(dāng)然也可以是MediaSource,'Blob',或者'File'對(duì)象)。MediaStream.getTracks()返回流中所有的MediaStreamTrack列表。
遍歷流中的每個(gè)音頻軌道,然后設(shè)置enabled為true或false,來控制麥克風(fēng)靜音或者取消靜音。
var tracks = stream.getTracks(); //stream為MediaStream
tracks.forEach(item => {
if (item.kind === 'audio') {
item.enabled = status;
}
});

MediaStreamTrack表示流中的單個(gè)媒體軌道。通常,這些是音頻或視頻軌道,但也可以存在其他軌道類型。
MediaStreamTrack.enabled如果為true,則enabled表示允許軌道將其實(shí)際媒體呈現(xiàn)到輸出。當(dāng)enabled設(shè)置為時(shí)false,軌道僅生成空白幀。空的音頻幀將每個(gè)樣本的值設(shè)置為0??盏囊曨l幀將每個(gè)像素的值設(shè)置為黑色。
總結(jié)
通過對(duì)MediaStream的控制,即設(shè)置MediaStreamTrack.enabled來實(shí)現(xiàn)靜音開關(guān)效果的切換。