Transkoduj między formatami
Możesz określić wyjściowe formaty audio i wideo, które chcesz tworzyć, Buduję Transformera. Na przykład ten kod pokazuje, jak aby skonfigurować Transformer tak, by wysyłał dźwięk H.264/AVC i dźwięk AAC:
Kotlin
Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build()
Java
new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build();
Jeśli format nośnika wejściowego jest już zgodny z konfiguracją dźwięku lub wideo, Transformer automatycznie przełącza się na transmuksowanie, czyli kopiowanie skompresowanych próbek z kontenera wejściowego do kontenera wyjściowego bez modyfikacji. Pozwala to uniknąć kosztów obliczeniowych i potencjalnej utraty jakości na dekodowaniu i ponownym kodowaniu w tym samym formacie.
Usuwanie dźwięku lub obrazu
Usuń dźwięk lub film, używając parametru EditedMediaItem.Builder
, na przykład:
Kotlin
EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
Java
new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
Przycinanie klipu
Możesz usunąć multimedia poza określonymi sygnaturami czasowymi rozpoczęcia i zakończenia, ustawiając konfiguracji przycinania na wejściowym elemencie multimedialnym. Aby na przykład utworzyć klip zawierający wyłącznie multimedia o długości od 10 do 20 sekund:
Kotlin
val inputMediaItem = MediaItem.Builder() .setUri(uri) .setClippingConfiguration( ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build()
Java
MediaItem inputMediaItem = new MediaItem.Builder() .setUri(uri) .setClippingConfiguration( new MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build();
Optymalizowanie wersji
Aby skrócić opóźnienie wynikające z przycięcia początku filmu, włącz funkcję przycinania optymalizacji.
Kotlin
Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build()
Java
new Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build();
To przyspiesza eksport, dekodując i ponownie kodując tylko fragment filmu,
a następnie połączyć ponownie zakodowane dane z resztą oryginału
film. Optymalizacja zależy od możliwości złączenia części pliku wejściowego
z nowo zakodowanym sygnałem wyjściowym, co oznacza, że format wyjściowy kodera i
format danych wejściowych musi być zgodny. Jeśli na przykład plik został pierwotnie
wygenerowane na urządzeniu z inną implementacją kodera, prawdopodobnie
że nie będzie można zastosować optymalizacji.
Aby optymalizacja się powiodła, koder został przekazany do Transformera przez
EncoderFactory
musi mieć poziom i profil zgodne z formatem danych wejściowych.
Ta optymalizacja działa tylko z wejściem MP4 z pojedynczym zasobem. Nie ma żadnych efektów
brak efektów wideo działań ani obrotów, które są podzielone co 90 stopni. Jeśli optymalizacja
nie działa, Transformer automatycznie powraca do normalnego eksportu i zgłasza
wynik optymalizacji w ExportResult.OptimizationResult
.
Sprawdzamy tę funkcję i spodziewamy się, że nie będzie ona funkcją eksperymentalną w kolejnej wersji.
Edytowanie filmu
EditedMediaItems
ma listy procesorów audio i efektów wideo, które można zastosować
zamówienie. Zawiera ona implementacje efektów wideo przeznaczone do typowych zastosowań,
Możesz też dodać efekty niestandardowe i przekazać je podczas tworzenia edytowanych multimediów
elementy(ów).
Można przeskalować multimedia, co może pomóc ograniczyć ilość przetwarzanych zasobów lub w przypadku obsługi danych wejściowych o bardzo wysokiej rozdzielczości, np. 4K lub 8K. Aby na przykład skalować obraz proporcjonalnie do wysokości 480 pikseli:
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf(Presentation.createForHeight(480)) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of(Presentation.createForHeight(480)))) .build();
Można też skalować według danego współczynnika, np. aby zmniejszyć rozmiar o połowę:
Kotlin
val editedMediaItem = EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()))) .build();
Możesz skonfigurować rotację w ten sam sposób:
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder() .setRotationDegrees(90f) .build()) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build()))) .build();
Niestandardowe efekty wideo
Konstruktor Effects
akceptuje listę efektów audio i wideo, które można zastosować.
Wewnętrznie platforma efektów Transformer konwertuje listę efektów wideo
w sekwencję stosowanych po kolei programów do cieniowania GL. W niektórych przypadkach
platforma efektów może zastosować wiele efektów w ramach jednego programu do cieniowania.
Na przykład jeden program do cieniowania może stosować kilka kolejnych macierzy
transformacji, co poprawia wydajność i jakość.
Efekty wideo są również obsługiwane w podglądzie w narzędziu ExoPlayer, w którym są wykorzystywane
ExoPlayer.setVideoEffects
Aplikacja demonstracyjna zawiera przykłady niestandardowych efektów wideo.
Zmiany dźwięku
Efekty dźwiękowe są implementowane przez zastosowanie sekwencji AudioProcessor
nieprzetworzonego dźwięku (PCM). ExoPlayer obsługuje procesory audio
DefaultAudioSink.Builder
, który umożliwia wyświetlanie podglądu zmian w ścieżce dźwiękowej.