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

举报
aqi00 发表于 2024/10/16 14:36:08 2024/10/16
【摘要】 ​继音视频播放器ExoPlayer之后,谷歌又推出了音视频转换器Transformer,要在音视频加工领域施展拳脚。根据Android开发者官网介绍:Jetpack Media3是Android媒体库的新家,可让App呈现丰富的视听体验。Media3提供了一个简单的架构,能够基于设备功能开展自定义与可靠性优化,可以解决媒体部分的碎片化问题。Transformer作为Media3架构中的转换组...

继音视频播放器ExoPlayer之后,谷歌又推出了音视频转换器Transformer,要在音视频加工领域施展拳脚。根据Android开发者官网介绍:Jetpack Media3是Android媒体库的新家,可让App呈现丰富的视听体验。Media3提供了一个简单的架构,能够基于设备功能开展自定义与可靠性优化,可以解决媒体部分的碎片化问题。

Transformer作为Media3架构中的转换组件,可以用于编辑加工音视频,包括在不同格式之间转换编码与修改媒体内容,例如从较长的视频剪辑片段、或者应用自定义的滤镜效果,以及其他音视频编辑操作等等。
谷歌官方也提供了Transformer的代码应用例子,示例源码的托管地址为https://github.com/androidx/media/tree/release/demos,托管页面打开之后访问transformer目录,即可找到Transformer组件的实际运用模块代码。
因为Transformer被Media3囊括在内,所以它对运行环境要求颇高,具体环境要求参见之前的文章《使用Media3的Exoplayer播放网络视频》。准备好了开发环境之后,再按照以下描述引入Media3的ExoPlayer库,详细步骤说明如下。

一、修改模块的build.gradle

在build.gradle的dependencies节点内部补充下面的导包语句,把Transformer用到的相关库都加进来。

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

二、活动页面代码增加Transformer的处理代码

首先创建音视频的时间处理效果,比如下面代码构建了一个剪辑视频片段的媒体项目,准备把视频文件的第10秒到第20秒单独剪辑出来。

MediaItem.ClippingConfiguration clippingConfiguration =
  new MediaItem.ClippingConfiguration.Builder()
    .setStartPositionMs(10_000) // start at 10 seconds
    .setEndPositionMs(20_000) // end at 20 seconds
    .build();
MediaItem mediaItem = new MediaItem.Builder()
    .setUri(mVideoUri)
    .setClippingConfiguration(clippingConfiguration)
    .build();

接着创建音视频的空间处理效果,包括旋转、缩放视频画面等等,并对上一步的媒体项目运用指定的空间效果。创建代码如下:

ScaleAndRotateTransformation rotateEffect =
  new ScaleAndRotateTransformation.Builder()
    //.setRotationDegrees(90f)
    .setScale(0.5f, 0.5f)
    .build();
Effects effects = new Effects(
    ImmutableList.of(),
    ImmutableList.of(rotateEffect)
);
EditedMediaItem editedMediaItem =
  new EditedMediaItem.Builder(mediaItem)
    .setEffects(effects)
    .build();

然后按照以下代码构建转换器对象,指定输出视频格式为H265,输出音频格式为AAC,并且监听转换操作的结束事件和失败事件。构建代码如下:

Transformer transformer = new Transformer.Builder(this)
    .setVideoMimeType(MimeTypes.VIDEO_H265)
    .setAudioMimeType(MimeTypes.AUDIO_AAC)
    .addListener(new Transformer.Listener() {
        @Override
        public void onCompleted(Composition composition, ExportResult exportResult) {
            Toast.makeText(mContext, "转换成功", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(Composition composition, ExportResult exportResult, ExportException exportException) {
            Toast.makeText(mContext, "转换失败", Toast.LENGTH_SHORT).show();
            Log.d(TAG, "exportException: "+exportException.toString());
        }
    })
    .build();

最后填写输出文件的保存路径,调用转换器对象的start方法,开始执行音视频转换动作。转换代码如下:

String outputPath = mPath + DateUtil.getNowDateTime() + ".mp4";
transformer.start(editedMediaItem, outputPath);

编译运行App,即可在真机上选取视频文件并执行对应的编辑加工操作。

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。