支持的格式

如需大致了解媒体格式,请参阅 ExoPlayer 支持的格式页面。Transformer 在加载、提取和解码视频流方面也存在同样的限制,不过 Transformer 不支持 ExoPlayer 的捆绑式软件解码器模块。

Transformer 还依赖于 MediaCodec 进行编码,这限制了支持的输出格式。如需详细了解编码限制,请参阅 MediaCodec 视频编解码器

默认情况下,Transformer 使用 InAppMp4Muxer 输出标准 MP4 文件。如果您的应用需要分段 MP4,您可以在初始化 Transformer 实例时传递 InAppFragmentedMp4Muxer.Factory。Media3 还支持其他格式,例如 WebM、AAC、Ogg 和 WAV,这些格式使用 WebmMuxerAacMuxerOggMuxerWavMuxer 等专用混合器。这些必须封装在自定义 Muxer.Factory 中才能注入,但未来的版本将包含可直接使用的工厂实现,以简化此流程。

图片支持

Transformer 使用 BitmapFactory 加载和解码所有图片资源,因此 Transformer 支持 BitmapFactory 支持的所有格式。如需了解支持的图片类型,请参阅图片支持。对于多图片格式(例如 GIF),如果使用 DefaultAssetLoaderFactory,则会显示容器中的单个图片帧。

特殊格式

Transformer 支持处理采用较新媒体格式的输入,与传统格式相比,这些格式可提供特殊功能。

处理 HDR 视频

越来越多的设备支持拍摄 HDR 视频,可呈现更鲜艳、更准确的色彩和更广的亮度范围。

Transformer 支持在搭载 Android 13(API 级别 33)及更高版本的设备上编辑 HDR 视频,前提是设备支持所需的编码。在编辑 HDR 视频时,任何 GL 视频特效都需要处理 16 位浮点颜色分量和 BT.2020 色彩空间。构建 Composition 时,HDR_MODE_KEEP_HDR 是默认模式。如果不支持 HDR 编辑,转换器会回退到使用 HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL

从 Android 10(API 级别 29)开始,在具备所需解码和 OpenGL 支持的设备上,支持将 HDR 转换为 SDR(也称为色调映射)。当您要将 HDR 媒体分享给不支持接收 HDR 内容的其他应用或服务时,此功能非常有用。如需使用 OpenGL 调用 setHdrMode(HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL) 在创建 Composition 时启用色调映射。从 Android 12(API 级别 31)开始,MediaCodec 还支持在某些设备上进行色调映射,包括所有搭载 Android 13 或更高版本且可以拍摄 HDR 视频的设备。如需使用 MediaCodec 启用色调映射,请调用 setHdrMode(HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC)

Transformer 还支持以下高级转码场景:

  • 将 Ultra HDR 转换为 HDR 视频:您可以将 Ultra HDR 图片输入转换为 HDR 视频,同时保留图片的动态范围和广色域,以便静态照片在混合时间轴中与 HDR 视频的峰值亮度和鲜艳度相匹配。
  • 杜比视界转码和转封装:转换器支持对杜比视界(配置文件 8)媒体中的向后兼容基本层(例如 HEVC)进行转封装,而无需重新编码,或者通过色调映射将其转码为标准 SDR 格式。

处理慢动作媒体

慢动作视频包含元数据,用于指明应以何种速度播放视频流的每个部分。展平是指根据慢动作视频生成新的视频串流的过程,其中各部分会根据元数据加快或减慢播放速度,以便即使在不应用慢动作元数据的播放器上也能正确播放。

如需展平慢动作视频流,请对 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);

这样,您就可以支持慢动作视频,而无需担心如何处理这些特殊格式。您只需存储并播放扁平化版本的视频,而不是原始视频。