2021-11-27 12:51:06
FFmpeg开发笔记(五十七)使用Media3的Transformer加工视频文件
一、Media3 Transformer简介Media3是谷歌推出的Android媒体库,旨在解决媒体功能的碎片化问题,提供统一的音视频处理架构。Transformer作为Media3的转换组件,支持以下功能:
依赖库引入在模块的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播放网络视频》中的环境要求。
示例代码参考谷歌官方示例源码托管在
通过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);四、关键注意事项权限配置在AndroidManifest.xml中添加读写权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />输出路径有效性确保outputPath指向应用有权限访问的目录(如Context.getExternalFilesDir())。
性能优化
高分辨率视频处理可能需硬件加速,检查设备兼容性。
长时间任务建议在后台线程执行,避免阻塞UI。
错误处理监听onError事件并记录日志,常见错误包括:
输入文件损坏(ExportException.ERROR_CODE_IO_FILE_NOT_FOUND)
不支持的编码格式(需验证设备是否支持H265)。
Media3 Transformer提供了一种声明式的API来处理音视频,相比直接使用FFmpeg更贴近Android生态。其优势在于与ExoPlayer的无缝集成及硬件加速支持,适合需要快速实现基础编辑功能的场景。如需更复杂的操作(如多轨混音、自定义编码参数),仍需结合FFmpeg或其他专业库。
参考书籍:《FFmpeg开发实战:从零基础到短视频上线》提供了底层原理与高级技巧的补充。