在我们的开发中,经常会用到音视频相关内容,一般我们都会选择FFmpeg,但是其交叉编译对于我们来说是一件很麻烦的事情.所以这里方便日后使用就编写了这个FFmpegCommand
,FFmpegCommand
是由FFmpeg
核心库,并且集成了lame
、libx264
和fdk-aac
主流音视频处理程序构成的Android程序
注意:当前库只适用于Android
- 支持所有FFmpeg命令
- 支持视频格式转换 mp4->flv
- 支持音频编解码 mp3->pcm pcm->mp3 pcm->aac
- 支持视频编解码 mp4->yuv yuv->h264
- 支持音视频的剪切、拼接
- 支持视频转图片 mp4->png mp4->gif
- 支持音频声音大小控制以及混音(比如朗读的声音加上背景音乐)
- 支持部分滤镜 音频淡入、淡出效果、视频亮度和对比度以及添加水印
- 支持获取媒体文件信息
执行FFmpeg | 获取媒体信息 |
---|---|
![]() |
![]() |
下面两种引入只选择一种即可,并根据最新版本替换下面的latestVersion
,当前最新版本
// 全部编解码-体积较大
implementation 'com.coder.command:ffmpeg:${latestVersion}'
// 部分常用编解码-体积较小,比上面引入减少大约6M
implementation 'com.coder.command:ffmpeg-mini:${latestVersion}'
如果没有特别的编解码需求,强烈推荐建议使用ffmpeg-mini
下面只展示部分使用,其他可以参考 【WIKI】
方法 | 功能 |
---|---|
FFmpegCommand->setDebug(boolean debug) | 是否Dubug模式,可打印日志,默认true |
FFmpegCommand->runSync(final String[] cmd) | 同步执行ffmpeg命令,外部需添加延时线程 |
FFmpegCommand->runSync(final String[] cmd, OnFFmpegCommandListener listener) | 同步执行ffmpeg命令,并回调 完成,取消,进度 |
FFmpegCommand->runAsync(final String[] cmd, IFFmpegCallBack callBack) | 异步执行,外部无需添加延时线程,并回调 开始,完成,取消,进度 |
FFmpegCommand->getInfoSync(String path,@Attribute int type) | 获取媒体信息,type值必须为@Attribute 中注解参数 |
FFmpegCommand->FFmpegCommand.exit() | 退出当前ffmpeg执行 |
以runAsync
调用FFmpeg
为异步方式,不需要单独开启子线程。强烈建议使用此方法进行音视频处理!!!
直接调用FFmpegCommand.runAsync(String[] cmd, IFFmpegCallBack callback)
方法,其中第一个参数由FFmpegUtils
工具类提供,也可以自己添加
final long startTime = System.currentTimeMillis();
FFmpegCommand.runAsync(FFmpegUtils.cutAudio(input, "00:00:30", "00:00:40", output),
new CommonCallBack() {
@Override
public void onComplete() {
Log.d("FFmpegTest", "run: 耗时:" + (System.currentTimeMillis() - startTime));
@Override
public void onCancel() {
Log.d("FFmpegTest", "Cancel");
}
@Override
public void onProgress(int progress) {
Log.d("FFmpegTest",progress+"");
}
}
});
这里只是演示了音频剪切,很多如上述功能请自行查阅FFmpegUtils 如果其中不满足需求,可添加自己的FFmpeg命令.例如:
String cmd = "ffmpeg -y -i %s -vn -acodec copy -ss %s -t %s %s";
String result = String.format(cmd, input, "00:00:30", "00:00:40", output);
FFmpegCommand.runAsync(result.split(" "), new CommonCallBack() {
@Override
public void onComplete() {
Log.d("FFmpegTest", "run: 耗时:" + (System.currentTimeMillis() - startTime));
}
@Override
public void onCancel() {
Log.d("FFmpegTest", "Cancel");
}
@Override
public void onProgress(int progress) {
Log.d("FFmpegTest",progress+"");
}
})
执行下面方法后将会回调 CommonCallBack->onCancel()
或 OnFFmpegCommandListener->onCancel()
方法
FFmpegCommand.exit();
- Java 使用请参考 FFmpegCommandActivity
- Kotlin使用请参考 KFFmpegCommandActivity
兼容Android minSdkVersion >=14(version>=1.1.4,此前的版本只兼容minSdkVersion >=21)
因为引入了LAME
,我们其实可以使用它自定义音频编码器,将其编译成so文件提供使用,具体参考【WIKI-自定义MP3编码器】
扫码下载|点击下载 | 交流 | 微信赞赏 |
---|---|---|
![]() |
![]() |
![]() |
撸码不易,如果觉得对您有所帮助,给个Start支持一下吧!
Copyright 2019 AnJoiner
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.