V4L capture script

From LinuxTVWiki
Jump to navigation Jump to search

Introduction

An updated version of this script may be available at fernmelding.de.

The capture script

This script lets you encode to raw video, mpeg4, or H.264 according to your needs.


#!/bin/sh

# Name:    capture
PROG_VERSION="0.9.8"
# Datum:   15.03.2006

# Analoge Video-Aufzeichnung von Video4Linux-TV-Karte

# Benoetigt: mencoder
# Empfohlen: GNU time

# Quelle: http://www.fernmeldung.de/capture/

echo "---------------------------------------------------------------"
echo "capture $PROG_VERSION (http://www.fernmeldung.de/capture)"
echo "Aufzeichnung von analoger Video4Linux-TV-Karte"
echo "---------------------------------------------------------------"
echo "Winke fuer eine erfolgreiche Aufzeichnung:"
echo "- ntp-Daemonen u.ae. Zeitverstell-Programme beenden, da sonst"
echo "  Sync-Probleme auftreten koennten"
echo "- Audio-Eingang (igain) auf 70 einstellen"
echo "- Ggf. Audio-Pegel der Quelle (z.B. DVB-Empfaenger) einstellen"
echo "---------------------------------------------------------------"

DVDx=720
DVDy=576
DVDxy=$DVDx"x"$DVDy
# 5000 + 192 = 5192kbit/s = 38,1 MB/Min.

HuffYUVx=768
HuffYUVy=576
HuffYUVxy=$HuffYUVx"x"$HuffYUVy
# 768x576 + MP2 = 650 MB/Min.

MPEG4x=576
MPEG4y=432
MPEG4xy=$MPEG4x"x"$MPEG4y
MPEG4bitrate=1200
# 1200+128=1328kbit/s=9,8 MB/Min.
# 1500+128=1628kbit/s=12,0 MB/Min.
# 1800+128=1928kbit/s=14,2 MB/Min.

x264x=384
x264y=288
x264xy=$x264x"x"$x264y

# Temp-Datei fuer time-Ausgabe:
# $$ = PID
TEMP_DATEI="/tmp/capture_time.$$.tmp"

echo -n "Name der Aufzeichnung [aufzeichnung]: "
read NAME

# NAME leer (zero) ?
if [ -z $NAME ]; then
	NAME="aufzeichnung"
fi

# Bei Audio-Aufzeichnungsproblemen kann evtl. ein angehaengtes :forceaudio helfen
BEFEHL="mencoder tv:// -tv driver=v4l:norm=pal:input=1:fps=25:audiorate=48000"

echo -n "Format (d=DVD-"$DVDxy", h=HuffYUV-"$HuffYUVxy", x=x264-"$x264xy") [MPEG4-"$MPEG4xy"]: "
read FORMAT

case $FORMAT in 
	d)	echo "Format: DVD / AC3 / "$DVDxy" (etwa 40 MB/Min.)"
		AUFLOESUNG=$DVDxy
		CODECS="DVD_AC3"
		BEFEHL=$BEFEHL":width="$DVDx":height="$DVDy" -oac lavc -ovc lavc -of mpeg -mpegopts format=dvd -lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=8000:vbitrate=5000:keyint=15:acodec=ac3:abitrate=192:aspect=4/3"
		# (see mplayer homepage for encoding examples)
		;;

	h)	echo "Format: HuffYUV / MP2 / "$HuffYUVxy" (etwa 650 MB/Min.)"
		AUFLOESUNG=$HuffYUVxy
		CODECS="HuffYUV_MP2"
		BEFEHL=$BEFEHL":width="$HuffYUVx":height="$HuffYUVy" -oac lavc -ovc lavc -lavcopts vcodec=huffyuv:format=422p:acodec=mp2:abitrate=224"
		;;

	x)	echo "Format: X264 / MP3 / $x264xy"
		AUFLOESUNG=$x264xy
		CODECS="x264_MP3"
		BEFEHL=$BEFEHL":width="$x264x":height="$x264y" -ovc x264 -x264encopts bitrate=1000 -oac lavc -lavcopts acodec=mp2"
		# vhq=1..4
		;;

	*)	echo "Format: MPEG4 / MP3 / $MPEG4xy / $MPEG4bitrate kbit/s (9,8 MB/Min.)"
		AUFLOESUNG=$MPEG4xy
		CODECS="FMP4_MP3"
		BEFEHL=$BEFEHL":width="$MPEG4x":height="$MPEG4y" -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:vbitrate="$MPEG4bitrate" -ffourcc XVID -oac mp3lame -lameopts cbr:br=128"
		;;
esac

echo -n "Deinterlacing (n=nein) [ja] ? "
read DI
if [ "$DI" != "n" ]; then
	echo "Deinterlacing: ja"
	DI=".deinterlaced"
	BEFEHL="$BEFEHL -vf pp=lb"
else
	echo "Deinterlacing: nein"
	DI=""
fi

echo -n "Maximale Aufnahmedauer ([[hh:]mm:]ss) [unbegrenzt]: "
read DAUERMAX
if [ $DAUERMAX ]; then
	echo "Aufnahmedauer: $DAUERMAX"
	BEFEHL="$BEFEHL -endpos $DAUERMAX"
else
	echo "Aufnahmedauer: unbegrenzt"
fi

echo "--------------------------------------------------------------"
echo "Fuehre aus: $BEFEHL"
echo "--------------------------------------------------------------"
echo "Die Aufzeichnung kann mit <Strg>-C korrekt beendet werden."
echo "Eingabe-Taste druecken, um mit der Aufzeichnung zu beginnen"
echo "<Strg>-C zum Abbruch"
read x

STARTZEIT=$(date +%Y.%m.%d_%H:%M)

DATEI=$NAME"."$STARTZEIT"."$AUFLOESUNG$DI"."$CODECS

BEFEHL="$BEFEHL -o $DATEI"

# Wo ist GNU time ?
TIMEBEFEHL=$(which time)

if [ $TIMEBEFEHL -a -x $TIMEBEFEHL ]; then

	# quiet=keine Abbruchmeldung format %e = Realsekunden -o Ausgabedatei
	$TIMEBEFEHL -o $TEMP_DATEI --quiet --format %e $BEFEHL

	DAUERsec=$(cat $TEMP_DATEI)
	rm $TEMP_DATEI

	# Loeschen aller Zeichen vom Zeilenende bis zu einem Punkt 
	# und des Punktes selbst (also eine ganze Zahl machen):
	DAUERsec=${DAUERsec%.*}

	if [ $DAUERsec -lt 60 ]; then
		DAUER=${DAUERsec}sec
	else
		DAUERmin=$[$DAUERsec/60]
		DAUER=${DAUERmin}min
	fi

	ENDDATEI=$DATEI"."$DAUER".avi"
else
	$BEFEHL
	ENDDATEI=$DATEI".avi"
	echo
        echo "Hinweis: Konnte die Aufnahmedauer nicht ermitteln und dem Dateinamen zufuegen, da das Programm \"time\" nicht ausfuehrbar ist (Achtung: Es wird die Programmdatei time (GNU time) benoetigt, kein Shell-interner time-Befehl; pruefen mit \"which time\")."
	echo "Falls gewuenscht, \"time\" ausfuehrbar machen."
        echo
fi

mv $DATEI $ENDDATEI

echo "------------------------------------------------------"
echo "Datei: $ENDDATEI"
echo "------------------------------------------------------"