Sprawdzone metody udostępniania filmów

Wiele osób udostępnia filmy za pomocą urządzeń z Androidem. Jakość otrzymanych odpowiedzi Film jest często gorszy od oryginału ze względu na proces przetwarzania w aplikacji do udostępniania. W tym dokumencie opisujemy, jak zoptymalizować jakość udostępniane filmy, a także typowe pułapki związane z przetwarzaniem filmów, których należy unikać. Aby zoptymalizować do udostępniania materiałów HDR, zobacz Użyj modułu Transformer, aby transkodować treści HDR na SDR na tej stronie.

Najważniejsze jest utrzymanie stałej rozdzielczości i utrzymanie jakości filmu możliwie długo, przygotowując się do udostępnienia filmu.

Proces udostępniania

Ilustracja 1 przedstawia typowy proces udostępniania filmu:

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

Potok składa się z tych kroków:

  1. Nagraj film i zakoduj go, dodając efekty podczas nagrywania. Użytkownik może też pominąć ten krok i wybrać film z miejsca na dane. który został wcześniej nagrany z innej aplikacji.
  2. Edytuj, przefiltruj, poprawiaj lub w inny sposób przetwórz film.
  3. Przeskaluj lub zmień rozmiar filmu, przygotowując się do transkodowania.
  4. Transkodować film, aby móc go udostępnić. Filtrowanie w kroku 2 jest często stosowane jako tego kroku.

Proces składa się z 2 etapów, na których możesz parametry określające jakość filmu: kodowanie podczas początkowego nagrać i transkodować przed udostępnieniem. Ponadto może być konieczne zmienić skalowanie filmu przed końcowym krokiem transkodowania, co może też wpłynąć na jakość.

Rekomendacje

Tabela 1 przedstawia 5 głównych parametrów jakości wideo. wskazuje, które kroki mogą ich używać.

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

Tabela 1. Główne parametry określające jakość filmu

Profil

Aby uzyskać lepsze wyniki, użyj bardziej zaawansowanych profili udostępnionych przez konkretne kodeka. W przypadku kodowania AVC wybierz Wysoki profil i poziom 4.

Rozdzielczość, przycinanie i skalowanie

Możesz zmienić początkową rozdzielczość nagranego filmu na etapie skalowania przed transkodowaniem w celu udostępnienia, ale skalowanie może obniżyć jakość film. Zalecamy unikanie skalowania i wybranie rozdzielczości początkowej którego możesz używać w całym potoku. Pamiętaj też, że ekstremalne przycinanie powoduje niską jakość obrazu, zwłaszcza jeśli powiększysz . Postępuj zgodnie z tymi wskazówkami:

  • Wybierz rozdzielczość co najmniej równą ostatecznej rozdzielczości udostępnienia.
  • Rozdzielczość przechwytywania nie powinna znacznie przekraczać rozdzielczości udostępniania chyba że wszystkie kroki średniozaawansowane mają na celu obsługę (np. większa szybkość transmisji bitów podczas początkowego przechwytywania).

    • Jeśli w wyniku kodowania dostępna jest rozdzielczość 720 x 1280, zalecamy użycie Rozdzielczość nagrywania 720 x 1280.
    • Jeśli kroki pośrednie między przechwytywaniem a udostępnianiem obejmują przycinanie, użyj funkcji wyższą rozdzielczość przechwytywania, np. 1080x1920, i szybkość transmisji bitów pod kątem obsługi dodatkowych pikseli.
  • Przycinanie powoduje pogorszenie jakości obrazu, zwłaszcza jeśli jest przycięty. powiększono obraz.

  • Unikaj podnoszenia rozdzielczości z niższej do wyższej rozdzielczości. Próby skalowania w górę aby stworzyć szczegóły, które nie są dostępne. Wybierz pożądaną wyższą rozdzielczość od początku.

  • Jeśli musisz przeprowadzić skalowanie, dostosuj parametry kodowania. Jeśli na przykład plik ma 2 razy więcej pikseli, czyli 2 razy większą szybkość transmisji bitów.

