형식 간 트랜스코드
트랜스포머를 빌드할 때 생성할 출력 오디오 및 동영상 형식을 지정할 수 있습니다. 예를 들어 다음 코드는 H.264/AVC 동영상과 AAC 오디오를 출력하도록 트랜스포머를 구성하는 방법을 보여줍니다.
Kotlin
Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build()
자바
new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build();
입력 미디어 형식이 이미 오디오 또는 동영상 구성과 일치하는 경우 트랜스포머는 자동으로 트랜스먹싱으로 전환합니다. 즉, 압축된 샘플을 수정 없이 입력 컨테이너에서 출력 컨테이너로 복사합니다. 이렇게 하면 동일한 형식으로 디코딩하고 다시 인코딩하는 데 드는 계산 비용과 잠재적인 품질 손실을 방지할 수 있습니다.
오디오 또는 동영상 삭제
EditedMediaItem.Builder
를 사용하여 오디오 또는 동영상을 삭제합니다. 예를 들면 다음과 같습니다.
Kotlin
EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
자바
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()
자바
MediaItem inputMediaItem = new MediaItem.Builder() .setUri(uri) .setClippingConfiguration( new MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build();
MP4 수정 목록
더 빠른 트리밍을 위해 트랜스포머는 MP4 편집 목록을 지원하므로 전체 동영상 재트랜스코딩 없이 더 효율적인 '트리밍 전용' 편집이 가능합니다. 이 메서드는 기존 인코딩된 샘플과 수정 목록 내의 '프리롤'을 활용하여 플레이어에게 특정 지점에서 재생을 시작하도록 지시하므로 원치 않는 초기 세그먼트를 효과적으로 건너뜁니다.
트리밍 전용 수정을 훨씬 빠르게 하려면 experimentalSetMp4EditListTrimEnabled(true)
를 호출하세요.
Kotlin
Transformer.Builder(context) .experimentalSetMp4EditListTrimEnabled(true) .build()
자바
new Transformer.Builder(context) .experimentalSetMp4EditListTrimEnabled(true) .build();
일부 미디어 플레이어에서는 '프리롤' 위치를 지원하지 않습니다. 즉, 이러한 플레이어를 사용하면 다른 시작점을 지정할 수 있는 편집 목록 정보와 관계없이 인코딩된 샘플의 절대 시작부터 파일 재생이 시작됩니다.
트림 최적화
동영상 시작 부분을 자르는 지연 시간을 줄이려면 자르기 최적화를 사용 설정하세요.
Kotlin
Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build()
자바
new Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build();
이렇게 하면 가능한 한 적은 동영상을 디코딩하고 다시 인코딩한 다음 다시 인코딩된 데이터를 나머지 원본 동영상과 스티칭하여 내보내기 속도가 빨라집니다. 최적화는 새로 인코딩된 출력으로 입력 파일의 일부를 스티칭할 수 있어야 합니다. 즉, 인코더의 출력 형식과 입력 형식이 호환되어야 합니다. 따라서 예를 들어 파일이 원래 다른 인코더 구현이 있는 기기에서 생성된 경우 최적화를 적용할 수 없을 가능성이 높습니다.
최적화가 성공하려면 EncoderFactory
를 통해 트랜스포머에 제공된 인코더의 수준과 프로필이 입력 형식과 호환되어야 합니다.
이 최적화는 효과가 없고(no op 동영상 효과 제외) 90도로 나눌 수 있는 회전이 있는 단일 애셋 MP4 입력에만 적용됩니다. 최적화에 실패하면 트랜스포머가 자동으로 일반 내보내기로 대체되고 ExportResult.OptimizationResult
에 최적화 결과를 보고합니다.
이 기능은 검증 중이며 향후 출시에서 실험 단계가 해제될 예정입니다.
동영상 수정
EditedMediaItems
에는 순서대로 적용할 오디오 프로세서와 동영상 효과 목록이 있습니다. 이 라이브러리에는 일반적인 사용 사례를 위한 동영상 효과 구현이 포함되어 있으며, 수정된 미디어 항목을 빌드할 때 맞춤 효과를 작성하여 전달할 수도 있습니다.
미디어의 크기를 조정할 수 있습니다. 이는 4k 또는 8k 동영상과 같이 해상도가 매우 높은 입력을 처리할 때 처리 리소스나 대역폭을 절약하는 데 유용합니다. 예를 들어 높이가 480픽셀이 되도록 비례적으로 조정하려면 다음을 실행합니다.
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf(Presentation.createForHeight(480)) )).build()
자바
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()
자바
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()
자바
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build()))) .build();
맞춤 동영상 효과
Effects
생성자는 적용할 오디오 및 동영상 효과 목록을 허용합니다.
내부적으로 트랜스포머의 효과 프레임워크는 동영상 효과 목록을 순서대로 적용되는 GL 셰이더 프로그램 시퀀스로 변환합니다. 경우에 따라 효과 프레임워크는 하나의 셰이더 프로그램으로 여러 효과를 적용할 수 있습니다.
예를 들어 하나의 셰이더 프로그램이 연속된 여러 행렬 변환을 적용하여 효율성과 품질을 개선할 수 있습니다.
ExoPlayer.setVideoEffects
를 사용하여 ExoPlayer에서 미리보기용 동영상 효과도 지원됩니다. 이 API 사용 방법의 예는 효과 데모 앱을 참고하세요.
데모 앱에는 맞춤 동영상 효과의 예가 포함되어 있습니다.
오디오 수정
오디오 효과는 원시 (PCM) 오디오에 AudioProcessor
인스턴스 시퀀스를 적용하여 구현됩니다. ExoPlayer는 오디오 프로세서를 DefaultAudioSink.Builder
에 전달하는 것을 지원하므로 오디오 편집을 미리 볼 수 있습니다.