Записывайте аудио и видео с помощью MediaRecorder.

Наливайте шампанское и пончики! Самая отмеченная звездами функция Chrome КОГДА-ЛИБО уже реализована.

Представьте себе устройство для записи лыжных трасс, которое синхронизирует видео с данными геолокации, или очень простое приложение для создания голосовых заметок, или виджет, позволяющий записывать видео и загружать его на YouTube — и все это без плагинов.

API MediaRecorder позволяет вам записывать аудио и видео из веб-приложения. Теперь он доступен в Firefox и Chrome для Android и настольных компьютеров.

Попробуйте здесь .

Скриншот демонстрации mediaRecorder на Android Nexus 5X

API прост, и я продемонстрирую это с помощью кода из демо-примера репозитория WebRTC . Обратите внимание, что API можно использовать только из защищенных источников : HTTPS или localhost.

Сначала создайте экземпляр MediaRecorder с MediaStream. При желании используйте параметр options , чтобы указать желаемый формат вывода:

var options = {mimeType: 'video/webm; codecs=vp9'};
mediaRecorder = new MediaRecorder(stream, options);

MediaStream может быть из:

  • Вызов getUserMedia() .
  • Приемная сторона вызова WebRTC.
  • Запись экрана.
  • Веб-аудио, как только эта проблема будет реализована.

Для options можно указать тип MIME и, в будущем, битрейт аудио и видео.

Типы MIME имеют более или менее конкретные значения, объединяющие контейнер и кодеки. Например:

  • аудио/вебм
  • видео/вебм
  • видео/webm;кодеки=vp8
  • видео/webm;кодеки=vp9

Используйте статический метод MediaRecorder.isTypeSupported() , чтобы проверить, поддерживается ли тип MIME, например, при создании экземпляра 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 {
    // ...
}

Полный список типов MIME, поддерживаемых MediaRecorder в Chrome, доступен здесь .

Далее добавьте обработчик данных и вызовите метод start() , чтобы начать запись:

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 {
    // ...
    }
}

Этот пример добавляет Blob в массив recordedChunks всякий раз, когда данные становятся доступными. Методу start() может быть дополнительно предоставлен аргумент timeSlice , который указывает длину носителя для захвата для каждого Blob.

Закончив запись, сообщите MediaRecorder:

mediaRecorder.stop();

Воспроизвести записанные Blob-объекты в видеоэлементе, создав «супер-Blob» из массива записанных Blob-объектов:

function play() {
    var superBuffer = new Blob(recordedChunks);
    videoElement.src =
    window.URL.createObjectURL(superBuffer);
}

В качестве альтернативы вы можете загрузить файл на сервер через XHR или использовать API, например YouTube (см. экспериментальную демонстрацию ниже).

Загрузку можно осуществить с помощью взлома ссылок:

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);
}

Отзывы об API и демонстрациях

Возможность записывать аудио и видео без плагинов — относительно новая возможность для веб-приложений, поэтому мы особенно ценим ваши отзывы об API.

Мы также хотели бы знать, какие сценарии использования наиболее важны для вас и какие функции вы хотели бы, чтобы мы отдали приоритет. Оставьте комментарий к этой статье или отслеживайте прогресс на crbug.com/262211 .

Демо

Приложения

  • Приложение Voice Memos Пола Льюиса теперь поддерживает MediaRecorder, а также имеет полифил для браузеров, не поддерживающих аудио MediaRecorder.

Полифиллы

  • MediaStreamRecorder Муаза Хана — это библиотека JavaScript для записи аудио и видео, совместимая с MediaRecorder.
  • Recorderjs позволяет записывать с узла Web Audio API. Вы можете увидеть это в действии в приложении Voice Memos Пола Льюиса.

Поддержка браузера

  • Chrome 49 и выше по умолчанию
  • Chrome Desktop 47 и 48 с функциями экспериментальной веб-платформы, включенными из chrome://flags
  • Firefox начиная с версии 25
  • Край : «На рассмотрении»

Спецификация

w3c.github.io/mediacapture-record/MediaRecorder.html

API-информация

developer.mozilla.org/en/docs/Web/API/MediaRecorder_API