| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android 接入FFmpeg命令-低成本完成各类音视频操作 -> 正文阅读 |
|
[移动开发]Android 接入FFmpeg命令-低成本完成各类音视频操作 |
零、写在前面????????利用FFmpeg的基础库方法我们能完成大多数的音视频操作,但同时FFmpeg也封装了常用的操作,只需要我们执行命令即可,极大的降低了开发成本。例如实现一个转码的业务,哪怕简单点来说我们也要要解码-重采样-编码。这其中我们要考虑很多条件,音频信息导致的不同处理,异常的捕捉等等,麻烦不说,兼容性都有一段路走。所以如果不是因为要对音频有特殊的逻辑处理,我们完全可以用命令来解决。但是看看FFmpeg的源码,它的命令是针对命令行环境的,和Android上运行还是有一定的差距,所以我们需要在原基础上做一些Android端的适配,使我们Android端也能轻松使用命令,低成本完成各类音频操作。后续操作都在已编译好Android端so库的情况下进行,如果还没有走过这一步的朋友可以先看看我之前的文章《Unbuntu环境编译 Android平台可用ffmpeg(带三方库fdk-aac和lame)》https://blog.csdn.net/qq_37841321/article/details/122294098?spm=1001.2014.3001.5502 一、导入资源和编译1.1、导入相关源文件????????FFmpge源码下有一个fftools目录,里面就是一些ffmpeg的命令行程序,我们将他们导入进来,进行一定的修改后再自行编译成我们的lib。 ????????首先是对库文件进行相应的修改,因为ffmpeg.c在windows上的目的是编译成一个可执行的应用,所以它的入口是main 通过命令行传参,所以我们这里需要把main函数改一下,改成一个我们具体功能的名字,例如我喜欢叫它exc,然后再再头文件中声明我们刚改的函数名,这样它就变成了一个库文件。我们在jni的地方调用exc进行传参,就达到了电脑端命令行的效果。 ????????还有一个地方,ffmpeg如果指令执行出错是执行的退出程序指令,我们在Android端肯定不行,那不然指令执行不成功就一个闪退这谁都顶不住,所以我们需要把exit_program函数的exit(ret);去掉,这里我们可以做我们自己的逻辑,进行自己的错误码回调。 ????????原代码 ????????void exit_program(int ret) ????????????????exit(ret); ????????修改后 ????????void exit_program(int ret) ????????编译过程中发现会有些库丢失,可以删掉也可以把库引进来.主要看这些库是否是你所需要的功能,例如有些是一些打印函数缺失的我不需要我就直接删掉也懒得导包了。 1.2、cmdkelist的编写????????首先是引入头文件目录 以我的文件目录为例我的为 include_directories(ffmpeg/fftools),后续的依赖完整如下:
?????????cmdutils.c、ffmpeg.c、ffmpeg_opt.c、ffmpeg_filter.c、ffmpeg_hw.c、ffmpeg-cmd.c都有一定的依赖关系,这几个C文件共同编译成一个库ffmpeg-cmd,ffmpeg-cmd是我的JNI层方法,负责双边沟通,fftools中依赖了其它例如解码,滤镜,重采样等外部库,也是我们之前编译了的其它库,我们需要把它们作为ffmpeg-cmd的库链接进去。 二、加入执行回调????????对于命令的执行很多时候是一个耗时操作,我们UI不可能在那里干等,所以我们需要给命令执行加入回调,告诉Java层指令的执行状态,好做一些进度的变更,成功或失败的处理。最基本的我们给指令执行加入进度,失败,成功的回调。 2.1、执行进度回调????????ffmpeg.c里有一个print_report方法,里面主要是一个它自身进度的打印,我们看其中一段主要代码
????????在这里它计算出了已经执行完成的文件时长,同样的我们传入函数指针,把这个时长传到Java层,稍加计算就能得到我们需要的进度。
2.1、执行成功/失败回调????????不管成功还是失败,ffmpeg都会走void exit_program(int ret)方法,它自身会先走一个ffmpeg_cleanup方法,做一些他自己的收尾工作。我们可以在它自身方法的后面插入我们自己的回调方法,就是我们自己传入一个函数指针,其实就是我们重写一个相同签名的方法然后把这个方法的地址传过去,程序自己进行地址切换,跳转执行。回调0表示成功,回调其它表示失败。Java层怎么把接口传给C层在这里就不在赘述,也可以看看我之前的文章《JNI常用开发技巧》
????????使用时我们把这两个函数指针传进去即可。执行一段命令就会有进度和状态的回调,我们可以把它展示到UI上。?
三、常见音频操作命令? ? ? ? 当然命令还是得看FFmpeg官方文档,但是官方有些好像并没有中文文档,大家可以找找中文翻译的。我这里列出几个我在用的一些命令,包括音频操作和音频滤镜,其余的大家可以自由发挥。
四、写在最后? ? ? ? ????????欢迎大家交流讨论,批评指正。觉得有帮助的点个赞吧。我会稳定更新音视频和Android相关的文章,觉得有用的希望大家关注哦。 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 23:50:51- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |