在咱们的开发中,常常会用到音视频相关内容,通常咱们都会选择
FFmpeg
,可是其交叉编译对于咱们来讲是一件很麻烦的事情.因此这里方便往后使用,集成了关于FFmpeg
相关库,话很少说,请往下看~~java
经过对FFmpeg
的交叉编译, 而后经过封装构成的一个方便快捷的第三方FFmpeg的音视频处理库FFmpegCommand, 知足大多数基本功能的使用,可是此处只适用于Android端哦!android
内部封装了部分FFmpeg简单的命令行功能,可直接食用~git
implementation 'com.coder.command:ffmpeg:1.0.7'
复制代码
armeabi-v7a
和arm64-v8a
就好了,因此只须要在app的bulid.gradle下加入以下代码:android {
...
defaultConfig {
...
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
moduleName "app"
}
}
}
复制代码
FFmpegCommand.runAsync(String[] cmd, ICallBack callback)
方法,其中第一个参数由FFmpegUtils
工具类提供.final long startTime = System.currentTimeMillis();
String input =Environment.getExternalStorageDirectory().getPath() + File.separator +
"DCIM" + File.separator + "test.mp3";
String output =Environment.getExternalStorageDirectory().getPath() + File.separator +
"DCIM" + File.separator + "output.mp3";
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));
}
});
复制代码
这里只是演示了音频剪切,不少如上述功能请自行查阅FFmpegUtils 若是其中不知足需求,可添加本身的FFmpeg命令.例如:github
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));
}
})
复制代码
这里会用到对FFmpeg
的命令使用, 若是不熟悉的话能够参考FFmpeg入门基础, 包含对FFmpeg参数说明, 以及部分基础功能的实现.app
方法 | 做用 |
---|---|
transformAudio | 音频转码 |
transformVideo | 视频转码 |
cutAudio | 音频剪切 |
cutVideo | 视频剪切 |
concatAudio | 音频拼接 |
concatVideo | 视频拼接 |
extractAudio | 音频抽取 |
extractVideo | 视频抽取 |
mixAudioVideo | 音视频合成 |
screenShot | 截取视频第一帧 |
video2Image | 视频转图片 |
video2Gif | 视频转gif |
addWaterMark | 添加视频水印 |
image2Video | 图片转视频 |
decodeAudio | 音频解码 |
encodeAudio | 音频编码 |
multiVideo | 多画面拼接 |
reverseVideo | 反向播放 |
picInPicVideo | 画中画 |
videoDoubleDown | 视频缩小一倍 |
videoSpeed2 | 倍速播放 |
denoiseVideo | 视频降噪 |
问: 可不能够不使用arm64-v8a?
答: 能够,arm64-v8a只是加快了64位ARMv8(AArch64)的速度, 仅仅使用armeabi-v7a在64位上会稍稍慢一点, 不会有很大影响.ide
问: 如何编译ffmpeg.so系列文件的?
答: 能够参考这篇FFmpeg编译4.1.4并移植到Android文章工具
问: 为何在Android10上使用FFmpegCommand会报错?
答: 检查是不是由于访问了外部文件, 由于Android10变动了申请文件权限处理, 在访问外部文件需特殊处理,若是简单处理的话能够在AndroidManifest
的application
标签下加入post
android:requestLegacyExternalStorage="true"
复制代码
问: Demo中生成的文件在哪里?
答: 在/storage/emulated/0/Android/data/com.coder.ffmpegtest/cache/
目录下gradle