视频捕获(我是如何做的)
我们在 linuxjournal.com 经常收到的问题之一是我们如何制作视频。Shawn 制作了一个 操作指南视频,介绍了一些方法。以下内容描述了我如何捕获视频,以及我用来添加 Linux Journal 标志水印的脚本。
文章中关于视频捕获操作指南的部分非常简单:我使用xvidcap:
$ xvidcap --cap_geometry 640x480
这个--cap_geometry参数设置捕获区域的初始大小,以便我始终获得相同大小的视频。这也是我的水印添加脚本的要求。

我保持视频简短,如果在捕获过程中犯了错误,我会重新捕获。如果您需要捕获长视频,每次犯错都重新做整个过程可能不可行,因此您需要使用某种视频编辑工具进行最终编辑。有许多视频编辑工具,请查看我们最近关于 LiVES 的文章:LiVES1, LiVES2, 和 LiVES3。
关于的一些注意事项xvidcap:至少我使用的版本,往往会经常崩溃。不要尝试捕获和审查捕获的视频超过几次,而不重新启动xvidcap。如果您有一个 难以处理的 音频设置,就像我似乎有的那样,在您深入之前运行一个快速的“test test test”捕获,以确保一切正常工作并且您的声音级别设置正确。默认情况下xvidcap将捕获的视频保存到文件test-0000.mpeg,如果您想在捕获新视频之前保存它,请务必重命名文件。
一旦我捕获了一个视频,我就通过运行我的add-logo.sh脚本
$ sh add-logo.sh --left video.mpeg
该脚本接受--left或--right并使用它来确定要使用哪个图像文件(我有 2 个文件,一个徽标在左侧,另一个在右侧)。如果--left被指定,它会查找文件logo-left-640x480.jpg,如果--right,那么logo-right-640x480.jpg。叠加文件名的几何部分(例如 640x480)是基于捕获视频的大小的,因此,如果您要以 1024x768 的分辨率捕获,您将需要一个名为logo-left-1024x768.jpg。要创建叠加图像,您只需要一个尺寸合适的灰色背景图像,特别是颜色 #808080。
当脚本运行时,它会将叠加层添加到输入视频,并创建两个具有相同基本名称的输出视频,一个带有.mp4扩展名,另一个带有.ogv扩展名。该脚本还接受选项--remove-audio,它会从输出视频中删除音轨。
您可能需要在脚本中更改的一件事是ffmpeg执行叠加的命令
ffmpeg -sameq $opts -i $mpeg -vhook "/usr/lib64/vhook/watermark.so -f $logo" $mp4
水印库的位置很可能在您的系统上有所不同(我使用 openSUSE)。如果您有一个非常新的版本ffmpeg您甚至可能需要更改其完成方式,因为-vhook功能可能已被删除,因为它已被弃用并被不同的机制取代。
完整的源代码在add-logo.sh脚本如下所示
#!/bin/bash
function usage()
{
if [[ "$*" ]]; then
echo "$*" >&2
fi
cat >&2 <<EOF
Usage: $(basename $0) OPTIONS FILE.mpeg
--left Add logo on left side
--right Add logo on right side
--remove-audio Remove audio stream from converted videos
EOF
exit 1
}
function error()
{
echo "$*" >&2
exit 1
}
#######################################################################
left=0
right=0
remove_audio=0
mpeg=
while [[ "$1" ]]
do
case "$1" in
--left)
left=1
right=0
shift
;;
--right)
left=0
right=1
shift
;;
--remove-audio)
remove_audio=1
shift
;;
-*)
usage "Unrecognized option $1"
;;
*)
if [[ "$mpeg" ]]; then usage "Unexpected argument: $1"; fi
mpeg=$1
shift
mext="${mpeg#*.}"
if [[ "$mext" != 'mpeg' ]]; then error "Invalid mpeg file: $mpeg"; fi
;;
esac
done
if [[ ! "$mpeg" ]]; then usage; fi
geometry=$(file $mpeg | grep -P -o '\d+ x \d+' | tr -d ' ')
if [[ $left -eq 1 ]]; then
logo=logo-left-$geometry.jpg
elif [[ $right -eq 1 ]]; then
logo=logo-right-$geometry.jpg
else
error "Specify one of --left or --right"
fi
if [[ ! -f $logo ]]; then error "Logo file not found: $logo"; fi
if [[ $remove_audio -ne 0 ]]; then opts='-an'; fi
mp4=$(basename $mpeg .mpeg).mp4
ogv=$(basename $mpeg .mpeg).ogv
rm -f $mp4 $ogv
ffmpeg -sameq $opts -i $mpeg -vhook "/usr/lib64/vhook/watermark.so -f $logo" $mp4
ffmpeg -sameq $opts -i $mp4 $ogv
# vim: tabstop=4: shiftwidth=4: noexpandtab:
# kate: tab-width 4; indent-width 4; replace-tabs false;