변환

형식 간 트랜스코딩

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에 대한 오디오 프로세서 전달을 지원합니다.