有关媒体格式的总体介绍,请参阅 ExoPlayer 支持的格式页面。加载、提取和解码流的相同限制也适用于 Transformer,但 Transformer 不支持 ExoPlayer 捆绑的软件解码器模块。
Transformer 还依赖于 MediaCodec
进行编码,并且需要对输出媒体文件进行多路复用(即 mux),这限制了支持的输出格式。有关编码限制的更多信息,请参阅 MediaCodec 视频编解码器;有关适用于输出媒体容器的限制,请参阅 MediaMuxer。Transformer 仅输出 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 色彩空间。HDR_MODE_KEEP_HDR
是构建 Composition
时的默认模式。如果不支持 HDR 编辑,Transformer 会回退到使用 HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL
。
从 Android 10(API 级别 29)及更高版本开始,在具有所需解码和 OpenGL 支持的设备上,支持将 HDR 转换为 SDR(也称为色调映射)。这在将 HDR 媒体共享给不支持 HDR 内容摄取的其他应用或服务时非常有用。要在创建 Composition
时使用 OpenGL 启用色调映射,请调用 setHdrMode(HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL)
。从 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);
这使您能够支持慢动作视频,而无需担心处理这些特殊格式。您只需存储和播放视频的扁平化版本,而不是原始版本。