Android-使用ffmpeg视频处理

来到新公司一直在做关于视频处理这块的工作,一直接触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为你水印图片的路径

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值