Hãy lấy sâm panh và bánh rán ra! Tính năng được gắn dấu sao nhiều nhất trên Chrome từ trước đến nay đã được triển khai.
Hãy tưởng tượng một ứng dụng quay video trượt tuyết đồng bộ hoá video với dữ liệu Vị trí địa lý, hoặc một ứng dụng ghi âm giọng nói siêu đơn giản, hoặc một tiện ích cho phép bạn quay video và tải lên YouTube — tất cả đều không cần trình bổ trợ.
MediaRecorder API cho phép bạn ghi âm thanh và video từ một ứng dụng web. API này hiện có trong Firefox và Chrome dành cho Android và máy tính.
Hãy thử tại đây.
API này rất đơn giản, tôi sẽ minh hoạ bằng cách sử dụng mã từ bản minh hoạ kho lưu trữ mẫu WebRTC. Xin lưu ý rằng bạn chỉ có thể sử dụng API này từ các nguồn gốc bảo mật: HTTPS hoặc localhost.
Trước tiên, hãy tạo MediaRecorder bằng MediaStream. Nếu muốn, hãy sử dụng tham số options
để chỉ định định dạng đầu ra mong muốn:
var options = {mimeType: 'video/webm; codecs=vp9'};
mediaRecorder = new MediaRecorder(stream, options);
MediaStream có thể từ:
- Lệnh gọi
getUserMedia()
. - Đầu nhận của cuộc gọi WebRTC.
- Một bản ghi màn hình.
- Âm thanh web sau khi triển khai vấn đề này.
Đối với options
, bạn có thể chỉ định loại MIME và trong tương lai sẽ có tốc độ bit của âm thanh và video.
Loại MIME có nhiều hoặc ít giá trị cụ thể hơn, kết hợp cả vùng chứa và bộ mã hoá và giải mã. Ví dụ:
- âm thanh/webm
- video/webm
- video/webm;codecs=vp8
- video/webm;codecs=vp9
Sử dụng phương thức tĩnh MediaRecorder.isTypeSupported()
để kiểm tra xem một loại MIME có được hỗ trợ hay không, ví dụ: khi bạn tạo bản sao MediaRecorder:
var options;
if (MediaRecorder.isTypeSupported('video/webm;codecs=vp9')) {
options = {mimeType: 'video/webm; codecs=vp9'};
} else if (MediaRecorder.isTypeSupported('video/webm;codecs=vp8')) {
options = {mimeType: 'video/webm; codecs=vp8'};
} else {
// ...
}
Bạn có thể xem danh sách đầy đủ các loại MIME mà MediaRecorder hỗ trợ trong Chrome tại đây.
Tiếp theo, hãy thêm một trình xử lý dữ liệu và gọi phương thức start()
để bắt đầu ghi:
var recordedChunks = [];
var options = {mimeType: 'video/webm;codecs=vp9'};
mediaRecorder = new MediaRecorder(stream, options);
mediaRecorder.ondataavailable = handleDataAvailable;
mediaRecorder.start();
function handleDataAvailable(event) {
if (event.data.size > 0) {
recordedChunks.push(event.data);
} else {
// ...
}
}
Ví dụ này thêm một Blob vào mảng recordedChunks
bất cứ khi nào có dữ liệu. Bạn có thể tuỳ ý cung cấp đối số timeSlice
cho phương thức start()
để chỉ định thời lượng nội dung nghe nhìn cần ghi lại cho mỗi Blob.
Khi bạn ghi xong, hãy thông báo cho MediaRecorder biết:
mediaRecorder.stop();
Phát các Blob đã được ghi lại trong một phần tử video bằng cách tạo một 'super-Blob' từ mảng các Blob đã được ghi lại:
function play() {
var superBuffer = new Blob(recordedChunks);
videoElement.src =
window.URL.createObjectURL(superBuffer);
}
Ngoài ra, bạn có thể tải lên máy chủ thông qua XHR hoặc sử dụng một API như YouTube (xem bản minh hoạ thử nghiệm bên dưới).
Bạn có thể tải xuống bằng một số cách hack đường liên kết:
function download() {
var blob = new Blob(recordedChunks, {
type: 'video/webm'
});
var url = URL.createObjectURL(blob);
var a = document.createElement('a');
document.body.appendChild(a);
a.style = 'display: none';
a.href = url;
a.download = 'test.webm';
a.click();
window.URL.revokeObjectURL(url);
}
Phản hồi về API và bản minh hoạ
Khả năng ghi âm thanh và video mà không cần trình bổ trợ là một tính năng tương đối mới đối với ứng dụng web. Vì vậy, chúng tôi đặc biệt cảm ơn bạn đã phản hồi về các API này.
- Lỗi triển khai MediaRecorder: crbug.com/262211
- Chrome: crbug.com/new
- Firefox: bugzil.la
- Bản minh hoạ: github.com/webrtc/samples
Chúng tôi cũng muốn biết những trường hợp sử dụng quan trọng nhất đối với bạn và những tính năng mà bạn muốn chúng tôi ưu tiên. Nhận xét về bài viết này hoặc theo dõi tiến trình tại crbug.com/262211.
Bản thu thử
- webrtc.github.io/samples/src/content/getusermedia/record
- simpl.info/mr (cùng một mã, URL dễ dùng hơn cho thiết bị di động!)
- Quay video và tải video đó lên YouTube bằng phần tử
<google-youtube-upload>
tuỳ chỉnh thử nghiệm
Ứng dụng
- Ứng dụng Voice Memos (Bản ghi âm giọng nói) của Paul Lewis hiện đã hỗ trợ MediaRecorder, được điền sẵn cho các trình duyệt không hỗ trợ âm thanh MediaRecorder.
Tiện ích bổ sung
- MediaStreamRecorder của Muaz Khan là một thư viện JavaScript dùng để ghi âm và quay video, tương thích với MediaRecorder.
- Recorderjs cho phép ghi âm từ nút API Âm thanh trên web. Bạn có thể xem thông tin này trong ứng dụng Voice Records của Paul Lewis.
Hỗ trợ trình duyệt
- Chrome phiên bản 49 trở lên theo mặc định
- Chrome phiên bản dành cho máy tính 47 và 48 có các tính năng Nền tảng web thử nghiệm được bật từ chrome://flags
- Firefox từ phiên bản 25
- Edge: "Đang được xem xét"
Thông số kỹ thuật
w3c.github.io/mediacapture-record/MediaRecorder.html