最近遇到一个场景就是想把图片横向拼接起来,也就是多张图片合并成一张编程宽图片,又不行安装一个庞大的图像处理软件,最后使用了imagemagick,这是一款极其强大的图片编辑程序,主要用于命令行操作图片,效率非常高,直接:

brew install imagemagick

就可以安装

拼接图片

首先使用 cd 命令进入图片所在的目录,假如你有三张图片,分别为 img1.png, img2.png 以及 img3.png, 要输出名为 output.png 的图片,横着拼接,使用以下命令:

convert +append img1.png img2.png img3.png output.png

如果要竖着拼接,把上面的命令中 + 改为 - 即可。

视频处理

视频处理就不用说了,ffmpeg顺手的很,假设我们要做视频裁剪:

fmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vcodec copy -acodec copy output.mp4
* -ss 指定从什么时间开始
* -t 指定需要截取多长时间
* -i 指定输入文件

这个命令就是从00秒开始裁剪到00+30=30秒结束,总共30秒的视频。这个命令执行很快,因为只是原始数据的拷贝,中间没有什么编码和解码的过程。执行这个命令后你能得到output.mp4这个输出文件。你可以用视频播放软件播放这个视频看看。

可能有些视频裁剪后的效果,如期望一致,00秒开始,30秒结束,总共30秒的视频,但是有些视频裁剪后你会发现可能开始和结束都不是很准确,有可能是从00秒开始,33秒结束。这是为什么呢?

因为这些视频里30秒处地方刚好不是关键帧,而ffmpeg会在你输入的时间点附近圆整到最接近的关键帧处,然后做接下来的事情。如果你不懂什么是关键帧,没关系,这也不影响你使用这个命令。

如果你的项目要求能够接受几秒的误差,那么这个命令完全就可以满足你的需要。

如果你的项目里要求很严格,一定要到确定的时间。那么就要用另外一种方式。

ffmpeg -i INPUT -sameq -intra OUTPUT
-i 输入,后面是空格,紧跟着就是输入视频文件;
INPUT 输入文件;
-sameq 表示保持同样的视频质量;
-intra, 帧内编码;
OUTPUT 输出文件名。

如:

ffmpeg -i ./MyVideo.mpg -sameq -intra ./temp.mpg

这个命令的结果文件就是./temp.mpg.这个文件的视频和./MyVideo.mpg是一样的,但是你会发现这个文件会比./MyVideo.mpg大很多倍,原因就是转换前一般采用的帧间编码,转换后变成了帧内编码。这里我们说是一般,原因是有些视频文件本身就采用了帧内编码。

经过这样的处理后,我们就可以精确的剪切视频了。

上面的命令在新版本中已经废弃,可以参考下面的命令:

ffmpeg -i output.mp4 -strict -2  -qscale 0 -intra keyoutput.mp4

合并视频

截取从头开始的30s:

ffmpeg -ss 00:00:00 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split.mp4

截取从30s开始的30s:

ffmpeg -ss 00:00:30 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split1.mp4

进行视频的合并:

ffmpeg -f concat -i list.txt -c copy concat.mp4

在list.txt文件中,对要合并的视频片段进行了描述,内容如下:

file ./split.mp4
file ./split1.mp4

使用这一类工具操作,对程序员反而更友好些。

好词佳句:

“无论人生上到哪一层台阶,阶下有人在仰望你,阶上亦有人在俯视你。你抬头自卑,低头自得,唯有平视,才能看见真正的自己。”如果我们有能力走到人生边上,再看生活这场相逢,会看到它一边给我们巴掌,一边又会递上止疼药。无论如何,我相信,走过平湖烟雨,岁月山河,经历的劫数,尝遍的百味,会让我们更加生动,而干净。

扫码手机观看或分享: