Nagrywanie dźwięku i obrazu za pomocą narzędzia MediaRecorder

Szampan i pączki! Funkcja Chrome najbardziej oznaczona gwiazdką została wdrożona.

Wyobraźmy sobie np. rejestrator narciarski, który synchronizuje film z danymi geograficznymi, albo bardzo prostą aplikację do notatek głosowych lub widżet, który umożliwia nagranie filmu i przesłanie go do YouTube – a wszystko to bez wtyczek.

Interfejs MediaRecorder API umożliwia nagrywanie dźwięku i obrazu z aplikacji internetowej. Jest już dostępny w Firefoksie i Chrome na Androida oraz na komputerach.

Wypróbuj tę funkcję tutaj.

Zrzut ekranu demonstracji funkcji MediaRecorder na telefonie Nexus 5X z systemem Android

Interfejs API jest prosty, co zademonstruję za pomocą kodu z przykładowego repozytorium WebRTC. Pamiętaj, że interfejsu API można używać tylko z bezpiecznych źródeł: HTTPS lub lokalnego hosta.

Najpierw utwórz instancję MediaRecorder z MediaStream. Opcjonalnie użyj parametru options, aby określić wymagany format wyjściowy:

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

Adresy MediaStream mogą pochodzić z:

  • Połączenie z numerem getUserMedia().
  • Zakończenie odbierania wywołania WebRTC.
  • Nagranie ekranu.
  • Web Audio, po zaimplementowaniu tego problemu.

W przypadku options można określić typ MIME, a w przyszłości także szybkość transmisji bitów audio i wideo.

Typy MIME mają bardziej lub mniej szczegółowe wartości, łącząc kontener i kodeki. Na przykład:

  • audio/webm
  • film/webm
  • video/webm;codecs=vp8
  • video/webm;codecs=vp9

Użyj metody statycznej MediaRecorder.isTypeSupported(), aby sprawdzić, czy dany typ MIME jest obsługiwany, na przykład podczas tworzenia instancji 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 {
    // ...
}

Pełna lista typów MIME obsługiwanych przez MediaRecorder w Chrome jest dostępna tutaj.

Następnie dodaj moduł obsługi danych i wywołaj metodę start(), aby rozpocząć nagrywanie:

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

W tym przykładzie obiekt Blob jest dodawany do tablicy recordedChunks, gdy dostępne są dane. Metoda start() może mieć opcjonalnie argument timeSlice określający długość multimediów do przechwycenia w przypadku każdego obiektu blob.

Po zakończeniu nagrywania powiedz programowi MediaRecorder:

mediaRecorder.stop();

Odtwórz zarejestrowane obiekty blob w elemencie wideo, tworząc „super-Blob” z tablicy nagranych blobów:

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

Możesz też przesłać dane na serwer za pomocą XHR lub użyć interfejsu API, np. YouTube (zobacz eksperymentalną prezentację poniżej).

Pobranie może być związane z hakowaniem linków:

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

Opinie na temat interfejsów API i wersji demonstracyjnych

Możliwość nagrywania dźwięku i obrazu bez używania wtyczek jest w przypadku aplikacji internetowych stosunkowo nowa, dlatego szczególnie cenimy sobie Twoją opinię na temat interfejsów API.

Chcielibyśmy też dowiedzieć się, które scenariusze użytkowania są dla Ciebie najważniejsze oraz jakie funkcje powinniśmy traktować priorytetowo. Skomentuj ten artykuł lub śledź postępy na stronie crbug.com/262211.

Przykłady

Aplikacje

  • Aplikacja Voice Memos Paula Lewisa obsługuje teraz technologię MediaRecorder, w której wypełniona jest poligrafia w przeglądarkach, które nie obsługują dźwięku MediaRecorder.

Polyfill

  • MediaStreamRecorder firmy Muaz Khan to biblioteka JavaScript do nagrywania dźwięku i wideo, zgodna z MediaRecorder.
  • Recorderjs umożliwia nagrywanie z węzła Web Audio API. Możesz to zobaczyć w aplikacji Voice Memos Paula Lewisa.

Obsługiwane przeglądarki

  • domyślnie Chrome 49 i nowsze wersje,
  • Chrome 47 i 48 z włączonymi eksperymentalnymi funkcjami platformy internetowej pod adresem chrome://flags
  • Firefox z wersji 25
  • Brzegowy: „W trakcie rozważania”

Dane techniczne

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

Informacje o interfejsie API

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