FFmpeg开发笔记(五十七)使用Media3的Transformer加工视频文件

FFmpeg开发笔记(五十七)使用Media3的Transformer加工视频文件
最新回答
无可代替的骄傲

2021-11-27 12:51:06

FFmpeg开发笔记(五十七)使用Media3的Transformer加工视频文件

一、Media3 Transformer简介

Media3是谷歌推出的Android媒体库,旨在解决媒体功能的碎片化问题,提供统一的音视频处理架构。Transformer作为Media3的转换组件,支持以下功能:

  • 格式转换:在不同编码格式(如H264/H265)间转换。
  • 内容编辑:剪辑、旋转、缩放、滤镜等操作。
  • 自定义扩展:基于设备能力优化处理流程。
二、开发环境准备
  1. 依赖库引入在模块的build.gradle中添加以下依赖(版本需与Media3其他组件一致):

    implementation "androidx.media3:media3-transformer:1.4.0"implementation "androidx.media3:media3-effect:1.4.0"implementation "androidx.media3:media3-common:1.4.0"

    注:需确保Android Studio和Gradle版本兼容,参考官方文档《使用Media3的Exoplayer播放网络视频》中的环境要求。

  2. 示例代码参考谷歌官方示例源码托管在

    AndroidX Media仓库
    ,路径为/transformer目录。

三、核心代码实现1. 视频剪辑

通过MediaItem.ClippingConfiguration指定时间范围(如10秒到20秒):

MediaItem.ClippingConfiguration clippingConfig = new MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(10_000) // 起始时间(毫秒) .setEndPositionMs(20_000) // 结束时间 .build();MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) // 输入文件URI .setClippingConfiguration(clippingConfig) .build();2. 空间效果处理

使用ScaleAndRotateTransformation调整画面(如缩放50%):

ScaleAndRotateTransformation rotateEffect = new ScaleAndRotateTransformation.Builder() .setScale(0.5f, 0.5f) // 缩放比例(宽,高) .build();Effects effects = new Effects( ImmutableList.of(), // 音频效果(此处为空) ImmutableList.of(rotateEffect) // 视频效果列表);EditedMediaItem editedItem = new EditedMediaItem.Builder(mediaItem) .setEffects(effects) .build();3. 转换器配置与监听

设置输出格式(H265视频+AAC音频)并监听事件:

Transformer transformer = new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H265) // 输出视频格式 .setAudioMimeType(MimeTypes.AUDIO_AAC) // 输出音频格式 .addListener(new Transformer.Listener() { @Override public void onCompleted(Composition c, ExportResult r) { Toast.makeText(context, "转换成功", Toast.LENGTH_SHORT).show(); } @Override public void onError(Composition c, ExportResult r, ExportException e) { Log.e(TAG, "转换失败: " + e.getMessage()); } }) .build();4. 执行转换

指定输出路径并启动转换:

String outputPath = outputDir + "/output_" + System.currentTimeMillis() + ".mp4";transformer.start(editedItem, outputPath);四、关键注意事项
  1. 权限配置在AndroidManifest.xml中添加读写权限:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2. 输出路径有效性确保outputPath指向应用有权限访问的目录(如Context.getExternalFilesDir())。

  3. 性能优化

    高分辨率视频处理可能需硬件加速,检查设备兼容性。

    长时间任务建议在后台线程执行,避免阻塞UI。

  4. 错误处理监听onError事件并记录日志,常见错误包括:

    输入文件损坏(ExportException.ERROR_CODE_IO_FILE_NOT_FOUND)

    不支持的编码格式(需验证设备是否支持H265)。

五、扩展功能
  • 滤镜效果:通过Effect接口添加自定义滤镜(如亮度调整)。
  • 多片段拼接:使用MediaItem.Builder组合多个MediaItem。
  • 进度监听:实现Transformer.Listener的onTransformationProgress方法。
六、总结

Media3 Transformer提供了一种声明式的API来处理音视频,相比直接使用FFmpeg更贴近Android生态。其优势在于与ExoPlayer的无缝集成及硬件加速支持,适合需要快速实现基础编辑功能的场景。如需更复杂的操作(如多轨混音、自定义编码参数),仍需结合FFmpeg或其他专业库。

参考书籍:《FFmpeg开发实战:从零基础到短视频上线》提供了底层原理与高级技巧的补充。