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:
Potok składa się z tych kroków:
- 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.
- Edytuj, przefiltruj, poprawiaj lub w inny sposób przetwórz film.
- Przeskaluj lub zmień rozmiar filmu, przygotowując się do transkodowania.
- 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 |
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 |
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
.