Treści MediaStreamTrack
są udostępniane jako strumień, którym można manipulować lub którego można używać do generowania nowych treści.
Tło
W kontekście interfejsu Media Capture and Streams API MediaStreamTrack
reprezentuje on pojedynczą ścieżkę multimedialną w strumieniu. Zwykle są to ścieżki audio lub wideo, ale mogą też występować inne typy ścieżek.
Obiekty MediaStream
składają się z zera lub więcej obiektów MediaStreamTrack
, które reprezentują różne ścieżki audio lub wideo. Każdy element MediaStreamTrack
może mieć co najmniej 1 kanał. Kanał reprezentuje najmniejszą jednostkę strumienia multimediów, np. sygnał audio powiązany z danym głośnikiem (np. lewy lub prawy na stereofonicznej ścieżce audio).
Do czego służą strumień do wstawienia MediaStreamTrack
?
Podstawowym założeniem w przypadku strumieni możliwych do wstawiania w przypadku obiektu MediaStreamTrack
jest udostępnianie treści obiektu MediaStreamTrack
jako zbioru strumieni (zgodnie z definicją za pomocą interfejsu Streams API WhatWG). Transmisje te można modyfikować, aby wprowadzać nowe komponenty.
Przyznanie deweloperom dostępu do strumienia wideo (lub audio) pozwala im wprowadzać zmiany bezpośrednio w tym strumieniu. Z drugiej strony, realizacja tego samego zadania manipulacji wideo za pomocą tradycyjnych metod wymaga od programistów korzystania z elementów pośrednich, takich jak elementy <canvas>
. (szczegóły tego typu procesu znajdziesz np. w artykule wideo + canvas = magia).
Obsługa przeglądarek
Możliwość wstawiania strumieni w MediaStreamTrack
jest obsługiwana od wersji 94.
Przypadki użycia
Przykłady zastosowań strumieni danych do wstawiania w przypadku MediaStreamTrack
:
- gadżety do wideokonferencji, takie jak „śmieszne czapki” czy wirtualne tła;
- przetwarzanie głosu, np. za pomocą vocoderów;
Jak używać strumieni do wstawiania w przypadku MediaStreamTrack
Wykrywanie cech
Aby wykryć strumienie do wstawiania, które obsługuje MediaStreamTrack
, wykonaj te czynności.
if ('MediaStreamTrackProcessor' in window && 'MediaStreamTrackGenerator' in window) {
// Insertable streams for `MediaStreamTrack` is supported.
}
Podstawowe pojęcia
Możliwość wstawiania strumieni w przypadku MediaStreamTrack
opiera się na koncepcjach zaproponowanych wcześniej przez WebCodecs i koncepcyjnie dzieli MediaStreamTrack
na 2 komponenty:
MediaStreamTrackProcessor
, który pobiera źródło obiektuMediaStreamTrack
i generuje strumień ramek multimedialnych, a w szczególności obiektówVideoFrame
lubAudioFrame
. Można to wyobrazić sobie jako ujście ścieżki, które umożliwia ujawnianie niezakodowanych klatek ze ścieżki jakoReadableStream
.MediaStreamTrackGenerator
, który pobiera strumień klatek multimediów i wyświetla interfejsMediaStreamTrack
. Może być przekazywany do dowolnego odbiornika, tak jak ścieżka zgetUserMedia()
. Na wejściu przyjmuje ramki multimediów.
MediaStreamTrackProcessor
Obiekt MediaStreamTrackProcessor
udostępnia jedną właściwość readable
. Umożliwia odczyt ramek z MediaStreamTrack
. Jeśli ścieżka jest ścieżką wideo,
fragmenty odczytywane z readable
będą obiektami VideoFrame
. Jeśli jest to ścieżka audio, fragmenty odczytywane z elementu readable
będą obiektami AudioFrame
.
MediaStreamTrackGenerator
Obiekt MediaStreamTrackGenerator
udostępnia jedną właściwość, writable
, która jest WritableStream
, która umożliwia zapisywanie ramek multimediów w MediaStreamTrackGenerator
, który jest sam w sobie MediaStreamTrack
. Jeśli atrybut kind
ma wartość "audio"
, strumień akceptuje obiekty AudioFrame
, a nie akceptuje obiektów innego typu. Jeśli rodzaj to
"video"
, strumień akceptuje obiekty VideoFrame
, a w przypadku innych typów kończy się niepowodzeniem. Gdy ramka jest zapisywana w poziomie writable
, automatycznie wywoływana jest metoda close()
, dzięki czemu jej zasoby multimedialne nie są już dostępne z JavaScriptu.
MediaStreamTrackGenerator
to ścieżka, do której można zastosować źródło niestandardowe, zapisując ramki multimediów w polu writable
.
Wszystko w jednym miejscu
Głównym pomysłem jest utworzenie łańcucha przetwarzania w ten sposób:
Platforma ścieżki → Procesor → Transformacja → Generator → Platforma odbiornika
Przykład poniżej ilustruje ten łańcuch w przypadku aplikacji skanera kodów kreskowych, która wyróżnia wykryty kod kreskowy w transmisji strumieniowej na żywo.
const stream = await getUserMedia({ video: true });
const videoTrack = stream.getVideoTracks()[0];
const trackProcessor = new MediaStreamTrackProcessor({ track: videoTrack });
const trackGenerator = new MediaStreamTrackGenerator({ kind: 'video' });
const transformer = new TransformStream({
async transform(videoFrame, controller) {
const barcodes = await detectBarcodes(videoFrame);
const newFrame = highlightBarcodes(videoFrame, barcodes);
videoFrame.close();
controller.enqueue(newFrame);
},
});
trackProcessor.readable.pipeThrough(transformer).pipeTo(trackGenerator.writable);
const videoBefore = document.getElementById('video-before');
const videoAfter = document.getElementById('video-after');
videoBefore.srcObject = stream;
const streamAfter = new MediaStream([trackGenerator]);
videoAfter.srcObject = streamAfter;
Prezentacja
Możesz zobaczyć demonstrację skanera kodów QR z sekcji powyżej w działaniu na komputerze lub w przeglądarce mobilnej. Umieść kod QR przed obiektywem, a aplikacja wykryje go i podświetli. Kod źródłowy aplikacji możesz zobaczyć na Glitch.
Zagadnienia związane z bezpieczeństwem i prywatnością
Bezpieczeństwo tego interfejsu API zależy od istniejących mechanizmów na platformie internetowej. Ponieważ dane są udostępniane za pomocą interfejsów VideoFrame
i AudioFrame
, obowiązują reguły tych interfejsów dotyczące danych pochodzących z źródła. Na przykład nie można uzyskać dostępu do danych ze zasobów z innych źródeł ze względu na istniejące ograniczenia dostępu do takich zasobów (np. nie można uzyskać dostępu do pikseli obrazu lub elementu wideo z innego źródła). Dodatkowo dostęp do danych multimedialnych z kamer, mikrofonów lub ekranów jest uzależniony od autoryzacji użytkownika. Dane multimedialne udostępniane przez ten interfejs API są już dostępne za pomocą innych interfejsów API.
Prześlij opinię
Zespół Chromium chce poznać Twoje wrażenia związane z używaniem strumieni wstawianych w MediaStreamTrack
.
Prześlij informacje o projektowaniu interfejsu API
Czy coś w interfejsie API nie działa zgodnie z oczekiwaniami? A może brakuje metod lub właściwości, których potrzebujesz do wdrożenia swojego pomysłu? Czy masz pytania lub uwagi dotyczące modelu bezpieczeństwa? Zgłoś problem ze specyfikacją w odpowiednim repozytorium GitHub lub dodaj swoje uwagi do istniejącego problemu.
Zgłaszanie problemów z implementacją
Czy wystąpił błąd związany z implementacją Chromium? Czy implementacja różni się od specyfikacji?
Zgłoś błąd na stronie new.crbug.com. Podaj jak najwięcej szczegółów, proste instrukcje odtwarzania błędu i wpisz Blink>MediaStream
w polu Składniki.
Glitch to świetne narzędzie do szybkiego i łatwego udostępniania informacji o powtarzających się problemach.
Pokaż wsparcie dla interfejsu API
Czy planujesz używać strumieni wstawialnych w przypadku MediaStreamTrack
? Twoje publiczne wsparcie pomaga zespołowi Chromium w ustalaniu priorytetów funkcji i pokazuje innym dostawcom przeglądarek, jak ważne jest, aby ich obsługa była kluczowa.
Wyślij tweeta do @ChromiumDev, używając hashtaga #InsertableStreams
i podaj, gdzie i jak go używasz.
Przydatne linki
- Specyfikacja w wersji roboczej
- Wyjaśnienie
- ChromeStatus
- Błąd w Chromium
- Sprawdzanie tagów
- repozytorium GitHub,
Podziękowania
Strumienie do wstawiania w specyfikacji MediaStreamTrack
zostały napisane przez Haralda Alvestranda i Guido Urdaneta.
Ten artykuł został sprawdzony przez Haralda Alvestranda, Joe Medleya, Bena Wagnera, Huiba Kleinhouta i Françoisa Beauforta. Baner powitalny autorstwa Chrisa Montgomerya z Unsplash.