형식 간 트랜스코딩
Transformer를 빌드할 때 생성하려는 출력 오디오 및 동영상 형식을 지정할 수 있습니다. 예를 들어 다음 코드는 H.264/AVC 동영상과 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();
입력 미디어 형식이 오디오 또는 동영상 구성과 이미 일치하는 경우 Transformer는 자동으로 트랜스머싱으로 전환됩니다. 즉, 압축된 샘플을 입력 컨테이너에서 출력 컨테이너로 수정하지 않고 복사합니다. 이렇게 하면 동일한 형식으로 디코딩 및 재인코딩할 때 계산 비용과 잠재적인 품질 손실이 방지됩니다.
오디오 또는 동영상 삭제
EditedMediaItem.Builder
를 사용하여 오디오 또는 동영상을 삭제합니다. 예를 들면 다음과 같습니다.
Kotlin
EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
Java
new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
클립 자르기
입력 미디어 항목에 클리핑 구성을 설정하여 지정된 시작 및 종료 타임스탬프 이외의 모든 미디어를 삭제할 수 있습니다. 예를 들어 10초에서 20초 사이의 미디어만 포함된 클립을 생성하려면 다음을 실행합니다.
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();
동영상 수정
EditedMediaItems
에는 순서대로 적용할 오디오 프로세서와 동영상 효과 목록이 있습니다. 라이브러리에는 일반적인 사용 사례를 위한 동영상 효과 구현이 포함되어 있습니다. 또는 편집된 미디어 항목을 빌드할 때 맞춤 효과를 작성하여 전달할 수 있습니다.
미디어 크기를 조정할 수 있습니다. 이는 4K 또는 8K 동영상과 같은 매우 고해상도 입력을 처리할 때 처리 리소스 또는 대역폭을 절약하는 데 유용할 수 있습니다. 예를 들어, 높이를 480픽셀로 조절하려면 다음을 실행합니다.
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();
또는 특정 배율로 배율을 조정할 수도 있습니다. 예를 들어 크기를 절반으로 줄일 수 있습니다.
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();
동일한 방식으로 회전을 구성할 수 있습니다.
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();
맞춤 동영상 효과
Effects
생성자는 적용할 오디오 및 동영상 효과 목록을 허용합니다.
내부적으로 Transformer의 효과 프레임워크는 동영상 효과 목록을 순서대로 적용되는 GL 셰이더 프로그램 시퀀스로 변환합니다. 경우에 따라 효과 프레임워크는 하나의 셰이더 프로그램으로 여러 효과를 적용할 수 있습니다.
예를 들어 하나의 셰이더 프로그램이 여러 연속 행렬 변환을 적용하여 효율성과 품질을 개선할 수 있습니다.
동영상 효과는 ExoPlayer.setVideoEffects
를 사용하여 ExoPlayer에서 미리보기에도 지원됩니다.
데모 앱에는 맞춤 동영상 효과의 예가 포함되어 있습니다.
오디오 수정
오디오 효과는 AudioProcessor
인스턴스의 시퀀스를 원본 (PCM) 오디오에 적용하여 구현됩니다. ExoPlayer는 오디오 편집을 미리 볼 수 있는 DefaultAudioSink.Builder
에 대한 오디오 프로세서 전달을 지원합니다.