FFmpeg开发笔记(五十七)使用Media3的Transformer加工视频文件
继音视频播放器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加工视频文件的更多相关文章
- FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建
前言 本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8. FFmpeg简介 FFmpeg是领先的多媒体框架,能够解码 ...
- FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放
前言 ffmpeg播放rtsp网络流和摄像头流. Demo 使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克 使用ffmpeg播放网络rtsp文件流 ...
- FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台
FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待 前言 将ffmpeg移植到海思H ...
- Django开发笔记五
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.页面继承 定义base.html: <!DOC ...
- FFmpeg开发笔记(一)搭建Linux系统的开发环境
对于初学者来说,如何搭建FFmpeg的开发环境是个不小的拦路虎,因为FFmpeg用到了许多第三方开发包,所以要先编译这些第三方源码,之后才能给FFmpeg集成编译好的第三方库.不过考虑到刚开始仅仅调用 ...
- Java开发笔记(八十六)通过缓冲区读写文件
前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作“字符流I/O”,其中字母I代表输入Input,字母O ...
- FFmpeg开发笔记(二)搭建Windows系统的开发环境
由于Linux系统比较专业,个人电脑很少安装Linux,反而大都安装Windows系统,因此提高了FFmpeg的学习门槛,毕竟在Windows系统搭建FFmpeg的开发环境还是比较麻烦的.不过若有已经 ...
- .Net开发笔记(十七) 应用程序扩展
在很多场合,我们需要在已有软件程序上增加一些新的功能,几乎所有原因是因为原有软件功能不能满足我们的需要,我们平时做的插件就属于这种情况,最常见的是VS IDE的插件开发,网上老外写的一篇关于插件开发的 ...
随机推荐
- MyBatis-Plus删除操作的几种基本方法
delete删除的三种方法 一.根据 id 删除 @Test void deleteById(Integer id) { empMapper.deleteById(new Emp().getId()) ...
- Ubuntu18.04终端alacritty安装及配置
想在Ubuntu上安装alacritty终端,发现不能直接安装,在网上找到教程: Linux上安装使用最快的 GPU 加速的终端仿真器Alacritty 根据教程成功在Ubuntu18.04桌面系统上 ...
- 暑假Java自学进度总结06
一.今日所学: 1.for循环 for(初始化语句;条件判断语句;条件控制语句){ 循环体语句; } 执行流程: 1>执行初始化语句 2>执行条件判断语句,若为true则执行循环体语句,若 ...
- 这才是java对象正解
这才是 Java 对象正解 在深入讨论对象之前,让我们先明确对对象和实例的理解. 什么是对象? 对象(Object)是内存中分配的实际数据结构,它包含了数据和方法.在 Java 中,对象是类的一个实例 ...
- ai识图测试
var code = "9392b629-0d84-43ef-9b0f-34740fb024a6"
- locale 设置
locale 介绍 在终端中,locale(本地化)设置是指与本地语言.国家和文化偏好有关的环境变量的配置.这些设定决定了程序如何处理和显示字符.时间.日期格式.货币等. 在类 Unix 系统(比如 ...
- 【测试平台开发】——05Flask后端api开发实战(二)—— SqlAlchemy
SqlAlchemy SQLAlchemy是Python编程语言下的一款开源软件.提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行. SQLAlchemy"采用简单的Py ...
- Kubernetes-4:kubectl常用命令总结
kubectl常用命令 1.kubectl get 显示资源 ## 查看pod列表,若pod后不指定名称空间(namespace),则默认为default名称空间 kubectl get pod ## ...
- SpringMVC:注解配置SpringMVC
目录 创建初始化类,代替web.xml 创建SpringConfig配置类,代替spring的配置文件 创建WebConfig配置类,代替SpringMVC的配置文件 测试功能 使用配置类和注解代替w ...
- 千牛hook 旺旺hook,旺旺发消息call,千牛发消息call,千牛机器人,破解旺旺发消息代码,破解千牛发消息代码,反汇编旺旺发消息,反汇编千牛发消息,旺旺发消息组件,千牛发消息组件
由于工作需要,做了相关的编码,有demo,拿去后,直接按demo写代码即可实现千牛发消息,非常稳定.非反汇编找call,基本不怕千牛升级,原理是基于千牛架构做出来的,除非千牛改架构,已稳定使用2年,未 ...