视频捕获(我是如何做的)

作者: Mitch Frazier

我们在 linuxjournal.com 经常收到的问题之一是我们如何制作视频。Shawn 制作了一个 操作指南视频,介绍了一些方法。以下内容描述了我如何捕获视频,以及我用来添加 Linux Journal 标志水印的脚本。

文章中关于视频捕获操作指南的部分非常简单:我使用xvidcap:

$ xvidcap --cap_geometry 640x480

这个--cap_geometry参数设置捕获区域的初始大小,以便我始终获得相同大小的视频。这也是我的水印添加脚本的要求。

xvidcap.jpg

我保持视频简短,如果在捕获过程中犯了错误,我会重新捕获。如果您需要捕获长视频,每次犯错都重新做整个过程可能不可行,因此您需要使用某种视频编辑工具进行最终编辑。有许多视频编辑工具,请查看我们最近关于 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;

Mitch Frazier 是 Emerson Electric Co. 的嵌入式系统程序员。自 2000 年代初期以来,Mitch 一直是 Linux Journal 的贡献者和朋友。

加载 Disqus 评论