Android-使用ffmpeg视频处理

来源:互联网 发布:苏德瓜分波兰 知乎 编辑:程序博客网 时间:2024/04/28 07:55

来到新公司一直在做关于视频处理这块的工作,一直接触ffmpeg这个视频处理的库,这里简单说一下我自己踩过的坑。

我这里使用的是so库是:

 System.loadLibrary("utility");

1a. 使用方式:

StringBuilder sb = new StringBuilder();        sb.append("ffmpeg");        sb.append(" -i");        sb.append(" " + vediooutput);        sb.append(" -i");        sb.append(" " + imagePath);        sb.append(" -filter_complex");        sb.append(" overlay=20:35");        sb1.append(" -vcodec libx264 -profile:v baseline -preset ultrafast -b:v 3000k -g 25");        sb.append(" -f mp4");        sb.append(" " + mergeVideo);        int i = UtilityAdapter.FFmpegRun("", sb.toString());
一般用返回值i,来进行判断是否执行成功,0 为成功。 1 为失败。 为什么需要这个返回值呢,因为这个so库是不会造成异常信息及崩溃log,且我们需要一个返回值来进行之后的业务处理

2a. 分段视频合成

在项目中需要一个分段视频合成为一个整体视频的需求。录制使用一个第三方库这里就不介绍了。录制后默认给我返回的文件后缀为.mp4格式的文件,但ffmpeg在合成视频文件时只能支持.ts后缀的文件。我使用直接更改保存文件的后缀名的方式,直接将返回文件的后缀更改为.ts,这时进行合成的时候只能将视频集合中的第一个视频进行合成这时我尝试使用ffmpeng进行编码转换视频格式private String changeOutPath(String path) {        StringBuilder sb = new StringBuilder("ffmpeg");        sb.append(" -i");        sb.append(" " + path);        sb.append(" -codec");        sb.append(" copy");        sb.append(" -bsf");        sb.append(" h264_mp4toannexb");        sb.append(" " + path.replaceAll("mp4", "ts"));        int i = UtilityAdapter.FFmpegRun("", sb.toString());        if (i == 0) {            return path.replaceAll("mp4", "ts");        } else {            return null;        }使用此种方法后这个文件才真正的被转换成了.ts后缀的文件,且能进行视频合成

3a.视频合成

 StringBuilder sb = new StringBuilder("ffmpeg");        sb.append(" -i");        String concat = "\"concat:";        for (String path : paths) {            concat += changeOutPath(path);            Log.e(TAG, "syntVideo: " + changeOutPath(path));            concat += "|";        }        concat = concat.substring(0, concat.length() - 1);        sb.append(" " + concat + "\"");        sb.append(" -c");        sb.append(" copy");        sb.append(" -bsf:a");        sb.append(" aac_adtstoasc");        sb.append(" -movflags");        sb.append(" +faststart");        MyApplication.VIDEO_URL = "/finish.mp4";//修改为动态路径        vediooutput = MyApplication.VIDEO_PATH + MyApplication.VIDEO_URL;        sb.append(" " + vediooutput);        int a = UtilityAdapter.FFmpegRun("", sb.toString());此为视频合成代码

4a.添加水印

关于添加水印:使用ffmpeg添加水印的时候只能添加一个本地的file进去,至于这个file是怎么产生的就需要按照自己的业务需求进行处理了。这里就不再介绍了 StringBuilder sb1 = new StringBuilder();        sb1.append("ffmpeg");        sb1.append(" -i");        sb1.append(" " + vediooutput);        sb1.append(" -i");        sb1.append(" " + imagePath);        sb1.append(" -filter_complex");        sb1.append(" overlay=20:35");        sb1.append(" -vcodec libx264 -profile:v baseline -preset ultrafast -b:v 3000k -g 25");        sb1.append(" -f mp4");        sb1.append(" " + mergeVideo);        int i = UtilityAdapter.FFmpegRun("", sb1.toString());这里iamgePath为你水印图片的路径

————————-
:人生追求的不仅仅是一个结果,更是一种希望;过程比结果更重要。