Capture script

From V4LWiki

Jump to: navigation, search

[edit] Introduction

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

[edit] 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 "------------------------------------------------------"

Personal tools