對(duì)于網(wǎng)站或者移動(dòng)應(yīng)用來說,視頻信號(hào)流(streming)已成為一項(xiàng)非常重要的功能。在用戶需要實(shí)時(shí)看到視頻或者直播的情況下,通過javascript接受視頻流已經(jīng)成為了一種最為常見的解決方式。一下詳細(xì)講解如何使用javascript接受視頻流。
首先,在javascript中想要接受視頻流,需要使用 HTML5 的video標(biāo)簽。經(jīng)過 HTML 5 規(guī)范的定義,video標(biāo)簽成為了一種可以無需插件即可跨平臺(tái)播放視頻的標(biāo)準(zhǔn)選擇。
上述代碼中,video 標(biāo)簽的 id 屬性為“videoID”,用戶通過 JavaScript 代碼操作該元素。autoplay 表示視頻自動(dòng)播放,controls 表示使用視頻播放所擁有的用戶界面。
然后,我們需要構(gòu)建具體的視頻信號(hào)流。大多數(shù)情況下,視頻流都是通過 HTTP 協(xié)議在網(wǎng)絡(luò)上進(jìn)行傳輸,類似于網(wǎng)頁(yè)請(qǐng)求。
var getStream = function() {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/new-video-stream', true);
xhr.responseType = 'arraybuffer';
xhr.onload = function() {
var bytes = new Uint8Array(xhr.response);
var len = bytes.length;
var binary = '';
for (var i = 0; i< len; i++) {
binary += String.fromCharCode(bytes[i]);
}
var base64Data = window.btoa(binary);
var url = 'data:video/mp4;base64,' + base64Data;
document.querySelector('#videoID').src = url;
setTimeout(getStream(), 50);
};
xhr.send();
};
getStream();
在上述例子中,我們使用 AJAX 對(duì) /new-video-stream 這個(gè)地址進(jìn)行了 GET 請(qǐng)求,并且將請(qǐng)求的數(shù)據(jù)類型定義為 ArrayBuffer。當(dāng)成功請(qǐng)求回來之后,我們就使用 Uint8Array 對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行處理,并將其轉(zhuǎn)換為 Base64 編碼的字符串。將這個(gè)字符串拼接到 data URI 方案的 URL 中,并賦給 video 元素的 src 屬性。最后,通過 setTimeout 間隔一段時(shí)間再次請(qǐng)求 videoStream 接口,從而更新視頻流。
此時(shí),通過上述代碼我們就可以在瀏覽器中使用javascript接受視頻流并進(jìn)行播放了。需要注意的是,在不同的瀏覽器中,視頻流需要使用不同的編碼方式。比如,safari支持HLS協(xié)議,而Chrome則支持WebRTC協(xié)議。因此在具體的實(shí)現(xiàn)過程中,需要針對(duì)不同的瀏覽器做出相應(yīng)的調(diào)整。
除了上述的方法,我們還可以使用一些第三方的工具庫(kù)來實(shí)現(xiàn)對(duì)視頻流的接受。比如,Websocket、WebRTC、MJPEG 等協(xié)議可以實(shí)現(xiàn)實(shí)時(shí)傳輸視頻流數(shù)據(jù)。其中 WebRTC 的互聯(lián)網(wǎng)上的使用非常廣泛,并且有著完整的音視頻功能庫(kù)。
總之,javascript用于接受視頻流已經(jīng)成為了一種非常通用的方式,并且在實(shí)現(xiàn)上相對(duì)簡(jiǎn)單。在實(shí)際場(chǎng)景中,需要根據(jù)具體需求進(jìn)行不同的協(xié)議選擇和編碼方式調(diào)整。