再也不用为编译FFmpeg苦恼了

在我们的开发中,经常会用到音视频相关内容,一般我们都会选择FFmpeg,但是其交叉编译对于我们来说是一件很麻烦的事情.所以这里方便日后使用,集成了关于FFmpeg相关库,话不多说,请往下看~~

前景提要

通过对FFmpeg的交叉编译, 然后通过封装构成的一个方便快捷的第三方FFmpeg的音视频处理库FFmpegCommand, 满足大多数基本功能的使用,但是此处只适用于Android端哦!

功能

内部封装了部分FFmpeg简单的命令行功能,可直接食用~

  • 使用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命令.例如:

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参数说明, 以及部分基础功能的实现.

方法作用
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位上会稍稍慢一点, 不会有很大影响.

  2. 问: 如何编译ffmpeg.so系列文件的?
    答: 可以参考这篇FFmpeg编译4.1.4并移植到Android文章

  3. 问: 为什么在Android10上使用FFmpegCommand会报错?
    答: 检查是否是因为访问了外部文件, 因为Android10变更了申请文件权限处理, 在访问外部文件需特殊处理,如果简单处理的话可以在AndroidManifestapplication标签下加入

    android:requestLegacyExternalStorage="true"
    
  4. 问: Demo中生成的文件在哪里?
    答: 在/storage/emulated/0/Android/data/com.coder.ffmpegtest/cache/目录下

https://juejin.im/post/5dff33656fb9a016023e8c29

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论