不再用为编译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

相关文章
相关标签/搜索