Rozdzielczość i szybkość transmisji bitów są ze sobą powiązane. Na przykład przesłanie materiałów w wysokiej rozdzielczości wideo za pomocą systemu udostępniania, który ostatecznie jest transkodowany do niskiej szybkości transmisji bitów. pozwala uzyskać obraz niższej jakości niż przy niższej rozdzielczości. Jako gdy szybkość transmisji bitów się zmniejsza, pojawiają się punkty przejścia w mniejszych rozdzielczościach w celu uzyskania lepszych wyników:

Szybkość transmisji bitów Rozdzielczość
Ponad 5 Mb/s 1080x1920
1,5–5 Mb/s 720x1280
1,5 Mb/s lub mniej Odpowiednik w jakości SD. Ta 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. Dane wskazują, że rozdzielczość 720p to odpowiedni wybór w przypadku docelowych szybkości transmisji bitów w przedziale 1,5 i 5 Mb/s.

Szybkość transmisji bitów

Nagrywam

Większa szybkość transmisji bitów kodowania zapewnia największą poprawę jakości obrazu jakości. Zalecamy wybrać szybkości transmisji bitów, które odpowiadają natywnym aplikacjom aparatu. Dla Rozdzielczość 720 x 1280, zalecana szybkość transmisji bitów to 10 Mb/s.

Ponieważ kodowanie przechwytuje się na urządzeniu, możesz użyć większej szybkości transmisji bitów, kompensują większość transformacji schodkowych udostępnianych przez udostępnianie i skuteczności. Większe pliki wynikowe są używane tylko do manipulacji na urządzeniu.

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

Udostępnianie

Szybkość transmisji ma największy wpływ na moment udostępniania, ponieważ jest bezpośrednio związana z rozmiaru przesyłanego filmu. To kompromis między reklamami wideo jakość, czas przesyłania plików i koszty miejsca w chmurze.

Większy jest też wybór profilu kodowania, ramek B i wartości ograniczeń QP. niż podczas robienia zdjęć.

Zalecana szybkość transmisji bitów wynosi 4–5 Mb/s (dla rozdzielczości 720 x 1280), jakość obrazu.

Parametr kwantyzacji (QP)

W Androidzie 12 i nowszych klucze QP są ustandaryzowane i są dostępne w MediaFormat API oraz w interfejsie Biblioteka multimediów NDK. We wcześniejszych wersjach Androida manipulacja QP jest dostępna tylko za pomocą platformy za pomocą kluczy dostawcy w konfiguracji MediaFormat.

Nagrywam

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

Nie zalecamy dostosowywania ustawień QP w przypadku szybkości przechwytywania transmisji wynoszącej 10 Mb/s. (dla rozdzielczości 720 x 1280). Jeśli szybkość transmisji bitów jest znacznie niższa, poniżej 5 Mb/s dla Rozdzielczość 720 x 1280 przy ustawieniu QP wynoszącym 40 to dobry kompromis między wyższą jakością bez konieczności zbyt częstego przekraczania docelowej szybkości transmisji bitów przez kodek.

Udostępnianie

Zalecamy maksymalną wartość 40 QP, zwłaszcza gdy szybkość transmisji bitów jest mniejsza niż 4 Mb/s. Zapewnia to minimalną jakość kodowanych filmów, ale może generować o większej szybkości transmisji bitów. Wzrost szybkości transmisji bitów zależy od ze złożoności filmów. Chociaż aplikacja do udostępniania może tolerować pewne różnice w transmisji bitów wygenerowanego filmu może nie tolerować wzrostu powyżej pewnych wartości progowych.

Możesz ograniczyć wzrost szybkości transmisji bitów, ponownie kodując film w celu udostępnienia mniej restrykcyjny (wyższy) maksymalny limit QP. Dzięki temu kodek ma większą swobodę można obniżyć jakość filmu i zachować inne jego elementy. Możesz ponownie zakodować wideo do udostępniania, ponieważ jest to operacja transkodowania; już nagrał film, który chcesz udostępnić.

