Spec-Zone.ru › Web APIs

API записи потока медиаданных

API записи потока медиаданных, иногда называемый API записи медиаданных или API MediaRecorder, тесно связан с API захвата медиаданных и потоков и API WebRTC. API записи потока медиаданных позволяет захватывать данные, генерируемые объектом MediaStream или HTMLMediaElement, для анализа, обработки или сохранения на диск. Работа с ним удивительно проста.

Концепции и использование

API записи потока медиаданных состоит из одного основного интерфейса, MediaRecorder, который выполняет всю работу по получению данных из MediaStream и передаче их вам для обработки. Данные передаются серией событий dataavailable, уже в формате, который вы указали при создании MediaRecorder. Затем вы можете дополнительно обработать данные или записать их в файл.

Обзор процесса записи

Процесс записи потока прост:

  1. Настройте MediaStream или HTMLMediaElement (в виде элемента <audio> или <video>) в качестве источника данных медиа.
  2. Создайте объект MediaRecorder, указав источник потока и любые необходимые параметры (например, тип MIME контейнера или желаемые битрейты его дорожек).
  3. Установите обработчик событий для события dataavailable; это будет вызываться всякий раз, когда данные будут доступны.
  4. После запуска воспроизведения исходного медиа и готовности к записи, вызовите MediaRecorder.start(), чтобы начать запись.
  5. Обработчик событий dataavailable вызывается каждый раз, когда данные готовы к обработке; событие содержит атрибут data, значение которого — Blob, содержащий данные медиа. Вы можете вызвать событие dataavailable, тем самым получив последние данные звука, чтобы отфильтровать их, сохранить или выполнить другие действия.
  6. Запись автоматически останавливается, когда прекращается воспроизведение исходного медиа.
  7. Вы можете остановить запись в любой момент, вызвав 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 49
47–49До Chrome 49 поддерживалось только видео, а не аудио.
79
25Начиная с Firefox 71, поведение mimeType стало более согласованным. Например, теперь он возвращает тип носителя даже после остановки записи.
36 14.1 49
47–49До Chrome для Android 49 поддерживалось только видео, а не аудио.
25 36 14 5.0 49
47–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 49
47–49До Chrome 49 поддерживалось только видео, а не аудио.
79 25 36 14.1 49
47–49До Chrome для Android 49 поддерживалось только видео, а не аудио.
25 36 14 5.0 49
47–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 49
47–49До Chrome 49 поддерживалось только видео, а не аудио.
79 25 36 14.1 49
47–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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API