在咱們的開發中,常常會用到音視頻相關內容,通常咱們都會選擇
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