​继音视频播放器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开发实战:从零基础到短视频上线》一书。

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

  1. FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  2. FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建

    前言   本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8.   FFmpeg简介   FFmpeg是领先的多媒体框架,能够解码 ...

  3. FFmpeg开发笔记(四):ffmpeg解码的基本流程详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  4. FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放

    前言   ffmpeg播放rtsp网络流和摄像头流.   Demo   使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克     使用ffmpeg播放网络rtsp文件流 ...

  5. FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台

    FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待   前言   将ffmpeg移植到海思H ...

  6. Django开发笔记五

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.页面继承 定义base.html: <!DOC ...

  7. FFmpeg开发笔记(一)搭建Linux系统的开发环境

    对于初学者来说,如何搭建FFmpeg的开发环境是个不小的拦路虎,因为FFmpeg用到了许多第三方开发包,所以要先编译这些第三方源码,之后才能给FFmpeg集成编译好的第三方库.不过考虑到刚开始仅仅调用 ...

  8. Java开发笔记(八十六)通过缓冲区读写文件

    前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作“字符流I/O”,其中字母I代表输入Input,字母O ...

  9. FFmpeg开发笔记(二)搭建Windows系统的开发环境

    由于Linux系统比较专业,个人电脑很少安装Linux,反而大都安装Windows系统,因此提高了FFmpeg的学习门槛,毕竟在Windows系统搭建FFmpeg的开发环境还是比较麻烦的.不过若有已经 ...

  10. .Net开发笔记(十七) 应用程序扩展

    在很多场合,我们需要在已有软件程序上增加一些新的功能,几乎所有原因是因为原有软件功能不能满足我们的需要,我们平时做的插件就属于这种情况,最常见的是VS IDE的插件开发,网上老外写的一篇关于插件开发的 ...

随机推荐

  1. NVIDIA公司在实体机器人上的第一步尝试 —— Nova Cater AMR —— 九号机器人与英伟达联合开发的自动驾驶研发平台“Nova Cater AMR(简称:NC)”

    相关: https://www.leiphone.com/category/robot/Hgy9i8azqGncESIB.html Nova Cater AMR是一款仓储运货机器人,可以应用在仓储物流 ...

  2. ubuntu 配置NTP时间服务器&&定时同步本地时间

    Ubuntu系统: NTP时间服务器的安装: 服务器安装命令: sudo apt-get install ntp NTP服务配置,设置为本地时间服务器,屏蔽默认server,服务器层级设为10: vi ...

  3. 【转载】 解决 sudo echo x > 时的 Permission denied错误

    版权声明:本文为CSDN博主「Yannick_J」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/don_chi ...

  4. 023.Ubuntu常见个性化配置

    root登录设置 ubuntu默认关闭了root账户,可根据实际情况开启或关闭root登录. ubuntu@localhost:~$ sudo apt install openssh-server u ...

  5. springcloud线上发布超时之feign(ribbon饥饿加载)

    springcloud线上发布超时系列文章: springcloud线上发布超时之feign(ribbon饥饿加载) springcloud线上发布超时之grpc springcloud线上发布超时方 ...

  6. 蓝松SDK版本更新至【4.8.0】

    [Android更新] 1. android增加低精度模型,一些低端机也可以流畅抠图. 2. android针对直播机硬件做了特定API,并C语言开源. 3. 视频编辑引出帧解码图层, 允许外界异步形 ...

  7. k8s单机部署

    一.环境 64位centos 二.安装 (1)关闭防火墙 systemctl stop firewalld systemctl disable firewalld (2)安装etcd与kubernet ...

  8. Ansible-playbook 应用梳理

    前面已经介绍过Ansible的安装配置及常见模块的使用 --<Linux下使用Ansible处理批量操作> Palybook简介 palybook是由一个或多个paly组成的列表,play ...

  9. IVIEW 评分组件 Rate 介绍

    1. 首先,评分允许评半颗星,使用 allow-half <template> <Rate allow-half v-model="valueHalf" /> ...

  10. PyTorch从入门到放弃之张量模块

    目录 张量的数据类型 torch.rand()函数 torch.randn()函数 torch.normal()函数 torch.linspace()函数 torch.manual_seed()函数 ...