如需大致了解媒体格式,请参阅 ExoPlayer 支持的格式页面。Transformer 在加载、提取和解码视频流方面也存在同样的限制,不过 Transformer 不支持 ExoPlayer 的捆绑式软件解码器模块。
Transformer 还依赖于 MediaCodec 进行编码,这限制了支持的输出格式。如需详细了解编码限制,请参阅 MediaCodec 视频编解码器。
默认情况下,Transformer 使用 InAppMp4Muxer 输出标准 MP4 文件。
如果您的应用需要分段 MP4,您可以在初始化 Transformer 实例时传递 InAppFragmentedMp4Muxer.Factory。Media3 还支持其他格式,例如 WebM、AAC、Ogg,使用专用混合器(例如 WebmMuxer、AacMuxer 和 OggMuxer)。这些必须封装在自定义 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)。
处理慢动作媒体
慢动作视频包含元数据,用于指示应以何种速度播放视频流的每个部分。平滑处理是指根据慢动作视频生成新的视频流的过程,其中各部分会根据元数据加快或减慢播放速度,以便即使在不应用慢动作元数据的播放器上也能正确播放。
如需展平慢动作视频流,请对 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);
这样,您就可以支持慢动作视频,而无需担心如何处理这些特殊格式。您只需存储并播放扁平化版本的视频,而不是原始视频。