2005-08-28
Analoges Aufnehmen - HOWTO
Hier wird ein nötiges Basiswissen erklärt wie man unter Linux mit mencoder
analoge Videos mit guter Qualität aufnehmen kann.
1. Einrichten von saa7134:
hotplug müsste eigentlich alles automatisch erkennen und die Module richtig laden.
Hier eine Liste der benötigten Module:
saa7134
video_buf
tuner
Optionen für saa7134 werden mit modinfo saa7134 erklärt. Mit oss=1 kann man den Ton
direkt als oss-device registrieren lassen. Da ich alsa verwende, musste ich mit dem
mitgelieferten Kabel zum Line-In der Soundkarte gehen.
root:/etc/modprobe.d# vi SAA7134
alias char-major-81 videodev
options saa7134 gbuffers=32
gbuffers habe ich auf das maximum gesetzt.
2. Ton richtig einschalten
Folgende Schalter müssen bei kmix gesetzt sein:
Line, Capture: roter Kreis, Lautstärke nicht zu hoch
Line-In As Surround: Disable
Will man stattessen lieber mit dem Microphon aufnehmen, dann:
Mic: roter Kreis, mit dem grünen Kreis kann man mithören
3. aufnehmen mit ffmpeg
Das FFmpeg-Projekt ist das wohl wichtigste Codecprojekt für Linux und
Unixartige Betriebssysteme. Es besteht aus den Teilen
ffmpeg
ffserver
ffplay
libavcodec
libavformat
Mit dem Konsolentool ffmpeg lassen sich verschiedene Videoformate
in ein anderes konvertieren, sogar die direkte Aufnahme von einer
TV-Karte ist möglich. Um beispielsweise die DivX-Datei mit einer
Auflösung von 720x512 und 25 fps direkt von der TV-Karte /dev/video0
aufzunehmen verwendet man folgenden Aufruf:
$ ffmpeg -vd /dev/video0 -b 720 -r 25 -s 720x512 -t 15 video.avi
ffmpeg bestimmt anhand der Dateiendung der Ausgabedatei ein Format,
bei AVI-Dateien standardmäßig MPEG4. Das Format läßt sich über den
Schalter -f ändern, eine Liste der gültigen Formate erfährt
man durch
$ ffmpeg -formats
ffserver ist ein Multimedia-Streamserver für HTTP, ffplay ein einfacher
Videoplayer auf der Basis von SDL.
5. JTVD
jtvd ist ein Programm welches einfaches Aufnehmen von Videos verspricht.
Das Programm ist in Java geschrieben. Die Qualtiät war mir unzureichend,
darum habe ich die einstellbaren Parameter in jtvd getuned und dann den
mencoder Befehl weiter verwendet.
Ausgangsbasis: diesen Mencoder Command habe ich von JTVD:
# JTVD command:
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=8:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=4/3:vqscale=2 -oac mp3lame -lameopts q=2:mode=1 -o test3.avi
es recht gut funktioniert, bis auf die Auflösung, Interlacing, Qualität und Breite.
-force-avi-aspect ist für das Seitenverhältnis zuständig: 4/3 oder 16/9
-tv string setzt die video4linux parameter
input setzt dabei die Videoquelle, aber dafür am besten jtvd verwenden!
0..television
1..composite1 (recommended)
2..s-video
3..composite2
freq setzt dabei die Frequenz
203,25..ORF1
224,25..ORF2
Die beste Bitrate konnte ich dadurch auf meinen System bestimmen:
Best Bitrate:
# JTVD command:
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=4000 -oac mp3lame -lameopts cbr:br=192:mode=1 -o /var/rip/jtvd/files/bitrate4000.avi
6. Einführung Seitenverhältnisse
"16:9 heißt, wie der Begriff schon verdeutlicht, daß sich Breite zu Höhe wie 16 zu 9
verhalten. Bei 768 Breite wären das 432 Höhe und bei 405 Höhe wären das 720 Breite."
"Aaaaaber - genau bei letzterem Zahlenverhältnis befände sich Dein Lehrer auf dem Holzweg denn PAL-DV (darauf will er wahrscheinlich hinaus), normalerweise mit 720*576 aufgelöst, hat bei 16:9 trotzdem nicht 720*405 sondern 720*432 Pixel! Das kommt daher daß DV bei der Wiedergabe in der Breite um den Faktor 1,0667 gestreckt wird, in der Höhe aber unverändert bleibt. Die NICHTQUADARTISCHEN PIXEL des DV-Formates werden also bei der Wiedergabe gestreckt um eine 4:3 PAL-Anzeige zu realisieren. Wenn die DV-Pixel quadratisch WÄREN (sind sie aber nicht!) dann käme man rein rechnerisch auf den Wert von 405. Da es aber KEINE quadratischen Pixel sind, muß auch da die richtige Antwort 432 lauten. Eine Auflösung von 720*405 ist definitiv falsch, kommt in der Praxis nicht vor und kann mit vielen Codecs überhaupt nicht generiert werden weil sie eine durch 8 oder teilbare Auflösung erwarten."
"Anamorph kodiertes Breitbild hat eine PAL-Auflösung von 720*576 Bildpunkten vor und 1024*576 Bildpunkte nach der Entzerrung."
"Since you can use lavc for encoding both video and audio (-ovc lavc -oac lavc), you can pass options for both in the same configuration line in -lavcopts or in your mencoder config file."
7. Konfiguration von mencoder
In ~/.mplayer/mencoder kann man Optionen angeben, die dann von mencoder verwendet werden. Ich habe
hier nur die xvidencopts angegeben:
File: ~/.mplayer/mencoder
xvidencopts=fixed_quant=3:vhq=4:chroma_opt=1:hq_ac=1:interlacing=1:bvhq=1:max_iquant=5:max_pquant=5:max_bquant=5:me_quality=6:quant_type=mpeg:gmc=1:max_overflow_improvement=15
8. audio codec (mp3)
"mp3lame - cbr/abr/vbr MP3 using libmp3lame
My default recommendation, encodes the audio using the MP3 format.
If you're feeling adventurous, man mencoder and search for lameopts
to see how to change VBR, ABR, etc.
mencoder movie.wmv -o movie.avi -ovc lavc -oac mp3lame
audio codec (mp2) - faster and little bigger
If no options are passed in -lavcopts, then lavc will encode the
audio to mp2.
Use the acodec argument with lavcopts to change the audio codec.
This example will encode the audio stream to mp3, using the ffmpeg libraries.
mencoder movie.wmv -o movie.avi -ovc lavc -oac lavc -lavcopts acodec=mp3
Author's Note: As a matter of opinion, using mp2 instead of mp3 is a
reasonable price to pay for a faster encoding. From my experience, the
size difference is not an issue."
Ich habe entgegen dieser Entscheidung mp3 verwendet. Das bringt dann die
zusätzlichen Parameter: -oac mp3lame -lameopts cbr:br=192:mode=1
-oac entscheided über das Programm
-lameopts gibt Paramter für lame, bei mir war die Bitrate 192 optimal
9. Suche beste mencoder Befehl:
Ausgang:
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=4000 -oac mp3lame -lameopts cbr:br=192:mode=1 -o lavc.avi
Versuche XviD zu verwenden:
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc xvid -xvidencopts fixed_quant=3:vhq=0:chroma_opt=1:hq_ac=1:interlacing=1:max_iquant=5:max_pquant=5:max_bquant=5:me_quality=2:quant_type=mpeg:gmc=1:max_overflow_improvement=15 -oac mp3lame -lameopts cbr:br=192:mode=1 -o xvid.avi
me_quality und vhq so hoch stellen, dass der Prozessor noch mitkommt (nicht nur 5 fps o.ä.)
(bringt nichts sichtbares und belastet cpu viel mehr)
-------------- vorletzte Version 16/9 (mit interlacing problem) -------------------
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=4000 -oac mp3lame -lameopts cbr:br=192:mode=1 -o 16-9.avi
-------------- vorletzte Version 4/3 (mit interlacing problem)-------------------
mencoder -force-avi-aspect 4/3 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=4/3:vbitrate=4000 -oac mp3lame -lameopts cbr:br=192:mode=1 -o 4-3.avi
-------------- vorletzte Version -------------------
10. Kurze Videos erzeugen.
Da es viel einfacher ist Videos zusammenzufügen (avimerge -o name -i file ...; bei transcode dabei) als sie
auseinanderzukriegen (avidemux) habe ich versucht beim Auslesen der Videokamera möglichst kurze Sequenzen
zu erzeugen, die man dann im Notfall immer noch zusammengeben kann!
Dieses Skript einfach ausführen und mit Strg+C immer an geeigneten Szenenwechseln veranlassen eine neue
Datei zu generieren. Die erzeugten Dateien heißen einfach der Reihe nach 1.avi -> 2.avi -> ...
Bei längeren Stückerln kann man dann den Namen in Ordnung bringen.
for i in `seq -w 01 99`
do
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=672:544:24:16 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=16/9:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi
mv current.avi "$i.avi"
done
11. Interlacing Problem
Von "Matthias Wieser":
"Sicher? Der obige Bildausschnitt sieht so aus, wie wenn du zusätzlich den
pp=lb Deinterlacer verwendet hättest.
Unabhängig davon, du kannst nicht erwarten, dass man nach einer
verlustbehafteten Kompression anschließend noch sauber alle ungeraden
Bildzeilen von den geraden trennen kann. Also: Entweder bei der Aufnahme
deinterlacen, oder interlaced aufzeichnen und erst im Abspielprogramm
Deinterlacing anschalten. Für letzteres gibt es zwei Mencoder Optionen,
die dies anschalten. Die eine ist "ildct", die andere musst du selbst in
der man-page nachschlagen."
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf crop=650:540:30:20 -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi
"Ach ja, wenn du statt "-vf hqdn3d" "-vf denoise3d" (oder gar lavcopts
nr=400) verwendest, bleibt auch noch genügend Rechenzeit für Mplayers
Deinterlacinf-Filter übrig. Empfehlenswert sind (pp=lb, pp=l5, pp=fd
oder -vf kerndeint). Besser ist es aber wohl, nichts am Video zu
verändern, sondern gleich interlaced (s.o.) aufzuzeichnen. Die
Deinterlacer vom Mplayer sind alle nicht so gut.
Du solltest auch die schwarzen Ränder vom Video abschneiden, würden
Fernseher eh machen. Das verringert den CPU-Bedarf und verbessert die
Komprimierbarkeit. z.B.: -vf crop=672:544:24:16"
12. XviD
XviD ist also ein open-source MPEG4-Codec, der hochqualitative Ergebnisse
liefert. Er unterstüzt Features wie mehrere B-Frames, Quarter pixel motion
compensation, Global motion compensation, Lumi masking, Trellis
Quantisierung, sowie H.263, MPEG und eigene Quantisierungsmatrizen.
-------------- letzte Version (16/9 - s-video) -------------------
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=672:544:24:16 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=16/9:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi
-------------- letzte Version (4/3 - composite) -----------------
mencoder -force-avi-aspect 4/3 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=1:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=672:548:24:14 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=4/3:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi
-------------- letzte Version (4/3 - TV) --------------------------
mencoder -force-avi-aspect 4/3 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=0:freq=203,25:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=714:548:0:14 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=4/3:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi
-------------- Schleife mit s-video (Übertragung von Videofilmen) ----------
for i in `seq -w 01 99`
do
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=672:544:24:16 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=16/9:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi
mv current.avi "$i.avi"
done
-------------- letzte Version -------------------------------------
Diese Tipps haben mich dann zu den letzendlichen mencoder Befehl geführt.
Achtung! Da hier xvid verwendet werden, ist auch die obige xvid Konfiguration
von Bedeutung.
Erklärung der Paramter:
-vf-add: Um eine Filterkette aufzubauen, benötigt man -vf-add. Dieser Filter werden dann alle hintereinander
ausgeführt.
crop: dieser Filter schneidet den schwarzen Rand weg
kerndeint: kümmert sich um das interlacing
vcodec=xvid: Ganz wichtig, erst dadurch wird der wesentlich bessere xvid codec aktivert
{Referenzen}
http://gentoo-wiki.com/HOWTO_Mencoder_Introduction_Guide
http://www.linuxforen.de/forums/showthread.php?t=88454
http://mplayerhq.hu/DOCS/HTML/de/encoding.html