Wadą jest to, że powtarzanie kroku transkodowania z tymi różnymi wydłuża czas udostępniania filmu. Jednym ze sposobów pozwala sprawdzić częściowo transkodowany film, aby ustalić, czy mieści się w ramach tolerancji nadwyżki transmisji bitów. Jeśli nie, możesz zatrzymać transkodowanie i spróbuj ponownie, używając bardziej odpowiednich parametrów QP.

Ramki B i profile kodujące

Rozważ użycie ramek B tylko podczas etapu udostępniania i tylko podczas uruchamiania Androida w wersji 10 lub nowszej.

Aplikacje powinny sprawdzać obsługiwane profile kodujące za pomocą CodecCapabilities bo nie wszystkie urządzenia obsługują główny lub wysoki profil. Użyj najwyższego profilu obsługiwany przez koder AVC: Wysoki > Główny > Punkt odniesienia. Aby uzyskać najbezpieczniejsze wyniki, nie używaj skonfiguruj ramki B (KEY_LATENCY lub KEY_MAX_B_FRAMES) podczas korzystania z punktu odniesienia ponieważ niektóre kodery mogą nie skonfigurować danych.

W poniższych segmentach kodu przyjęto, że właściwość 'MediaFormat format' zostanie użyta do skonfigurować koder AVC

Android 10

Interfejs API w wersji 29 lub nowszej

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

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

W tej sytuacji nie ustawiaj wartości KEY_LATENCY.

Android 8, 8.1 i 9

Interfejsy API 26, 27, 28

Użyj najwyżej obsługiwanego profilu, ale wyłącz generowanie klatek B. Ten uwzględnia pewne ograniczenia MediaMuxer w tych wersjach systemu

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

Wartość KEY_LATENCY uniemożliwia kodekom generowanie klatek B, ale nadal korzysta z innych efektów kodeków.

Jeśli Twoja aplikacja nie używa MediaMuxer do utworzenia ostatecznego pliku wyjściowego, możesz włącz ramki B, ustawiając wartość KEY_LATENCY na 2 zamiast 1. To powinno który umożliwia kodekowi generowanie klatek B.

Android 7.1 i starsze

Interfejs API 25 i starsze

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

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

Przed wersją 7 AOSP na urządzeniach z Androidem obsługuje tylko profil podstawowy. Jednak że na niektórych urządzeniach OEM włączyli główny/wysoki profil. za pomocą profilu dostawcy.

Jeśli Twoja aplikacja nie używa MediaMuxer, możesz używać głównego lub wysokiego profilu, gdy: który obsługuje kodek. Nie ma klucza formatu publicznego do kontrolowania liczby B- ramki.

Używanie modułu Transformer do transkodowania treści HDR na SDR

Począwszy od Androida 13 (poziom interfejsu API 33), zalecamy korzystanie z platformy Jetpack Media3 Transformer do udostępniania treści HDR aplikacjom, usługom i urządzeniom, które nie korzystają (HDR). Moduł Transformatora polega na mapowaniu tonów z przesyłaniem strumieniowych filmów HDR do SDR i zapisywanie wyniku w formacie MP4, bez utraty szczegółów i jasności obrazu.

Uwaga: na urządzeniach kierowanych na wersje systemu Android 12 (poziom interfejsu API 32) aż do Androida 7.0 (poziom interfejsu API 24) moduł Transformer działa inaczej. Jeśli jeśli urządzenie obsługuje HDR, aplikacja odtwarza treści bez mapowania tonalnego. Jeśli urządzenie nie obsługuje HDR, pojawia się komunikat o błędzie mapowanie tonów nie jest obsługiwane.

Ten kod konfiguruje Transformer, który mapuje dane wejściowe na SDR i ponownie koduje go w formacie wejściowym (na przykład 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();

Aby wypróbować funkcję mapowania tonalnego, zobacz Aplikacja demonstracyjna Transformer.

Mapowanie tonów możesz też skonfigurować za pomocą: MediaCodec, chociaż implementacja jest bardziej złożona. Więcej informacji: MediaCodec.