亲宝软件园·资讯

展开

Android视频加水印FFmpeg

我是绿色大米呀 人气:0

视频处理是Android开发中常见的需求。像是视频加水印,视频格式转换,视频截图等等……

FFmpeg是处理视频时常用到的工具,一般情况可以用FFmpeg源码自己编译,也可以使用网上别人编译好的包,这里我使用的是后一种方案。

我使用的是在GitHub找的。当然其他FFmpeg编译出来的包都是可以的。

用FFmepg处理视频或者音频思路是:

一、首先,引入依赖 compile 'com.writingminds:FFmpegAndroid:0.3.2'

二、然后使用FFmpeg前需要进行加载

FFmpeg ffmpeg = FFmpeg.getInstance(context);
try {
  ffmpeg.loadBinary(new LoadBinaryResponseHandler() {

    @Override
    public void onStart() {}

    @Override
    public void onFailure() {}

    @Override
    public void onSuccess() {}

    @Override
    public void onFinish() {}
  });
} catch (FFmpegNotSupportedException e) {
  // Handle if FFmpeg is not supported by device
}

三、接着就可以执行命令了,例如下面的cmd

FFmpeg ffmpeg = FFmpeg.getInstance(context);
try {
  // to execute "ffmpeg -version" command you just need to pass "-version"
  ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {

    @Override
    public void onStart() {}

    @Override
    public void onProgress(String message) {}

    @Override
    public void onFailure(String message) {}

    @Override
    public void onSuccess(String message) {}

    @Override
    public void onFinish() {}
  });
} catch (FFmpegCommandAlreadyRunningException e) {
  // Handle if FFmpeg is already running
}

这里以给视频加水印为例:

val convertedFile = getConvertedFile(inFile!!)//输出文件路径
val cmd = arrayOf(
    "-y",
    "-i",
    inFile!!.path,
    "-i",
    watermarkFile!!.absolutePath,
    "-filter_complex",
    "[0:v][1:v]overlay=main_w-overlay_w-10:10",
    "-vcodec",
    "libx264",
    "-codec:a",
    "copy",
    convertedFile.path
)
try {
    FFmpeg.getInstance(context).execute(cmd, object : FFmpegExecuteResponseHandler {
        override fun onStart() {}
        override fun onProgress(message: String) {
            Log.e("TAg", "水印:$message")
        }
        override fun onSuccess(message: String) {
            Log.e("TAg", "成功:$message")
            inFile?.delete();
            watermarkFile?.delete();
            callback?.onSuccess(convertedFile)
        }

        override fun onFailure(message: String) {
            callback?.onFailure(IOException(message))
        }

        override fun onFinish() {
            Log.e("TAg", "结束")
        }
    })
} catch (e: Exception) {
    callback?.onFailure(e)
}

这里对用到的命令做个简单的解释:

左上角:overlay=10:10
右上角:overlay=main_w-overlay_w-10:10
左下角:overlay=10:main_h-overlay_h-10
右下角:overlay=main_w-overlay_w-10:main_h-overlay_h-10

注意:这里的输入输出文件都是本地路径

FFmpeg处理完毕时候就会回调onSuccess,我们在这里返回输出文件即可。

像是视频合并,提取音频,视频压缩等等功能思路都是大致如此。区别就是使用cmd命令有所区别,实现具体功能的时候再详细了解一下具体的命令即可。

总结

加载全部内容

相关教程
猜你喜欢
用户评论