支持的格式

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

Transformer 还依赖于 MediaCodec 进行编码,并且需要对输出媒体文件进行多路复用(或 mux),这限制了支持的输出格式。如需详细了解编码限制,请参阅 MediaCodec 视频编解码器;如需了解适用于输出媒体容器的限制,请参阅 MediaMuxer。转换器仅输出 MP4 文件。

默认情况下,Transformer 使用 MediaMuxer,但您也可以选择使用正在开发中的 InAppMuxer,以避免 MediaMuxer 在参考帧结构和支持的样本格式方面的一些限制。在未来的版本中,默认复用器将成为应用内复用器。

图片支持

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)

处理慢动作媒体

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

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

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