起因当然就是, UP 主以前还没当过 UP 主呢, 这会儿想剪个 MAD 啦.
经过是, 写了个简单脚本用 avconv + mencoder 剪出没有任何特效, 只是纯粹拼接原始片段的视频.
教训是 Linux 从来不缺乏图形界面软件, 只是... 缺乏比对应的命令行软件更优秀的图形界面软件.
这次实践, 基本原理是用 avconv (不要吐槽名字啊, 其实这软件很健全的) 对源视频进行分割, 然后用 mencoder 串联起来, 再配上音乐.
Ubuntu 上安装这些东西以及对应的转码器
apt-get install libav-tools libavcodec-extra-53 mencoder
(Windows 上也有 avconv 和 mencoder 和, 理论上也能这么搞)
直接运用上述工具, 跟一般 Linux 命令行软件一样的问题就是, 参数略复杂, 比如用 mencoder 合并视频
mencoder -ovc copy -o OUTPUT_FILE.mp4 INPUT_FILE INPUT_FILE INPUT_FILE ...
而用 avconv 从一个视频源文件中提取一段内容, 转压成 640x360 分辨率的 MP4 文件, 去掉声音, 要这么干
avconv -ss 00:00:10 -i INPUT_VIDEO_FILE -t 00:00:30 -vf "scale=640:360" -f mp4 -vcodec libx264 -an OUTPUT.mp4
上面 -ss
参数后面是开始时间, -t
参数后是剪出的片段长度. (因为视频流压缩的问题, 这两个时间都可能不精确)
对于制 MAD 来说一次要剪出上百个片段, 这么一个个手打再多的爱最后也是死路一条. 所以得换个方式, 选取一些相对容易的工具; 当然如果没有, 就造一个.
这个轮子构想的出发点是尽量简化对视频剪裁参数的编写. 因为制作 MAD 往往是从多个视频中混合剪出片段, 而且顺序不确定, 所以填写文件名还是太麻烦, 可以这么考虑
将所有源视频放在一个目录下, 文件名前面编号 (如果是同一部动画, 那么就是集数了)
由一个文件给出剪取顺序, 信息包括视频顺序编号, 场景开始时间, 场景长度; 为了让这个文件更容易维护, 也允许文件中有注释
剩下的参数只需要指定输入的音频文件路径和输出的最终文件路径即可
中间弄出来的片段都放临时文件目录好了
基于以上指导思想, 实作如下的 Python 函数