지원되는 형식

일반적인 미디어 형식에 관한 소개는 ExoPlayer 지원 형식 페이지를 참고하세요. 스트림 로드, 추출, 디코딩에 관한 동일한 제한사항이 Transformer에도 적용되지만 Transformer는 ExoPlayer의 번들 소프트웨어 디코더 모듈을 지원하지 않습니다.

Transformer는 인코딩에 MediaCodec도 사용하고 출력 미디어 파일인 mux를 다중화해야 하므로 지원되는 출력 형식이 제한됩니다. 인코딩 제한사항에 관한 자세한 내용은 MediaCodec 동영상 코덱을, 출력 미디어 컨테이너에 적용되는 제한사항에 관한 자세한 내용은 MediaMuxer를 참고하세요. Transformer는 MP4 파일만 출력합니다.

기본적으로 TransformerMediaMuxer를 사용하지만 참조 프레임 구조 및 지원되는 샘플 형식과 관련된 MediaMuxer의 제한을 피하기 위해 진행 중인 작업 InAppMuxer를 선택적으로 사용할 수 있습니다. 향후 버전에서는 기본 Muxer가 인앱 Muxer가 될 예정입니다.

이미지 지원

Transformer는 BitmapFactory를 사용하여 모든 이미지 애셋을 로드하고 디코딩하므로 BitmapFactory가 지원하는 모든 형식을 지원합니다. 지원되는 이미지 유형은 이미지 지원을 참고하세요. 여러 사진 형식 (예: GIF)의 경우 DefaultAssetLoaderFactory가 사용되면 컨테이너의 단일 이미지 프레임이 표시됩니다.

특수 형식

Transformer는 기존 형식에 비해 특별한 기능을 제공하는 최신 미디어 형식의 입력 처리를 지원합니다.

HDR 동영상 처리

이제 HDR 동영상 캡처를 지원하는 기기가 점점 늘어나면서 더 선명하고 정확한 색상과 더 큰 밝기 범위를 제공합니다.

Transformer는 필수 인코딩이 지원되는 기기에서 Android 13 (API 수준 33) 이상의 HDR 동영상 편집을 지원합니다. HDR 동영상을 수정할 때 모든 GL 동영상 효과는 16비트 부동 소수점 색상 구성요소와 BT.2020 색공간을 처리해야 합니다. HDR_MODE_KEEP_HDRComposition 빌드 시 기본 모드입니다. HDR 수정이 지원되지 않는 경우 변환기는 HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL를 사용하도록 대체합니다.

톤 매핑이라고도 하는 HDR을 SDR로 변환하는 작업은 필수 디코딩 및 OpenGL 지원이 포함된 기기에서 Android 10 (API 수준 29)부터 지원됩니다. 이는 HDR 콘텐츠 처리를 지원하지 않는 다른 앱이나 서비스에 HDR 미디어를 공유할 때 유용합니다. OpenGL을 사용하여 톤 매핑을 사용 설정하려면 Composition를 만들 때 setHdrMode(HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL)를 호출합니다. Android 12 (API 수준 31)부터 MediaCodec는 HDR 동영상을 캡처할 수 있는 Android 13 이상을 실행하는 모든 기기를 포함한 일부 기기에서도 톤 매핑을 지원합니다. MediaCodec를 사용하여 톤 매핑을 사용 설정하려면 setHdrMode(HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC)를 호출합니다.

슬로 모션 미디어 처리

슬로우 모션 동영상에는 스트림의 각 섹션이 재생되어야 하는 속도를 나타내는 메타데이터가 포함됩니다. 평면화는 슬로 모션 메타데이터를 적용하지 않는 플레이어에서도 제대로 재생되도록 슬로 모션 동영상을 기반으로 새 동영상 스트림을 생성하는 프로세스입니다. 이때 메타데이터에 따라 섹션이 빨라지거나 느려집니다.

슬로 모션 스트림을 평면화하려면 EditedMediaItem에서 setFlattenForSlowMotion 빌더 메서드를 사용합니다.

Kotlin

val editedMediaItem =
    EditedMediaItem.Builder(inputMediaItem).setFlattenForSlowMotion(true).build()
val transformer =
    Transformer.Builder(context).addListener(transformerListener).build()
transformer.start(editedMediaItem, outputPath)

Java

EditedMediaItem editedMediaItem =
    new EditedMediaItem.Builder(inputMediaItem).setFlattenForSlowMotion(true).build();
Transformer transformer =
    new Transformer.Builder(context).addListener(transformerListener).build();
transformer.start(editedMediaItem, outputPath);

따라서 이러한 특수 형식의 처리에 관해 걱정할 필요 없이 슬로 모션 동영상을 지원할 수 있습니다. 원래 동영상이 아닌 평면화된 버전의 동영상을 저장하고 재생하기만 하면 됩니다.