Sprawdzone metody udostępniania filmów

Wiele osób udostępnia filmy za pomocą urządzeń z Androidem. Jakość otrzymanego filmu jest często niższa niż oryginał z powodu przetwarzania wykonywanego przez aplikację do udostępniania. W tym dokumencie opisujemy, jak optymalizować jakość udostępnianych filmów, oraz pokazujemy, jakich typowych problemów z przetwarzaniem filmów należy unikać. Aby zoptymalizować udostępnianie treści wideo HDR, zapoznaj się z sekcją Transkodowanie HDR do SDR za pomocą modułu Transformer na tej stronie.

Najważniejsze jest, aby zachować stałą rozdzielczość i zadbać o jak najwyższą jakość filmu podczas przygotowywania się do jego udostępnienia.

Potok udostępniania

Rysunek 1 przedstawia typowy schemat udostępniania filmu:

Udostępnianie potoku wideo Rysunek 1. Proces udostępniania filmów

Potok obejmuje te kroki:

  1. Nagraj film i zakoduj go, a w trakcie nagrywania dodaj efekty. Użytkownik może też pominąć ten krok i wybrać z pamięci film, który został nagrany wcześniej z innej aplikacji.
  2. Edytować, filtrować, retuszować lub w inny sposób przetwarzać film.
  3. Przeskaluj film lub zmień jego rozmiar, przygotowując się do transkodowania.
  4. Transkodować film do udostępniania. W ramach tego etapu często stosuje się filtrowanie z kroku 2.

Proces ten obejmuje 2 etapy procesu, w których można ustawić parametry określające jakość filmu: kodowanie podczas początkowego nagrywania i transkodowanie przed udostępnieniem. Dodatkowo przed wykonaniem ostatniego etapu transkodowania trzeba przeskalować film, co też może mieć wpływ na jego jakość.

Rekomendacje

Tabela 1 zawiera 5 głównych parametrów jakości wideo i wskazuje, które kroki można ich zastosować.

Parametr Rejestruj Udostępnij
Profil T T
Rozdzielczość T T
Szybkość transmisji bitów T T
Parametr kwantyzacji (QP) (rzadko) T
Klatki B N T

Tabela 1. Główne parametry wpływające na jakość filmu

Profil

Aby uzyskać lepsze wyniki, użyj bardziej zaawansowanych profili dostarczanych przez konkretny kodek. W przypadku kodowania AVC wybierz Wysoki profil i poziom 4.

Rozdzielczość, przycinanie i skalowanie

Możesz zmienić początkową rozdzielczość przechwyconego filmu na etapie skalowania przed transkodowaniem na potrzeby udostępniania, ale skalowanie może pogorszyć jakość filmu. Zalecamy unikanie skalowania i wybranie rozdzielczości początkowego kodowania, której można używać w całym potoku. Pamiętaj też, że nadmierne przycięcie skutkuje pogorszeniem jakości obrazu, zwłaszcza jeśli powiększysz go. Postępuj zgodnie z tymi wytycznymi:

  • Wybierz rozdzielczość co najmniej równą ostatecznej rozdzielczości udostępniania.
  • Rozdzielczość przechwytywania nie powinna znacznie przekraczać rozdzielczości udostępniania, chyba że wszystkie kroki pośrednie są zaprojektowane do obsługi większej rozdzielczości (na przykład wyższa szybkość transmisji bitów podczas początkowego nagrywania).

    • Jeśli udostępniane kodowanie daje rozdzielczość 720 x 1280, zalecana jest rozdzielczość 720 x 1280.
    • Jeśli kroki pośrednie między nagrywaniem i udostępnianiem obejmują przycinanie, ustaw wyższą rozdzielczość przechwytywania, np. 1080 x 1920, i zwiększ szybkość transmisji bitów, by uwzględnić dodatkowe piksele.
  • Skrajnie przycięte przycięcie skutkuje obniżeniem jakości obrazu, zwłaszcza jeśli przycięty obraz został powiększony.

  • Unikaj przeskalowywania z niższej rozdzielczości do wyższej. Podnoszenie skalowalności próbuje wygenerować szczegóły, które nie są dostępne. Od początku trzymaj odpowiednią wyższą rozdzielczość.

  • Jeśli musisz zwiększyć limit, dostosuj parametry kodowania. Jeśli na przykład zwiększona rozdzielczość ma 2 razy więcej pikseli, zwiększ szybkość transmisji bitów 2 razy.

