API записи потока медиаданных
API записи потока медиаданных, иногда называемый API записи медиаданных или API MediaRecorder, тесно связан с API захвата медиаданных и потоков и API WebRTC. API записи потока медиаданных позволяет захватывать данные, генерируемые объектом MediaStream или HTMLMediaElement, для анализа, обработки или сохранения на диск. Работа с ним удивительно проста.
Концепции и использование
API записи потока медиаданных состоит из одного основного интерфейса, MediaRecorder, который выполняет всю работу по получению данных из MediaStream и передаче их вам для обработки. Данные передаются серией событий dataavailable, уже в формате, который вы указали при создании MediaRecorder. Затем вы можете дополнительно обработать данные или записать их в файл.
Обзор процесса записи
Процесс записи потока прост:
- Настройте
MediaStreamилиHTMLMediaElement(в виде элемента<audio>или<video>) в качестве источника данных медиа. - Создайте объект
MediaRecorder, указав источник потока и любые необходимые параметры (например, тип MIME контейнера или желаемые битрейты его дорожек). - Установите обработчик событий для события
dataavailable; это будет вызываться всякий раз, когда данные будут доступны. - После запуска воспроизведения исходного медиа и готовности к записи, вызовите
MediaRecorder.start(), чтобы начать запись. - Обработчик событий
dataavailableвызывается каждый раз, когда данные готовы к обработке; событие содержит атрибутdata, значение которого —Blob, содержащий данные медиа. Вы можете вызвать событиеdataavailable, тем самым получив последние данные звука, чтобы отфильтровать их, сохранить или выполнить другие действия. - Запись автоматически останавливается, когда прекращается воспроизведение исходного медиа.
- Вы можете остановить запись в любой момент, вызвав
MediaRecorder.stop().
Примечание: отдельные Blob, содержащие фрагменты записанного медиа, не обязательно будут воспроизводимы по отдельности. Медиа необходимо собрать перед воспроизведением.
Если во время записи возникнет ошибка, событие error будет отправлено в MediaRecorder. Вы можете прослушивать события error с помощью обработчика события onerror.
Здесь показан пример, в котором в качестве источника MediaStream используется HTML-холст, и запись останавливается через 9 секунд.
const canvas = document.querySelector("canvas");
// Optional frames per second argument.
const stream = canvas.captureStream(25);
const recordedChunks = [];
console.log(stream);
const options = { mimeType: "video/webm; codecs=vp9" };
const mediaRecorder = new MediaRecorder(stream, options);
mediaRecorder.ondataavailable = handleDataAvailable;
mediaRecorder.start();
function handleDataAvailable(event) {
console.log("data-available");
if (event.data.size > 0) {
recordedChunks.push(event.data);
console.log(recordedChunks);
download();
} else {
// …
}
}
function download() {
const blob = new Blob(recordedChunks, {
type: "video/webm",
});
const url = URL.createObjectURL(blob);
const 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);
}
// demo: to download after 9sec
setTimeout((event) => {
console.log("stopping");
mediaRecorder.stop();
}, 9000);
Просмотр и управление состоянием записывающего устройства
Вы также можете использовать свойства объекта MediaRecorder для определения состояния процесса записи и его методы pause() и resume() для паузы и возобновления записи исходного медиа.
Если вам нужно или вы хотите проверить, поддерживается ли определенный тип MIME, это тоже возможно. Просто вызовите MediaRecorder.isTypeSupported().
Просмотр потенциальных источников ввода
Если вы хотите записать ввод с камеры и/или микрофона, вы можете изучить доступные устройства ввода перед началом процесса построения MediaRecorder. Для этого вам нужно вызвать navigator.mediaDevices.enumerateDevices(), чтобы получить список доступных устройств медиа. Затем вы можете просмотреть этот список, идентифицировать потенциальные источники ввода и даже фильтровать список по необходимым критериям.
В этом фрагменте кода enumerateDevices() используется для просмотра доступных устройств ввода, поиска устройств аудио ввода и создания элементов <option>, которые затем добавляются к элементу <select>, представляющему элемент выбора источника ввода.
navigator.mediaDevices.enumerateDevices().then((devices) => {
devices.forEach((device) => {
const menu = document.getElementById("input-devices");
if (device.kind === "audioinput") {
const item = document.createElement("option");
item.textContent = device.label;
item.value = device.deviceId;
menu.appendChild(item);
}
});
});
Код, подобный этому, может использоваться для того, чтобы пользователь мог ограничить набор устройств, которые он хочет использовать.
Дополнительная информация
Чтобы узнать больше о работе с API записи потока медиаданных, см. Использование API записи потока медиаданных, где показано, как использовать API для записи аудиоклипов. Вторая статья Запись элемента медиа описывает, как получить поток из элемента <audio> или <video> и использовать полученный поток (в данном случае, записывать его и сохранять на локальный диск).
Интерфейсы
BlobEvent-
Каждый раз, когда фрагмент данных медиа завершается записью, он передаётся потребителям в виде
Blobс помощью событияBlobEventтипаdataavailable. MediaRecorder-
Основной интерфейс, реализующий API записи потока медиаданных.
-
MediaRecorderErrorEventУстаревший Нестандартный -
Интерфейс, представляющий ошибки, выброшенные API записи потока медиаданных. Его свойство
error— этоDOMException, указывающее на произошедшую ошибку.
Спецификации
| Спецификация |
|---|
| Запись потока медиаданных |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari в IOS | Samsung Internet | WebView Android | |
MediaRecorder |
47 | 79 | 25 | 36 | 14.1 | 47 | 25 | 36 | 14 | 5.0 | 47 |
|---|---|---|---|---|---|---|---|---|---|---|---|
MediaStream_Recording_API |
47 | 79 | 25До Firefox 58, использованиеMediaStream.addTrack() на потоке, полученном с помощью getUserMedia(), а затем попытка записи результирующего потока приводили к записи только исходного потока без добавленных дорожек (серьезная ошибка). |
36 | 14.1 | 47 | 25До Firefox для Android 58, использованиеMediaStream.addTrack() на потоке, полученном с помощью getUserMedia(), а затем попытка записи результирующего потока приводили к записи только исходного потока без добавленных дорожек (серьезная ошибка). |
36 | 14 | 5.0 | 47 |
audioBitrateMode |
89 | 89 | Нет | 75 | Нет | 89 | Нет | 63 | Нет | 15.0 | 89 |
audioBitsPerSecond |
49 | 79 | 71 | 36 | 14.1 | 49 | 79 | 36 | 14.5 | 5.0 | 49 |
dataavailable_event |
49 | 79 | 25 | 36 | 14.1 | 49 | 25 | 36 | 14 | 5.0 | 49 |
error_event |
49Интерфейс для этого события представляет собой простойEvent, а не ErrorEvent. См. ошибка 40791876. |
79Интерфейс для этого события представляет собой простойEvent, а не ErrorEvent. См. ошибка 40791876. |
25 | 36Интерфейс для этого события представляет собой простойEvent, а не ErrorEvent. См. ошибка 40791876. |
14.1 | 49Интерфейс для этого события представляет собой простойEvent, а не ErrorEvent. См. ошибка 40791876. |
25 | 36Интерфейс для этого события представляет собой простойEvent, а не ErrorEvent. См. ошибка 40791876. |
14 | 5.0Интерфейс для этого события представляет собой простойEvent, а не ErrorEvent. См. ошибка 40791876. |
49Интерфейс для этого события представляет собой простойEvent, а не ErrorEvent. См. ошибка 40791876. |
isTypeSupported_static |
47 | 79 | 25 | 36 | 14.1 | 47 | 25 | 36 | 14 | 5.0 | 47 |
mimeType |
4947–49До Chrome 49 поддерживалось только видео, а не аудио. |
79 | 25Начиная с Firefox 71, поведениеmimeType стало более согласованным. Например, теперь он возвращает тип носителя даже после остановки записи. |
36 | 14.1 | 4947–49До Chrome для Android 49 поддерживалось только видео, а не аудио. |
25 | 36 | 14 | 5.0 | 4947–49До WebView для Android 49 поддерживалось только видео, а не аудио. |
pause |
49 | 79 | 25 | 36 | 14.1 | 49 | 25 | 36 | 14.5 | 5.0 | 49 |
pause_event |
49 | 79 | 65 | 36 | 14.1 | 49 | 65 | 36 | 14.5 | 5.0 | 49 |
requestData |
49 | 79 | 25 | 36 | 14.1 | 49 | 25 | 36 | 14 | 5.0 | 49 |
resume |
49 | 79 | 25 | 36 | 14.1 | 49 | 25 | 36 | 14.5 | 5.0 | 49 |
resume_event |
49 | 79 | 65 | 36 | 14.1 | 49 | 65 | 36 | 14.5 | 5.0 | 49 |
start |
47 | 79 | 25 | 36 | 14.1 | 47 | 25 | 36 | 14 | 5.0 | 47 |
start_event |
49 | 79 | 25 | 36 | 14.1 | 49 | 25 | 36 | 14 | 5.0 | 49 |
state |
4947–49До Chrome 49 поддерживалось только видео, а не аудио. |
79 | 25 | 36 | 14.1 | 4947–49До Chrome для Android 49 поддерживалось только видео, а не аудио. |
25 | 36 | 14 | 5.0 | 4947–49До WebView для Android 49 поддерживалось только видео, а не аудио. |
stop |
49 | 79 | 25 | 36 | 14.1 | 49 | 25 | 36 | 14 | 5.0 | 49 |
stop_event |
49 | 79 | 25 | 36 | 14.1 | 49 | 25 | 36 | 14 | 5.0 | 49 |
stream |
4947–49До Chrome 49 поддерживалось только видео, а не аудио. |
79 | 25 | 36 | 14.1 | 4947–49До Chrome Android 49 поддерживалось только видео, а не аудио. |
25 | 36 | 14 | 5.0 | 49 |
|---|---|---|---|---|---|---|---|---|---|---|---|
videoBitsPerSecond |
49 | 79 | 71 | 36 | 14.1 | 49 | 79 | 36 | 14.5 | 5.0 | 49 |
См. также
- Страница API захвата медиа и потоков
MediaDevices.getUserMedia()- Демонстрация записи MediaStream на simpl.info, автором которой является Sam Dutton
- API Media Recorder HTML5 в действии в Chrome и Firefox
- Полифилл MediaRecorder для Safari и Edge
- TutorRoom: Веб-приложение для захвата/воспроизведения/загрузки видео HTML, используя getUserMedia и API записи MediaStream Recording (исходный код на GitHub)
- Простой демонстрационный пример записи видео
- Пример расширенного рекордера потоков медиа
- OpenLang: Веб-приложение для учебного языка HTML, использующее MediaDevices и API записи MediaStream Recording для записи видео (исходный код на GitHub)
- API MediaStream Recorder доступен в Safari Technology Preview 73
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/MediaStream_Recording_API