Lepsze udostępnianie kart dzięki funkcji Region Capture

François Beaufort
François Beaufort

Platforma internetowa pozwala już aplikacji internetowej na przechwytywanie ścieżki wideo bieżącej karty. Teraz jest ona wyposażona w funkcję przechwytywania regionów, która służy do przycinania tych ścieżek wideo. Aplikacja internetowa wyznacza część bieżącej karty jako swój obszar zainteresowań i przeglądarka przycina wszystkie piksele poza ten obszar.

Aplikacje internetowe mogły wcześniej przycinać ścieżki wideo „ręcznie”. Oznacza to, że aplikacje internetowe mogą bezpośrednio manipulować każdą klatką. To nie było ani obszerne, ani skuteczne. Funkcja Region Capture rozwiązuje te braki. Aplikacja internetowa może teraz instruować przeglądarkę, aby wykonała pracę w jej imieniu.

Informacje o funkcji przechwytywania regionów

Masz już witrynę z technologią Dynamic ContentTM. To najlepsza aplikacja internetowa, a użytkownicy nie mogą przestać jej używać – często współpracują z innymi. Następnym krokiem jest wbudowanie funkcji rozmów wirtualnych. Ty decydujesz, że tak się stało. Łączysz siły z dotychczasowym dostawcą usługi do rozmów wideo, umieszczając jego aplikację internetową jako element iframe z innych domen. Aplikacja internetowa do rozmów wideo rejestruje bieżącą kartę jako ścieżkę wideo i przesyła ją do uczestników zdalnych.

Zrzut ekranu okna przeglądarki z aplikacją internetową z wyróżnionymi głównymi obszarami treści i elementami iframe z innych domen.
Główny obszar treści jest oznaczony kolorem niebieskim, a element iframe z innej domeny – na czerwono.

Nie za szybko... Przecież nie chcesz chyba przesyłać filmów innych osób, prawda? Lepiej przyciąć ten fragment. Ale jak? Umieszczony element iframe nie ma informacji o tym, jakie treści udostępniasz i gdzie udostępniasz, więc nie może go przyciąć bez pewnej pomocy. Teoretycznie można podać zamierzone współrzędne. Co się jednak stanie, jeśli użytkownik zmieni rozmiar okna? Przewija widoczny obszar? Powiększanie czy pomniejszanie? Wchodzi w interakcję ze stroną w sposób, który powoduje zmianę układu? Nawet jeśli wyślesz nowe współrzędne do elementu iframe przechwytywania, problemy z czasem mogą nadal powodować błędne przycięcie klatek.

Użyjmy więc zdjęcia regionu. Na Twojej stronie znajduje się Element (może to być <div>) zawierający główną treść. Nazwijmy ją mainContentArea. Chcesz, aby aplikacja internetowa do obsługi rozmów wideo przechwytywała i udostępniała zdalnie obszar zdefiniowany przez ramkę ograniczającą tego elementu. Uzyskujesz więc wartość CropTarget z zakresu mainContentArea. Przekazujesz ten element (CropTarget) aplikacji internetowej do rozmów wideo. Po przycięciu ścieżki wideo za pomocą tego elementu (CropTarget) klatki na tej ścieżce składają się teraz tylko z pikseli, które mieszczą się w ramce ograniczającej mainContentArea. Jeśli mainContentArea zmieni rozmiar, kształt lub lokalizację, ścieżka wideo podąża za nią, nie wymagając żadnych dodatkowych danych z aplikacji internetowej.

Powtórzmy te czynności:

Aby zdefiniować element CropTarget w aplikacji internetowej, wywołaj funkcję CropTarget.fromElement(), podając jako dane wejściowe wybrany przez siebie element.

// In the main web app, associate mainContentArea with a new CropTarget
const mainContentArea = document.querySelector("#mainContentArea");
const cropTarget = await CropTarget.fromElement(mainContentArea);

Przekazujesz CropTarget do aplikacji internetowej do prowadzenia rozmów wideo.

// Send the CropTarget to the video conferencing web app.
const iframe = document.querySelector("#videoConferenceIframe");
iframe.contentWindow.postMessage(cropTarget);

