FFmpeg开发笔记(七十七)Android的开源音视频剪辑框架RxFFmpeg
<span id="cke_bm_724S">《FFmpeg开发实战:从零基础到短视频上线》一书的“第 12 章 FFmpeg的移动开发”介绍了如何使用FFmpeg在手机上剪辑视频,方便开发者更好地开发类似剪映那样的视频剪辑软件。那么在Android系统上还有一款国产的开源视频剪辑框架RxFFmpeg,通过该框架可以更快地开发剪辑App,下面就要介绍如何在App工程中使用RxFFmpeg。</span><p><span id="cke_bm_724S"> RxFFmpeg是一个Android平台的音视频编辑、视频剪辑的快速处理框架,它基于多个音视频开源框架,包括但不限于FFmpeg 4.0、x264、mp3lame、fdk-aac、opencore-amr、openssl等等。RxFFmpeg主要提供拼接、转码、压缩、裁剪、变速、分离音视频、添加片头片尾、添加贴纸、添加字幕、添加滤镜、添加背景音乐等常见功能,能够基本满足音视频文件的日常剪辑需求。<br>
RxFFmpeg的源码托管地址为https://github.com/microshow/RxFFmpeg,最新版本是2020年11月发布的RxFFmpeg 4.9(星星数4.6k),可见该框架的源码更新十分及时。并且RxFFmpeg的源码采用Java+XML编写,对于初学者而言非常友好,使用Android Studio Dolphin(小海豚版本)无需任何改动即可直接导入RxFFmpeg的demo工程。<br>
在自己的App工程中集成RxFFmpeg也很简单,只要执行下列几个步骤就行。</span></p>
<h1>一、导入RxFFmpeg库</h1>
<p>如果已经事先导入RxFFmpeg的库工程,则只需在build.gradle中添加下面一行即可引入RxFFmpeg:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="8" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22implementation%20project(path%3A%20'%3Arxffmpeg')%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">implementation project(path: ':rxffmpeg')</code></pre>
</div>
<p>如果不用库工程,也只要在build.gradle中添加下面一行即可引入RxFFmpeg:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="7" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22implementation%20'com.github.microshow%3ARxFFmpeg%3A4.9.0'%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">implementation 'com.github.microshow:RxFFmpeg:4.9.0'</code></pre>
</div>
<p>如果没有较高要求的话,添加下面这行极速版的RxFFmpeg也够了:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="6" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22%2F%2F%20%E6%9E%81%E9%80%9F%E7%89%88%20(%E9%A2%84%E8%AE%A1%E5%8D%A0%E7%94%A8%204M%20%E5%B7%A6%E5%8F%B3%E7%A9%BA%E9%97%B4)%EF%BC%8C%E4%B8%BB%E8%A6%81%E7%A7%BB%E9%99%A4%E4%BA%86%E4%B8%80%E4%BA%9B%E4%B8%8D%E5%B8%B8%E7%94%A8%E7%9A%84%E7%BC%96%E8%A7%A3%E7%A0%81%E5%99%A8%5Cnimplementation%20'com.github.microshow%3ARxFFmpeg%3A4.9.0-lite'%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">// 极速版 (预计占用 4M 左右空间),主要移除了一些不常用的编解码器
implementation 'com.github.microshow:RxFFmpeg:4.9.0-lite'</code></pre>
</div>
<h1>二、执行FFmpeg命令</h1>
<p>在App工程的Java代码中可通过以下方式异步执行FFmpeg的音视频剪辑命令:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="5" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22private%20void%20runFFmpegRxJava()%20%7B%5Cn%C2%A0%20%C2%A0%20String%20text%20%3D%20%5C%22%E8%BF%99%E9%87%8C%E5%A1%AB%E5%AE%8C%E6%95%B4%E7%9A%84ffmpeg%E5%89%AA%E8%BE%91%E5%91%BD%E4%BB%A4%5C%22%3B%5Cn%C2%A0%20%C2%A0%20String%5B%5D%20commands%20%3D%20text.split(%5C%22%20%5C%22)%3B%5Cn%C2%A0%20%C2%A0%20myRxFFmpegSubscriber%20%3D%20new%20MyRxFFmpegSubscriber(this)%3B%5Cn%C2%A0%20%C2%A0%20%2F%2F%E5%BC%80%E5%A7%8B%E6%89%A7%E8%A1%8CFFmpeg%E5%91%BD%E4%BB%A4%5Cn%C2%A0%20%C2%A0%20RxFFmpegInvoke.getInstance()%5Cn%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20.runCommandRxJava(commands)%5Cn%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20.subscribe(myRxFFmpegSubscriber)%3B%5Cn%7D%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">private void runFFmpegRxJava() {
String text = "这里填完整的ffmpeg剪辑命令";
String[] commands = text.split(" ");
myRxFFmpegSubscriber = new MyRxFFmpegSubscriber(this);
//开始执行FFmpeg命令
RxFFmpegInvoke.getInstance()
.runCommandRxJava(commands)
.subscribe(myRxFFmpegSubscriber);
}</code></pre>
</div>
<p>开始音视频剪辑操作后,可通过以下代码中断RxFFmpeg的剪辑操作:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="4" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22RxFFmpegInvoke.getInstance().exit()%3B%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">RxFFmpegInvoke.getInstance().exit();</code></pre>
</div>
<p>如果不是剪辑加工音视频文件,仅仅需要获取音视频文件的媒体信息,也可调用以下代码抓取指定文件携带的媒体信息:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="3" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22String%20filePath%20%3D%20%5C%22%E8%BF%99%E9%87%8C%E5%A1%AB%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E7%9A%84%E5%AE%8C%E6%95%B4%E8%B7%AF%E5%BE%84%5C%22%3B%5CnString%20mediaInfo%20%3D%20RxFFmpegInvoke.getInstance().getMediaInfo(filePath)%3B%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">String filePath = "这里填音视频文件的完整路径";
String mediaInfo = RxFFmpegInvoke.getInstance().getMediaInfo(filePath);</code></pre>
</div>
<p>由此可见,RxFFmpeg用起来很简单,只要开发者掌握常见的ffmpeg操作命令,就能快速地在自己的App工程中添加各种音视频剪辑功能。<br>
按照上述几个步骤给App工程集成RxFFmpeg后,编译运行RxFFmpeg的demo工程,打开测试App如下图所示。</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-display-name="图像" data-cke-filter="off" data-cke-widget-id="2" data-cke-widget-wrapper="1"><span class="cke_reset cke_widget_drag_handler_container"><span class="cke_image_resizer" title="点击并拖拽以改变尺寸"><span class="cke_widget_edit_container" title="编辑图片"><img src="https://img2024.cnblogs.com/blog/729938/202507/729938-20250713181332791-1710887663.jpg"></span></span></span></span></p>
<p>可见RxFFmpeg界面简洁,容易上手,是个不错的国产视频剪辑SDK。</p>
<p>更多详细的FFmpeg开发知识参见<span class="cke_widget_wrapper cke_widget_inline cke_widget_csdnlink cke_widget_selected" data-cke-display-name="a" data-cke-filter="off" data-cke-widget-id="1" data-cke-widget-wrapper="1">《FFmpeg开发实战:从零基础到短视频上线》一书。</span></p>
<span data-cke-copybin-start="1">
<span data-cke-copybin-end="1"></span></span><br><br>
来源:https://www.cnblogs.com/aqi00/p/18982640
頁:
[1]