Rozdzielczość i szybkość transmisji bitów są ze sobą powiązane. Na przykład przesyłanie filmu w wysokiej rozdzielczości w ramach potoku udostępniania, który ostatecznie transkoduje na niską szybkość transmisji bitów, skutkuje obniżeniem jakości obrazu niż na początku. Wraz ze spadkiem szybkości transmisji bitów pojawiają się punkty przejścia, w których mniejsze rozdzielczości zaczynają zapewniać lepsze wyniki:

Szybkość transmisji bitów Rozdzielczość
5 Mb/s i więcej 1080x1920
1,5–5 Mb/s i więcej 720 × 1280
1,5 Mb/s lub mniej Odpowiednik SD. Taka sama liczba pikseli przy proporcjach 9:16 wynosi około 416 x 736

Tabela 2. Szybkość transmisji bitów a rozdzielczość

Wiele popularnych aplikacji udostępnia filmy w rozdzielczości 720p lub niższej. Z danych wynika, że przy docelowej szybkości transmisji bitów od 1,5 do 5 Mb/s odpowiednią jest rozdzielczość 720p.

Szybkość transmisji bitów

Nagrywam

Większa szybkość transmisji bitów zapewnia największą poprawę jakości wideo. Zalecamy wybieranie szybkości transmisji bitów dopasowanych do natywnych aplikacji aparatu. W przypadku rozdzielczości 720 x 1280 zalecamy szybkość transmisji bitów 10 Mb/s.

Kodowanie przechwytywania odbywa się na urządzeniu, więc możesz użyć większej szybkości transmisji bitów, aby zrekompensować większość transformacji kroków udostępniania o niewielkim negatywnym wpływie. Większe pliki wynikowe są używane tylko do manipulacji na urządzeniu.

Szybkość transmisji bitów możesz zmniejszyć na ostatnim etapie transkodowania, jak pokazano w tabeli 2.

Udostępnianie

Największy wpływ na czas udostępniania ma szybkość transmisji bitów, ponieważ ma ona bezpośredni wpływ na rozmiar przesyłanego filmu. To kompromis między jakością wideo, czasem przesyłania plików i kosztami miejsca w chmurze.

Wybór profilu kodowania, klatek B i wartości ograniczających QP również jest ważniejszy na tym etapie niż podczas przechwytywania.

Aby uzyskać dobrą jakość obrazu, zalecamy szybkość transmisji bitów w zakresie 4–5 Mb/s (dla rozdzielczości 720 × 1280).

Parametr kwantyzacji (QP)

W Androidzie 12 i nowszych klucze QP są ustandaryzowane i dostępne w interfejsie API MediaFormat oraz w bibliotece NDK Media. We wcześniejszych wersjach Androida manipulacja QP jest dostępna tylko za pomocą funkcji platformy korzystających z kluczy specyficznych dla dostawcy w konfiguracji MediaFormat.

Nagrywam

Podczas nagrywania filmu korzystaj z regulacji szybkości transmisji bitów, a nie z ustawień QP, które nie zawsze są dostępne.

Nie zalecamy zmieniania ustawień QP w przypadku szybkości transmisji bitów 10 Mb/s (w przypadku rozdzielczości 720 x 1280). Jeśli szybkość transmisji bitów przechwytywania jest znacznie mniejsza, czyli poniżej 5 Mb/s przy 720 x 1280, ustawienie QP równy 40 to dobry kompromis między wyższą jakością, ale bez zmuszania kodeka zbyt częstego przekraczania docelowej szybkości transmisji.

Udostępnianie

Zalecamy maksymalną szybkość transmisji bitów na poziomie 40, zwłaszcza gdy szybkość transmisji bitów jest mniejsza niż 4 Mb/s. Zapewnia to minimalną jakość kodowanych filmów, ale może skutkować większą szybkością transmisji bitów. Zwiększenie szybkości transmisji bitów zależy od złożoności filmu. Aplikacja do udostępniania może tolerować pewne wahania szybkości transmisji bitów wygenerowanego filmu, ale może nie tolerować wzrostu powyżej określonego progu.

Jeśli chcesz ograniczyć zwiększenie szybkości transmisji bitów, ponownie zakoduj film na potrzeby udostępniania z mniej restrykcyjną (wyższą) granicą maksymalnego QP. Dzięki temu kodek może swobodnie zmieniać jakość filmu i zachować pozostałe części. Możesz ponownie zakodować film do udostępnienia, ponieważ jest to operacja transkodowania. To oznacza, że film, który zamierzasz udostępnić, został już nagrany.

