最近有从事教育行业的朋友发来求助说,买的网络摄像机,在手机上看的视频是连续的,但是从内存卡里导出到电脑上却是一分钟一段的。教育部门要求的是按天的视频备份。这可把他们给愁坏了、累崩了。
对于他们来说,唯一能够想到的就是用「剪映」之类的视频剪辑软件来对视频进行合并,但是原视频一分钟一段,自称合并完一整天的视频得花个一两天的时间。
我想了想,这个用 ffmpeg 这个神器不就可以搞定嘛,直接调用ffmpeg 的 concat 命令即可。
但是对于非计算机使用人群来说,让他们自己用 ffmpeg 可能会有点懵逼,索性答应给他们写个小脚本。
在州的先生这里,有三个编程语言技术栈能够满足这个功能需求:
Python 下的图形界面程序(PyQt5)州的先生写得最多,但是多是自己用、很少打包,因为每次打包 都要碰运气,看天吃饭。
Electron 是州的先生开发「MrDoc客户端」所选择的技术栈,平台兼容性好,开发快速,但是打包体积有点大(得打包一个 V8 引擎进去)。
aardio 使用得最少,基本没有开发过成品软件,但是其小巧且强大的功能一直深得我意,所以一直放在备用工具库中。
从产品的需求和功能来看,只需要用一个窗口界面(甚至不需要图形操作界面),接收使用者输入的原视频目录路径,然后使用进程模块调用本地的 ffmpeg 程序文件执行脚本命令。
所以 Electron 直接否掉了,拖油瓶(v8引擎)太大了。
Python 自用还行,打包后的程序不知道会出现啥错误情况,也给否掉了。
那就 aardio 吧。
看了几个 aardio IDE里面自带的范例和使用手册,直接开干。
导入依赖库:
import console;
import fsys;
import io;
import process;
设置控制台窗口标题:
console.setTitle("ffmpeg视频合并");
获取用户输入的视频目录路径:
var video_path = console.getText("请输入视频目录,然后回车:");
判断用户输入的路径是否存在:
is_path = io.exist(video_path)
while(is_path == null){
video_path = console.getText("路径不正确,请输入视频目录,然后回车:")
is_path = io.exist(video_path)
}
console.log("你输入的是" ,video_path);
console.log("正在读取目录视频信息……");
读取目录并生成视频列表信息文本文件:
// 创建一个文本文件,用于存放视频文件列表
var text_file = io.open(video_path + '/file.txt','a+');
// 获取视频路径下的文件
fsys.enum( video_path, "*.mp4",
function(dirname,filename,fullpath,findData){
if(filename){
//console.log("发现文件:"+filename,"完整路径:"+fullpath);
var text_info = string.format(
"file '%s'
", fullpath);
text_file.write(text_info);
}
}
,false
);
// 将内容写入文件中
text_file.flush();
// 关闭文件
text_file.close();
调用 ffmpeg 执行合并命令:
console.log("正在合并视频……")
// 调用ffmpeg 合并视频
concat_str = string.format(
"-f concat -safe 0 -i %s -c copy %s",
'"' + video_path + '/file.txt' + '"',
'"' + video_path + '/output.mkv' + '"',
)
process('./ffmpeg.exe',concat_str).wait();
// 删除生成的文件信息文本
io.remove(video_path + '/file.txt');
console.log("完成视频合并!")
console.pause();
最后的运行效果如下:
代码写好之后,直接点击 IDE 的「发布」按钮,很快就生成了一个 EXE 文件:
程序体积仅有 1246KB ,将 ffmpeg 的程序文件和打包后的程序放在一起,就可以使用了。将它们打包为 zip 压缩文件发送给使用者,也就完成了交付。
在编写过程中,除了对 aardio 内置库的使用不太熟悉外,代码写起来非常丝滑,推荐大家一试。
网上有学习者经常吐槽其文档很少,其实其 IDE 内已经内置了一份《代码范例》、一份《aardio 库函数文档》和一份《aardio 使用手册》。