변환

형식 간 트랜스코딩

Transformer를 빌드할 때 생성하려는 출력 오디오 및 동영상 형식을 지정할 수 있습니다. 예를 들어 다음 코드는 H.264/AVC 동영상 및 AAC 오디오를 출력하도록 Transformer를 구성하는 방법을 보여줍니다.

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는 자동으로 transmuxing으로 전환합니다. 즉, 압축된 샘플을 입력 컨테이너에서 출력 컨테이너로 수정하지 않고 복사합니다. 이렇게 하면 동일한 형식으로 디코딩 및 다시 인코딩할 때 계산 비용과 잠재적인 품질 손실이 방지됩니다.

오디오 또는 동영상 삭제

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();

자르기 최적화

동영상 시작 부분 자르기의 지연 시간을 줄이려면 자르기 최적화를 사용 설정하세요.

Kotlin

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

Java

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

이렇게 하면 동영상을 가능한 한 조금만 디코딩하고 다시 인코딩한 다음 다시 인코딩된 데이터를 원본 동영상의 나머지 부분과 연결하여 내보내기 속도가 빨라집니다. 최적화는 입력 파일의 일부를 새로 인코딩된 출력과 연결할 수 있어야 합니다. 즉, 인코더의 출력 형식과 입력 형식이 호환되어야 합니다. 예를 들어 파일이 원래 다른 인코더 구현을 사용하여 기기에서 생성된 경우 최적화를 적용하지 못할 수 있습니다. 최적화가 성공하려면 EncoderFactory를 통해 Transformer에 제공된 인코더에 입력 형식과 호환되는 수준과 프로필이 있어야 합니다.

이 최적화는 작동 동영상 효과가 없고 90도로 나눌 수 있는 회전을 제외하고는 효과가 없는 단일 애셋 MP4 입력에서만 작동합니다. 최적화가 실패하면 Transformer는 자동으로 일반 내보내기로 대체하고 최적화 결과를 ExportResult.OptimizationResult에 보고합니다.

이 기능의 유효성을 검사하는 중이며 향후 출시에서는 비실험용이 될 것으로 예상됩니다.

동영상 수정사항

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에서 ExoPlayer.setVideoEffects를 사용하여 미리보기에도 지원됩니다.

데모 앱에는 맞춤 동영상 효과의 예가 포함되어 있습니다.

오디오 수정

오디오 효과는 일련의 AudioProcessor 인스턴스를 원본 (PCM) 오디오에 적용하는 방식으로 구현됩니다. ExoPlayer는 오디오 수정사항을 미리 볼 수 있는 DefaultAudioSink.Builder에 오디오 프로세서를 전달하는 기능을 지원합니다.