不再用爲編譯FFmpeg苦惱了

在咱們的開發中,常常會用到音視頻相關內容,通常咱們都會選擇FFmpeg,可是其交叉編譯對於咱們來講是一件很麻煩的事情.因此這裏方便往後使用,集成了關於FFmpeg相關庫,話很少說,請往下看~~java

前景提要

經過對FFmpeg的交叉編譯, 而後經過封裝構成的一個方便快捷的第三方FFmpeg的音視頻處理庫FFmpegCommand, 知足大多數基本功能的使用,可是此處只適用於Android端哦!android

功能

內部封裝了部分FFmpeg簡單的命令行功能,可直接食用~git

  • 使用ffmpeg命令行進行音/視頻轉碼
  • 使用ffmpeg命令行進行音/視頻剪切
  • 使用ffmpeg命令行進行音/視頻拼接
  • 使用ffmpeg命令行進行抽取音/視頻
  • 使用ffmpeg命令行進行音視頻合成
  • 使用ffmpeg命令行進行視頻截圖
  • 使用ffmpeg命令行進行視頻轉系列圖片
  • 使用ffmpeg命令行給視頻添加水印
  • 使用ffmpeg命令行進行視頻轉成Gif動圖
  • 使用ffmpeg命令行進行圖片合成視頻
  • 使用ffmpeg命令行進行音頻編碼
  • 使用ffmpeg命令行進行多畫面拼接視頻
  • 使用ffmpeg命令行進行視頻反序倒播
  • 使用ffmpeg命令行進行視頻降噪
  • 使用ffmpeg命令行進行視頻抽幀轉成圖片
  • 使用ffmpeg命令行進行視頻疊加成畫中畫
  • 使用ffmpeg命令行進行音頻編/解碼
  • 使用ffmpeg命令行進行倍速播放

FFmpeg-Command

--------------Demo APK 下載地址---------------

引入

implementation 'com.coder.command:ffmpeg:1.0.7'
複製代碼

使用

  1. 通常咱們使用APP_ABI時只須要armeabi-v7aarm64-v8a就好了,因此只須要在app的bulid.gradle下加入以下代碼:
android {
    ...
    defaultConfig {
        ...
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a'
            moduleName "app"
        }
    }
}
複製代碼
  1. 直接調用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 視頻降噪

常見問題

  1. 問: 可不能夠不使用arm64-v8a?
    答: 能夠,arm64-v8a只是加快了64位ARMv8(AArch64)的速度, 僅僅使用armeabi-v7a在64位上會稍稍慢一點, 不會有很大影響.ide

  2. 問: 如何編譯ffmpeg.so系列文件的?
    答: 能夠參考這篇FFmpeg編譯4.1.4並移植到Android文章工具

  3. 問: 爲何在Android10上使用FFmpegCommand會報錯?
    答: 檢查是不是由於訪問了外部文件, 由於Android10變動了申請文件權限處理, 在訪問外部文件需特殊處理,若是簡單處理的話能夠在AndroidManifestapplication標籤下加入post

    android:requestLegacyExternalStorage="true"
    複製代碼
  4. 問: Demo中生成的文件在哪裏?
    答: 在/storage/emulated/0/Android/data/com.coder.ffmpegtest/cache/目錄下gradle

相關文章
相關標籤/搜索