Aplikacja internetowa do obsługi rozmów wideo prosi przeglądarkę o przycięcie ścieżki do obszaru zdefiniowanego przez funkcję CropTarget, wywołując funkcję cropTo() na samodzielnie nagranej ścieżce wideo z docelowym przycięciem otrzymanym z głównej aplikacji internetowej.

// In the embedded video conferencing web app, ask the user for permission
// to start capturing the current tab.
const stream = await navigator.mediaDevices.getDisplayMedia({
  preferCurrentTab: true,
});
const [track] = stream.getVideoTracks();

// Start cropping the self-capture video track using the CropTarget
// received over window.onmessage.
await track.cropTo(cropTarget);

// Enjoy! Transmit remotely the cropped video track with RTCPeerConnection.

I gotowe! Gotowe.

Szczegółowa analiza

Wykrywanie cech

Aby sprawdzić, czy CropTarget.fromElement() jest obsługiwany, użyj polecenia:

if ("CropTarget" in self && "fromElement" in CropTarget) {
  // Deriving a target is supported.
}

Uzyskiwanie elementu docelowego przycięcia

Skupmy się na elemencie o nazwie mainContentArea. Aby wyodrębnić z niego element CropTarget, wywołaj CropTarget.fromElement(mainContentArea). Jeśli się powiedzie, zwrócona obietnica zostanie zrealizowana za pomocą nowego obiektu CropTarget. W przeciwnym razie zostanie odrzucony, jeśli uzyskasz nieuzasadnioną liczbę CropTarget obiektów.

const mainContentArea = document.querySelector("#mainContentArea");
const cropTarget = await CropTarget.fromElement(mainContentArea);

W przeciwieństwie do Element obiekt CropTarget podlega serializacji. Można je przekazać do innego dokumentu, na przykład za pomocą narzędzia Window.postMessage().

Przycinanie

Podczas przechwytywania kart ścieżka wideo jest tworzona jako BrowserCaptureMediaStreamTrack, który należy do podklasy MediaStreamTrack. Ta podklasa ujawnia cropTo(). Wywołaj funkcję track.cropTo(cropTarget), aby rozpocząć przycinanie do konturów mainContentArea (elementu, z którego pochodzi element cropTarget).

Jeśli obietnica się powiedzie, obietnica zostanie zrealizowana, gdy będzie można mieć pewność, że wszystkie kolejne klatki filmu będą składać się z pikseli mieszczących się w ramce ograniczającej mainContentArea.

Jeśli się nie uda, obietnica zostanie odrzucona. Może się tak zdarzyć, jeśli:

  • CropTarget został wygenerowany w innej karcie. (na razie wkrótce).
  • Wartość CropTarget została pobrana z elementu, który już nie istnieje.
  • Utwór ma klony. (Patrz problem 1509418).
  • Obecna ścieżka nie jest ścieżką wideo nagranych przez Ciebie. patrz niżej.

Metoda cropTo() jest widoczna w przypadku każdej ścieżki wideo utworzonej za pomocą karty, a nie tylko w przypadku samonagrania. Dlatego przed próbą przycięcia ścieżki warto sprawdzić, czy użytkownik wybrał bieżącą kartę. Użyj nicka przechwytywania. Możesz też poprosić przeglądarkę o zachęcenie użytkownika do samodzielnego zdjęcia za pomocą preferCurrentTab.

// Start cropping the self-capture video track using the CropTarget.
await track.cropTo(cropTarget);

Aby przywrócić nieprzycięty stan, wywołaj funkcję cropTo() za pomocą null.

// Stop cropping.
await track.cropTo(null);

Wykluczanie i blokowanie treści

W przypadku przechwytywania regionów tylko pozycja i rozmiar sprawy docelowej, a nie z-index. Zostanie przechwycone piksele otaczające cel. Wykluczone części celu nie zostaną zarejestrowane.

