[WebAPIs] Media Streams, Streams API and WebRTC
keywords: MediaStream
, MediaStreamTrack
, MediaDevices
, MediaRecorder
, MediaSource
, track
, channel
, HTML Video Element
, WebRTC
var chunks = [];
navigator.mediaDevices
.getUserMedia(constraints)
.then(function (stream) {
/* Get Tracks */
var videoTracks = stream.getVideoTracks();
/* Add MediaRecorder */
var mediaRecorder = new MediaRecorder(stream);
/* Close all tracks */
stream.getTracks().forEach(function (track) {
track.stop();
});
/* Set stream to <video> */
videoElement.srcObject = stream;
})
.catch(function (err) {
/* handle the error */
});
RecordRTC (library for WebRTC) @ Github
W ebRTC 影音串流概念
WebRTC API @ MDN
Media Capture 和 Streams API 又被稱作 Media Stream API 或 Stream API ,主要用來處理和**網頁即時通訊(WebRTC, Web Real-Time Communications)**有關的影音資料傳流,以及讓瀏覽器在不需要任何外掛的情況下直接進行 P2P 的溝通。
- 編解碼器(codec):WebRTC 使用的聲音編解碼器包含
Opus
,iSac
,iLBC
;影片編碼器包含VP8
,VP9
。 - 通訊協定:WebRTC 使用的通訊協定為 RTP/RTCP
- Signaling Server:雖然 WebRTC 可以讓使用者直接透過瀏覽器進行 P2P 連線,但在雙方建立連線前仍需要有一個伺服器讓他們知道雙方的位址,才能進行溝通,這個伺服器稱作 Signaling Server,這並沒有規範在 WebRTC 內。
目前主要包含有三種 API 分別是:
getUserMedia
:取得使用者的影音串流(影音採集)RTCPeerConnection
:建立與管理兩個瀏覽器間的直接通訊(P2P)RTCDataChannel
:用來傳送 P2P 間的資料
更多編解碼器(codec)可以參考 [影音傳輸-基礎知識](/Users/pjchen/Projects/Notes/source/_posts/WebDevelopment/[Note] 影音傳輸-基礎知識.md) @ 筆記。 更多通訊協定(protocol)可以參考 [影音傳輸-傳輸方式與通訊協定](/Users/pjchen/Projects/Notes/source/_posts/WebDevelopment/[Note] 影音傳輸-傳輸方式與通訊協定.md) @ 筆記。 關於如何透過 Signaling Server 建 立 WebRTC 連線可以參考 30-26 之 WebRTC 的 P2P 即時通信與小範例 by 我是小馬克 @ iThome
了解更多
MediaDevices API - getUserMedia
MediaDevices 這個 API 讓網頁能夠存取與系統連接的媒體裝置,例如相機、麥克風、甚至分享螢幕。
MediaDevices @ MDN - Web APIs
MediaDevices.getUserMedia()
- 透過
getUserMedia
API 可以取得 MediaStream 物件,而一個 MediaStream 通常包含 0 個以上的MediaStreamTrack
物件,這個物件則是用來表徵各種影音軌(tracks),每一個 MediaStreamTrack 則包含一個以上的頻道(channels),每個頻道則是表徵影音串流(media stream)的最小單位,例如某一個講者的聲音訊號,或者是左右聲道。 - 透過
getUserMedia()
可以產生 local 的 MediaStream,通常輸入源來自於使用者的攝影機或麥克風;而 non-local 的 MediaStream 通常來自 media 元素,像是<video>
和<audio>
,或是透過網絡、WebRTC RTCPeerConnection API、或者 Web Audio API MediaStreamAudioSourceNode 產生的串流。 - MediaStream 物件的輸出則是和 consumer 間相連結,它可以是 media 元素,像是
<video>
和<audio>
、WebRTC RTCPeerConnection API 、或 Web Audio API MediaStreamAudioDestinationNode。
MediaDevices.getUserMedia --> Streams --> Tracks
getUserMedia()
會回傳一個 Promise ,當狀態為 fulfillment 的時候,會帶有 MediaStream
物件。
const constraints = { audio: true, video: true };
navigator.mediaDevices
.getUserMedia(constraints)
.then(function (stream) {
/* use the stream */
})
.catch(function (err) {
/* handle the error */
});
Constraints
在 getUserMedia
的 constraints
物件中可以設定影像採集時的幀數、像素大小;聲音採集時的採樣率和採樣大小:
// 取得該瀏覽器支援的 constraints
const supported = navigator.mediaDevices.getSupportedConstraints();
// 常用的 constraints
const constraints = {
video: {
width: { min: 1024, ideal: 1280, max: 1920 }, // ideal 瀏覽器會試著去找到最接近的情況
height: { min: 776, ideal: 720, max: 1080 },
frameRate: 10,
facingMode: "user",
deviceId: myPreferredCameraDeviceId
},
audio: true,
sampleSize: 8(bit),
sampleRate: 40000(40 kHz)
}
錯誤類型
常見的錯誤類型包含:
# 資料來源 https://ithelp.ithome.com.tw/articles/10204097
AbortError:硬件有問題,例如麥克風 G 了。
NotAllowedError:用戶拒絕使用麥克風。
NotFoundError:找不到你的 constraints 裡設置的媒體類型。
NotReadableError:用戶允許使用媒體設備,但是去讀取時發現無法使用媒體設備。
OverConstrainedError:表示無法滿足你所設置的 constraints。
SecurityError:偏好設定中可能有禁止使用媒體設備。
TypeError:constraints 怪怪的。