Shell 处理视频与图像文件,Linux和Unix都拥有很多能够处理图像和视频文件的应用程序和工具。大多数的Linux发行版中都包含了ImageMagick套件,其中的convert程序可用于处理图像。像kdenlive和openshot这种全功能的视频编辑程序都是构建在命令行程序ffmpeg和mencoder之上的。
convert
的命令选项有数百个。我们只涉及其提取部分图像的功能。ffmpeg
和mencoder
的命令选项和功能也不少,足够写上一本书了。我们也只讲几个简单的用法。本节中要讲到几个与图像和视频处理相关的知识。
预备知识
多数Linux发行版中都自带了ImageMagick。如果你的系统中没安装或是其版本太旧,可以到ImageMagick的网站:www.imagemagick.org,按照上面给出的步骤下载并安装最新版本。
和ImageMagick一样,很多Linux发行版中也已经包含了ffmpeg
和mencoder
。这两个软件的最新版本可以分别在http://www.ffmpeg.org和http://www.mplayerhq.hu上找到。
构建和安装视频工具可能需要载入编码器以及其他的辅助文件,其中还牵扯到扯不清的版本依赖问题。如果你打算使用Linux系统作为音频/视频编辑平台,最简单的办法是安装专门为此设计的发行版,例如Ubuntu Studio。
接着是一些常见的音频-视频转换的实现方法。
从视频文件(mp4)中提取音频
MV看起来的确赏心悦目,不过音乐的重点还是在于“听”。提取视频中的音频并不难。
实战演练
下面的命令能够将mp4视频文件(FILE.mp4)中的音频部分提取成mp3文件(OUTPUTFILE.mp3):
ffmpeg -i FILE.mp4 -acodec libmp3lame OUTPUTFILE.mp3
- 使用一组静态图像制作视频
很多数码相机都支持间隔拍照。你可以利用这一特性拍摄延时摄影(time-lapse photography)或是创建定格视频(stop-action video)。在www.cwflynt.com上就有一些这样的作品。你可以通过OpenShot
视频编辑软件或是在命令行中使用mencoder
将一组静态图像转换成视频。
(1) 实战演练
这个脚本可以接受一组图片,然后从中生成一段MPEG视频:
$ cat stills2mpg.sh
echo $* | tr ' ' '\n' >files.txt
mencoder mf://@files.txt -mf fps=24 -ovc lavc \
-lavcopts vcodec=msmpeg4v2 -noskip -o movie.mpg
将上面的命令复制/粘贴到一个文件中,将文件命名为stills2mpg.sh,设置可执行权限,然后按照下列形式调用:
./stills2mpg.sh file1.jpg file2.jpg file3.jpg ...
或者
./stills2mpg.sh *.jpg
(2) 工作原理
mencoder
命令要求输入文件采用固定的格式,一行只能有一个图像文件名。脚本的第一行将所有的命令行参数传给tr
命令,后者负责将作为分隔符的空格转换为换行符。这样就将单行文件列表变成了多行文件列表(一行一个)。
你可以通过设置FPS(frames-per-second,帧速)来改变视频的播放速度。例如,将FPS修改成1
会产生幻灯片的效果,每秒钟播放一帧。
- 使用静态照片生成平移视频
如果你打算制作自己的视频,可能会想对视频中的某些风景采用平移镜头。大多数相机都可以录制视频,但如果你只有一张静态照片,依然可以制作平移视频。
(1) 实战演练
相机拍摄的照片通常要比视频的尺寸更大(分辨率更高)。你可以使用convert
提取大尺寸照片中的某些部分,然后使用mencoder
将其拼合在一起,形成平移镜头:
$> makePan.sh
# 调用方法:
# sh makePan.sh OriginalImage.jpg prefix width height xoffset yoffset
# 清除旧数据
rm -f tmpFiles
# 创建200张静态图片,每次移动xoffset和yoffset个像素
for o in `seq 1 200`
do
x=$[ $o+$5 ]
convert -extract $3x$4+$x+$6 $1 $2_$x.jpg
echo $2_$x.jpg >> tmpFiles
done
#将图片拼合成mpg视频文件
mencoder mf://@tmpFiles -mf fps=30 -ovc lavc -lavcopts \
vcodec=msmpeg4v2 -noskip -o $2.mpg
(2) 工作原理
这个脚本比我们之前见过的脚本都要复杂。它使用了7个命令行参数,分别指定了输入图片、输出文件前缀、临时图片的宽度和高度以及原始图片的起始偏移。
在for
循环中,脚本创建了一组图片并将其文件名保存在名为tmpFiles的文件中。最后,使用mencoder
将提取出的图片合并成能够导入视频编辑器(如kdenlive或OpenShot)的MPEG视频。