Wadą jest to, że powtarzanie etapu transkodowania z tymi różnymi parametrami wydłuża czas udostępniania filmu. Jednym ze sposobów zmniejszenia tego opóźnienia jest sprawdzenie częściowo transkodowanego filmu i sprawdzenie, czy nie mieści się on w Twojej tolerancji nadmiernej szybkości transmisji bitów. Jeśli nie, możesz zatrzymać transkodowanie i spróbować jeszcze raz z trafniejszymi parametrami QP.

Klatki B i profile kodowania

Rozważ korzystanie z klatek B tylko na etapie udostępniania i tylko na Androidzie 10 lub nowszym.

Aplikacje powinny sprawdzić obsługiwane profile kodowania, używając CodecCapabilities, ponieważ nie wszystkie urządzenia obsługują profile główne lub wysokie. Użyj najwyższego profilu obsługiwanego przez koder AVC: Wysoki > Główny > Punkt odniesienia. Aby uzyskać najbezpieczniejsze wyniki, nie konfiguruj klatek B (KEY_LATENCY lub KEY_MAX_B_FRAMES) podczas korzystania z profilu podstawowego, ponieważ konfiguracja niektórych koderów może się nie udać.

W poniższych segmentach kodu założono 'MediaFormat format', który będzie służyć do konfigurowania kodera AVC

Android 10

API w wersji 29 lub nowszej

Użyj najwyższego obsługiwanego profilu i ustaw parametr klatki B na 1:

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);

W tej sytuacji nie ustawiaj KEY_LATENCY.

Android 8, 8.1 i 9

Interfejsy API 26, 27, 28

Użyj najwyższego obsługiwanego profilu i wyłącz generowanie klatek B. Wiąże się to z pewnymi ograniczeniami dotyczącymi MediaMuxer w tych wersjach systemu

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_LATENCY, 1);

Wartość KEY_LATENCY uniemożliwia kodekom generowanie ramek B, ale mimo to wykorzystuje inne wydajne kodeki.

Jeśli Twoja aplikacja nie używa narzędzia MediaMuxer do tworzenia ostatecznego pliku wyjściowego, możesz włączyć ramki B, ustawiając wartość KEY_LATENCY na 2 zamiast 1. Powinno to umożliwić kodekowi generowanie klatek B.

Android 7.1 i starsze

API 25 i starsze

Aby uzyskać najbezpieczniejsze wyniki, użyj profilu bazowego.

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

W wersjach starszych niż 7 Android AOSP obsługuje tylko profil podstawowy. Jest jednak prawdopodobne, że OEM na niektórych urządzeniach włączyli profil główny lub wysoki, np. przy użyciu profilu konkretnego dostawcy.

Jeśli aplikacja nie korzysta z MediaMuxer, możesz używać głównego lub wysokiego profilu, jeśli obsługuje go kodek. Nie ma publicznego klucza formatu, który sterowałby liczbą klatek B.

Transkoduj HDR na SDR za pomocą modułu Transformer

Od Androida 13 (poziom interfejsu API 33) zalecamy używanie modułu Transformer w Jetpack Media3 do udostępniania treści HDR aplikacjom, usługom i urządzeniom, które nie obsługują technologii HDR. Moduł Transformer polega na mapowaniu tonalnym strumienia wideo HDR na SDR i zapisywaniu wyniku w formacie MP4, co umożliwia skuteczne odtwarzanie bez utraty szczegółów i jasności obrazu.

Uwaga: na urządzeniach kierowanych na systemy w wersji od Androida od 12 (poziom interfejsu API 32) do 7.0 (poziom interfejsu API 24) moduł Transformer działa inaczej. Jeśli urządzenie obsługuje HDR, aplikacja odtwarza treści bez mapowania tonów. Jeśli urządzenie nie obsługuje trybu HDR, pojawi się komunikat o błędzie informujący, że mapowanie tonów HDR nie jest obsługiwane.

Ten kod konfiguruje transformater, który mapuje dane wejściowe na SDR i koduje je w formacie wejściowym (np. H.264/AVC):

Kotlin

val transformer = Transformer.Builder(context)
    .setTransformationRequest(
        TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build()

Java

Transformer transformer = new Transformer.Builder(context)
    .setTransformationRequest(
        new TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build();

Jeśli chcesz wypróbować funkcję mapowania tonów, obejrzyj aplikację demonstracyjną Transformer.

Mapowanie tonów możesz też skonfigurować za pomocą narzędzia MediaCodec, ale implementacja jest bardziej złożona. Więcej informacji znajdziesz w dokumentacji referencyjnej MediaCodec.