请参阅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
。
将 HDR 转换为 SDR(也称为色调映射)从 Android 10(API 级别 29)开始在具有所需解码和 OpenGL 支持的设备上受支持。当将 HDR 媒体共享到不支持摄取 HDR 内容的其他应用或服务时,这非常有用。要使用 OpenGL 启用色调映射,请在创建 Composition
时调用 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);
这允许您支持慢动作视频,而无需担心处理这些特殊格式。您只需存储和播放视频的扁平化版本,而不是原始版本。