변환

형식 간 트랜스코드

트랜스포머를 빌드할 때 생성할 출력 오디오 및 동영상 형식을 지정할 수 있습니다. 예를 들어 다음 코드는 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();
입력 미디어 형식이 이미 오디오 또는 동영상 구성과 일치하는 경우 트랜스포머는 자동으로 _트랜스먹싱_으로 전환됩니다. 즉, 압축된 샘플을 수정 없이 입력 컨테이너에서 출력 컨테이너로 복사합니다. 이렇게 하면 동일한 형식으로 디코딩하고 다시 인코딩하는 데 드는 계산 비용과 잠재적인 품질 손실을 방지할 수 있습니다. ## 오디오 또는 동영상 삭제 {: #remove-audio-video} `EditedMediaItem.Builder`를 사용하여 오디오 또는 동영상을 삭제합니다. 예를 들면 다음과 같습니다.

Kotlin

EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()

자바

new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
## 클립 자르기 {: #trim } 입력 미디어 항목에 클리핑 구성을 설정하여 지정된 시작 및 종료 타임스탬프 외부의 미디어를 삭제할 수 있습니다. 예를 들어 10초에서 20초 사이의 미디어만 포함하는 클립을 생성하려면 다음을 실행합니다.

Kotlin

val inputMediaItem = MediaItem.Builder()
    .setUri(uri)
    .setClippingConfiguration(
        MediaItem.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-edit-lists } 더 빠른 트리밍을 위해 트랜스포머는 MP4 수정 목록을 지원하므로 전체 동영상 재트랜스코딩 없이 더 효율적인 '트리밍 전용' 수정이 가능합니다. 이 메서드는 기존 인코딩된 샘플과 수정 목록 내의 '프리롤'을 활용하여 플레이어에 특정 지점에서 재생을 시작하도록 지시하므로 원치 않는 초기 세그먼트를 효과적으로 건너뜁니다. 트리밍 전용 수정을 훨씬 빠르게 하려면 `experimentalSetMp4EditListTrimEnabled(true)`를 호출하세요.

Kotlin

Transformer.Builder(context)
    .experimentalSetMp4EditListTrimEnabled(true)
    .build()

자바

new Transformer.Builder(context)
    .experimentalSetMp4EditListTrimEnabled(true)
    .build();
일부 미디어 플레이어에서는 '프리롤' 위치를 지원하지 않습니다. 즉, 이러한 플레이어를 사용하면 다른 시작점을 지정할 수 있는 편집 목록 정보와 관계없이 인코딩된 샘플의 절대 시작부터 파일 재생이 시작됩니다. 주의: 동영상을 자르면 원치 않는 부분이 영구적으로 삭제되는 경우가 많습니다. 하지만 수정 목록을 사용하면 개인 정보 보호 위험이 발생합니다. 사용자가 '프리롤' 위치에 의해 '숨겨진' 민감한 '삭제된' 정보를 무심코 공유할 수 있습니다. ## 자르기 최적화 {: #trim-optimization } 동영상 시작 부분을 자르는 지연 시간을 줄이려면 자르기 최적화를 사용 설정하세요.

Kotlin

Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build()

자바

new Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build();
이렇게 하면 동영상을 최대한 적게 디코딩하고 다시 인코딩한 다음 다시 인코딩된 데이터를 나머지 원본 동영상과 스티칭하여 내보내기 속도가 빨라집니다. 이 최적화는 새로 인코딩된 출력으로 입력 파일의 일부를 스티칭할 수 있어야 합니다. 즉, 인코더의 출력 형식과 입력 형식이 호환되어야 합니다. 따라서 예를 들어 파일이 원래 다른 인코더 구현이 있는 기기에서 생성된 경우 최적화를 적용할 수 없을 가능성이 큽니다. 최적화가 성공하려면 `EncoderFactory` 를 통해 트랜스포머에 제공된 인코더의 수준과 프로필이 입력 형식과 호환되어야 합니다. 이 최적화는 효과가 없고(no op 동영상 효과 제외) 90도로 나눌 수 있는 회전이 있는 단일 애셋 MP4 입력에만 적용됩니다. 최적화가 실패하면 트랜스포머가 자동으로 일반 내보내기로 대체되고 `ExportResult.OptimizationResult`에 최적화 결과를 보고합니다. 이 기능은 검증 중이며 향후 출시에서 실험 단계가 종료될 것으로 예상됩니다. ## 동영상 수정 {: #video-edits } `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();
### 맞춤 동영상 효과 {: #custom-video } `Effects` 생성자는 적용할 오디오 및 동영상 효과 목록을 허용합니다. 내부적으로 트랜스포머의 효과 프레임워크는 동영상 효과 목록을 순서대로 적용되는 GL 셰이더 프로그램 시퀀스로 변환합니다. 경우에 따라 효과 프레임워크는 하나의 셰이더 프로그램으로 여러 효과를 적용할 수 있습니다. 예를 들어 하나의 셰이더 프로그램이 연속된 여러 행렬 변환을 적용하여 효율성과 품질을 개선할 수 있습니다. 동영상 효과는 `ExoPlayer.setVideoEffects`를 사용하여 ExoPlayer의 미리보기에서도 지원됩니다. 이 API 사용 방법의 예는 [효과 데모 앱][effect-demo-app]을 참고하세요. [데모 앱](demo-application)에는 맞춤 동영상 효과의 예가 포함되어 있습니다. ## 이미지 입력 {: #image-input } 트랜스포머는 이미지를 정적 동영상 클립으로 처리하여 이미지 입력을 지원합니다. 이미지를 입력 소스로 구성하려면 다음 단계를 따르세요. * `MediaItem.Builder` 를 사용하여 `MediaItem`을 만듭니다. `setImageDurationMs`를 호출하여 출력 동영상의 이미지 표시 시간을 지정합니다. * `MediaItem` 을 래핑하는 `EditedMediaItem`을 생성합니다. `EditedMediaItem.Builder#setFrameRate`를 사용하여 생성된 동영상 스트림의 타겟 프레임 속도를 지정합니다. 다음 예에서는 이미지 입력을 구성하여 초당 30프레임으로 5초 길이의 동영상을 생성하는 방법을 보여줍니다.

Kotlin

val imageMediaItem = MediaItem.Builder()
    .setUri(imageUri)
    .setImageDurationMs(5000) // 5 seconds
    .build()

val editedImageItem = EditedMediaItem.Builder(imageMediaItem)
    .setFrameRate(30) // 30 frames per second
    .build()

자바

MediaItem imageMediaItem = new MediaItem.Builder()
    .setUri(imageUri)
    .setImageDurationMs(5000) // 5 seconds
    .build();

EditedMediaItem editedImageItem = new EditedMediaItem.Builder(imageMediaItem)
    .setFrameRate(30) // 30 frames per second
    .build();

오디오 편집

오디오 효과는 원시 (PCM) 오디오에 AudioProcessor 인스턴스 시퀀스를 적용하여 구현됩니다. ExoPlayer는 오디오 프로세서를 DefaultAudioSink.Builder에 전달하는 것을 지원하므로 오디오 수정사항을 미리 볼 수 있습니다.