V4L capture script
From LinuxTVWiki
(Difference between revisions)
m (16 revision(s)) |
m (Added category: Software) |
||
| Line 174: | Line 174: | ||
</pre> | </pre> | ||
| + | [[Category:Software]] | ||
Latest revision as of 23:48, 6 May 2009
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 "------------------------------------------------------"