来到新公司一直在做关于视频处理这块的工作,一直接触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为你水印图片的路径
————————-
:人生追求的不仅仅是一个结果,更是一种希望;过程比结果更重要。