前言
在前面的一个文章基于FFmpeg的短视频编辑工具Cut发布1.0版,存在的问题不少,最近对CUT
做了一些改进。
在第一版的会有下面的两个问题:
- 合成视频的画质差
- 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.pngFFmpeg 处理一些overlay,scale的功能时会比较慢,在网上查找的资料,都说需要使用Mediacodec+openGL
才能有效的解决,可我对这两个压根不懂啊!!
于是有了下面的思考:
创建一个单线程的任务队列,把待处理的每一个分镜,put进任务队列,让任务在后台处理。这样就不需要等待上一个分镜操作完成才能进行下一个分镜的处理,在用户体验上有了明显的提升。
处理流程,如下图:
0004.png经过这样处理后:
时间上:当处理下一个分镜,上一个分镜在后台就处理完了,最多等待一个分镜的时间。这样处理之后相当于提升了2/3的时间。
实现上:这种方式只是优化了体验上问题,并没有实际解决ffmpeg处理慢的问题。还是得需要
Mediacodec+openGL
来解决。
不足:
优化了这个问题后,其实项目还存在很多问题。比如:
- 统一画幅
问题的出现是这样的剪辑视频的来源是本地,而这些视频大都帧率、比特率、分辨率都不统一,也有可能横,竖不一,在合成统一的画幅,可能就需要先要逐帧解码成最原始的YUV格式,然后在编码成你想要的编码格式。
2.还是不能添加滤镜,需要用到openGL
。
.....
END
网友评论