美文网首页FFmpegAndroid进阶之旅程序员技术栈
基于FFmpeg的短视频编辑工具Cut App(2)

基于FFmpeg的短视频编辑工具Cut App(2)

作者: maimingliang | 来源:发表于2017-08-09 00:34 被阅读752次

前言

在前面的一个文章基于FFmpeg的短视频编辑工具Cut发布1.0版,存在的问题不少,最近对CUT做了一些改进。

在第一版的会有下面的两个问题:

  1. 合成视频的画质差
  2. FFmpeg 处理一些overlay,scale的功能时会比较慢。

发布了新版本,对这个两个问题进行了一些尝试,有兴趣的可以下载来玩玩。下载地址Cut

合成视频的画质差

这个问题,容易解决,增加码率和帧率基本上能解决问题。


private String getChangeVideoSizeCmd(String videoPath,String outPath) {

        if (TextUtils.isEmpty(videoPath) || TextUtils.isEmpty(outPath)) {
            return null;
        }

        StringBuilder builder = new StringBuilder();

        builder.append("ffmpeg -y -i ");
        builder.append(videoPath);
        builder.append(" -vf scale=");
        builder.append("540:960");
        builder.append(" -b:v 4000K -b:a 96K -r 30 "); //增加视频输出的码率,帧率
        builder.append(outPath);

        LogUtil.e(TAG, "----- 改变视频size 命令 = " + builder.toString());
        return builder.toString();
    }

FFmpeg 处理一些overlay,scale的功能时会比较慢。

CUT可以合成三段分镜,每一段的分镜来源可以是录制,也可以是剪辑本地视频的。

之前的处理是:每操作一段分镜 调用一次FFmpeg,等待FFmpeg处理完成,才能操作下一个分镜或者进行下一步(每操作一个分镜大概耗时3-5秒)特别慢。

处理过程如图:

00056.png

FFmpeg 处理一些overlay,scale的功能时会比较慢,在网上查找的资料,都说需要使用Mediacodec+openGL才能有效的解决,可我对这两个压根不懂啊!!

00578.png

于是有了下面的思考:

创建一个单线程的任务队列,把待处理的每一个分镜,put进任务队列,让任务在后台处理。这样就不需要等待上一个分镜操作完成才能进行下一个分镜的处理,在用户体验上有了明显的提升。

处理流程,如下图:

0004.png

经过这样处理后:

时间上:当处理下一个分镜,上一个分镜在后台就处理完了,最多等待一个分镜的时间。这样处理之后相当于提升了2/3的时间。

实现上:这种方式只是优化了体验上问题,并没有实际解决ffmpeg处理慢的问题。还是得需要Mediacodec+openGL 来解决。

不足:

优化了这个问题后,其实项目还存在很多问题。比如:

  1. 统一画幅

问题的出现是这样的剪辑视频的来源是本地,而这些视频大都帧率、比特率、分辨率都不统一,也有可能横,竖不一,在合成统一的画幅,可能就需要先要逐帧解码成最原始的YUV格式,然后在编码成你想要的编码格式。

2.还是不能添加滤镜,需要用到openGL
.....

END

相关文章

网友评论

  • xXPzXj:是的,ff不适合做,你需要类似gpuimage这样的类库,安卓不知道有没有
    maimingliang:恩恩,android 也有这样的库 https://github.com/CyberAgent/android-gpuimage

本文标题:基于FFmpeg的短视频编辑工具Cut App(2)

本文链接:https://www.haomeiwen.com/subject/tfvalxtx.html