FFmpeg开发笔记(一百)国产的Android开源视频压缩工具VideoSlimmer
<span id="cke_bm_464S">在Android平台上,国产的开源视频剪辑框架也有很多了,参见之前的文章《国产的视频裁剪框架AndroidVideoTrimmer》、《国产的Android开源视频编辑器EpMedia》、《国产的开源视频美颜工具VideoEditorForAndroid》、《国产的开源视频剪辑工具AndroidVideoEditor》等等。那么在Android系统上还有一款国产的开源视频压缩工具VideoSlimmer,通过该框架可以更方便地压缩视频大小,下面就来介绍如何在App工程中使用VideoSlimmer。</span><p><span id="cke_bm_464S"> VideoSlimmer是一款专为Android平台设计的开源视频压缩工具,它通过Mediacodec实现视频压缩功能,并具有较高的压缩性能。VideoSlimmer支持压缩的视频格式包括mp4和3gp。<br>
VideoSlimmer的源码托管地址为https://github.com/zolad/VideoSlimmer(星星数0.2k),最近版本更新于2018年10月,该版本的压缩包下载地址为https://github.com/zolad/VideoSlimmer/archive/refs/heads/master.zip。<br>
VideoSlimmer提供了两种集成方式:引用在线库、直接导入源码,分别说明如下:</span></p>
<h1>一、引用VideoSlimmer在线库</h1>
<p>Android工程引用VideoSlimmer在线库时,需要修改以下两个配置:<br>
1、打开模块级别的build.gradle,给dependencies节点补充下面几行配置,表示引入1.0.0版本的VideoSlimmer库:</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="14" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22implementation%20'com.zolad%3Avideoslimmer%3A1.0.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.zolad:videoslimmer:1.0.0'</code></pre>
</div>
<p>2、打开App模块的src/main/AndroidManifest.xml,给manifest节点补充下面两行权限配置,表示声明读写存储空间两个权限:</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="13" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22%3Cuses-permission%20android%3Aname%3D%5C%22android.permission.READ_EXTERNAL_STORAGE%5C%22%20%2F%3E%5Cn%3Cuses-permission%20android%3Aname%3D%5C%22android.permission.WRITE_EXTERNAL_STORAGE%5C%22%20%2F%3E%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs"><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /></code></pre>
</div>
<h1>二、直接导入VideoSlimmer源码</h1>
<p>由于VideoSlimmer的发布时间较早,为了让小海豚版本的Android Studio Dolphin能够打开它的范例工程,需要对VideoSlimmer的App工程作如下修改:</p>
<h2>1、升级Gradle版本</h2>
<p>打开VideoSlimmer工程的gradle/wrapper/gradle-wrapper.properties,把下面这行配置</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="12" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22distributionUrl%3Dhttps%5C%5C%3A%2F%2Fservices.gradle.org%2Fdistributions%2Fgradle-4.4-all.zip%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip</code></pre>
</div>
<p>改成如下这行配置,表示把Gradle版本从4.4升级到5.4.1。</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="11" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22distributionUrl%3Dhttps%5C%5C%3A%2F%2Fservices.gradle.org%2Fdistributions%2Fgradle-5.4.1-bin.zip%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip</code></pre>
</div>
<h2>2、更新工具库的仓库位置</h2>
<p>打开VideoSlimmer工程的build.gradle,把里面的两处“jcenter()”都改为以下配置:</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="10" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22%2F%2F%20%E4%BB%A5%E4%B8%8B%E5%9B%9B%E8%A1%8C%E6%B7%BB%E5%8A%A0%E9%98%BF%E9%87%8C%E4%BA%91%E7%9A%84%E4%BB%93%E5%BA%93%E5%9C%B0%E5%9D%80%EF%BC%8C%E6%96%B9%E4%BE%BF%E5%9B%BD%E5%86%85%E5%BC%80%E5%8F%91%E8%80%85%E4%B8%8B%E8%BD%BD%E7%9B%B8%E5%85%B3%E6%8F%92%E4%BB%B6%5Cnmaven%20%7B%20url%20'https%3A%2F%2Fmaven.aliyun.com%2Frepository%2Fjcenter'%20%7D%5Cnmaven%20%7B%20url%20'https%3A%2F%2Fmaven.aliyun.com%2Frepository%2Fgoogle'%7D%5Cnmaven%20%7B%20url%20'https%3A%2F%2Fmaven.aliyun.com%2Frepository%2Fgradle-plugin'%7D%5Cnmaven%20%7B%20url%20'https%3A%2F%2Fmaven.aliyun.com%2Frepository%2Fpublic'%7D%5Cngoogle()%5CnmavenCentral()%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">// 以下四行添加阿里云的仓库地址,方便国内开发者下载相关插件
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/google'}
maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven { url 'https://maven.aliyun.com/repository/public'}
google()
mavenCentral()</code></pre>
</div>
<p>因为jcenter仓库已经废弃,所以改成引用国内的仓库位置。<br>
此外,还要把下面两行配置</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="9" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22classpath%20'com.android.tools.build%3Agradle%3A3.1.2'%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">classpath 'com.android.tools.build:gradle:3.1.2'</code></pre>
</div>
<p>改成下面这行配置,表示把Gradle插件版本升级到3.2.0版本:</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%22classpath%20'com.android.tools.build%3Agradle%3A3.2.0'%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">classpath 'com.android.tools.build:gradle:3.2.0'</code></pre>
</div>
<h2>3、调整模块的build.gradle</h2>
<p>打开VideoSlimmer工程的app/build.gradle,找到下面这行配置:</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%22compileSdkVersion%2028%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">compileSdkVersion 28</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="6" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22buildToolsVersion%20%5C%2228.0.3%5C%22%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">buildToolsVersion "28.0.3"</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="5" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22implementation%20'com.android.support%3Aappcompat-v7%3A28.0.0-rc01'%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.android.support:appcompat-v7:28.0.0-rc01'</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="4" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22implementation%20'com.android.support%3Aappcompat-v7%3A28.0.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.android.support:appcompat-v7:28.0.0'</code></pre>
</div>
<p>改完build.gradle,记得单击Sync同步App工程配置。</p>
<p>完成以上三处修改后,重新编译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="3" 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/202512/729938-20251221180736537-903119461.jpg"></span></span></span></span></p>
<p>可见选中视频正在压缩当中。稍等片刻视频压缩完成,界面下方展示结果视频的保存路径以及压缩进度,如下图所示:</p>
<p><img src="https://img2024.cnblogs.com/blog/729938/202512/729938-20251221180820004-609033761.jpg"></p>
<p>发现压缩前的视频大小为85MB,压缩后的视频大小为12MB,仅为原视频的七分之一左右,可见压缩效果还是不错的。压缩之后的结果视频放在公共存储空间的Movies目录,完整路径为“我的手机/Movies/VIDEOSLIMMER_yyyymmdd_hhmiss.mp4”,其中yymmdd为年月日,hhmiss为时分秒。</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><br><br>
来源:https://www.cnblogs.com/aqi00/p/19379656
頁:
[1]