Wynika to z faktu, że funkcja zdjęcia regionu jest przycinana. Jedną z alternatywnych rozwiązań, które w przyszłości będzie interfejs API, jest Przechwytywanie na poziomie elementu. oznacza to, że rejestruje tylko piksele powiązane z celem, bez względu na przesłonięcie. W takim interfejsie API obowiązują inne wymagania dotyczące bezpieczeństwa i prywatności niż proste przycinanie.

Obraz przedstawiający różne wyniki dla interfejsu Region Capture i interfejsu Capture API na poziomie elementu.
Działanie funkcji przechwytywania regionów z zasłanianiem treści.

Bezpieczeństwo i prywatność

Funkcja przechwytywania regionów umożliwia aplikacji internetowej, która już rejestruje wszystkie piksele na karcie, dobrowolne usunięcie niektórych z tych pikseli. Jest to bezpieczne rozwiązanie, ponieważ nie można uzyskać żadnych nowych informacji.

Zapis regionów pozwala ograniczyć zakres informacji wysyłanych do uczestników zdalnych. Możesz na przykład udostępnić kilka slajdów, ale nie swoje notatki.

Zrzut ekranu okna przeglądarki ze slajdami i notatkami.
Aplikacja internetowa zawierająca slajdy i notatki.
Zdalne udostępnianie notatek jest zdecydowanie niepożądane. Naświetlaj zdjęcie regionu.

Pamiętaj, że funkcja przechwytywania regionów nie zapewnia żadnej gwarancji bezpieczeństwa. Gdy przekazujesz ścieżkę do innego dokumentu, dokument odbierający może cofnąć przycięcie ścieżki i uzyskać dostęp do wszystkich pikseli przechwyconych kart.

Chrome rysuje niebieskie obramowanie wokół krawędzi przechwyconych kart. Podczas przycinania Chrome zwykle rysuje niebieskie obramowanie wokół przyciętego celu.

Wersja demonstracyjna

Możesz wypróbować funkcję Region Capture, uruchamiając wersję demonstracyjną aplikacji Glitch. Bądź zapoznaj się z kodem źródłowym.

Obsługa przeglądarek

Obsługa przeglądarek

  • 104
  • 104
  • x
  • x

Funkcja przechwytywania regionów jest dostępna od Chrome 104 tylko na komputerze.

Co dalej?

Oto zapowiedź tego, czego można oczekiwać w najbliższej przyszłości, aby usprawnić udostępnianie ekranu w internecie:

  • Funkcja przechwytywania regionów obsługuje zrzuty ekranu z innych kart.
  • Skupienie warunkowe umożliwia przechwytywaniem danych aplikacji internetowej polecenie przeglądarki, w którym powinna przełączyć zaznaczenie na przechwycony obraz lub uniknąć takiej zmiany ostrości.
  • Możesz udostępnić interfejs Capture API na poziomie elementu.

Prześlij opinię

Zespół Chrome i społeczność zajmująca się standardami internetowymi chcą poznać Twoją opinię o funkcji Region Capture.

Opowiedz nam o projekcie

Czy jest coś, co w funkcji Zrób zdjęcie regionu nie działa zgodnie z oczekiwaniami? A może brakuje Ci metod lub właściwości, które pozwolą Ci zrealizować Twój pomysł? Masz pytanie lub komentarz na temat modelu zabezpieczeń?

Problem z implementacją?

Czy wystąpił błąd z implementacją Chrome? Czy implementacja różni się od specyfikacji?

  • Zgłoś błąd na https://new.crbug.com. Postaraj się podać jak najwięcej szczegółów oraz proste instrukcje odtwarzania filmu. Usługa Glitch świetnie nadaje się do szybkiego i łatwego udostępniania poprawek.

Pokaż wsparcie

Czy planujesz użyć funkcji przechwytywania regionów? Twoja publiczna pomoc pomaga zespołowi Chrome ustalać priorytety funkcji i pokazywać innym dostawcom przeglądarek, jak ważne jest, aby wspierać te funkcje.

Wyślij tweeta na adres @ChromiumDev, aby poinformować nas, gdzie i jak go używasz.

Podziękowania

Dziękujemy Joe Medley za przeczytanie tego artykułu.