• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Script zum Aufnehmen von der TV-Karte mit mencoder

taki

Advanced Hacker
[editiert seit="26.03.2005 2:41 am" zuletzt="12.04.2005 10:23"]
Das hier gepostete Bashscript ist obsolet. Es wurde als Perlscript neu erstellt. Ich würde mich aber trotzdem freuen, wenn in diesem Thread weiterhin Anregungen, Wünsche und Probleme des Scripts diskutiert werden.

Die jeweils neueste Fassung des Scripts kann von meiner HP gezogen werden.

Unter der folgenden URL gibt es ein kleines Handbuch zum Srcipt. http://www.andreas-silberstorff.de/tv_perl/)

Das RPM kann unter SuSE installiert werden, indem man mit der rechten Maustaste auf den Link klickt und aus dem Kontextmenü die Vorschau mit KRPMView auswählt. http://www.andreas-silberstorff.de/tv_perl/download/RPMS/noarch/tv_perl-0.8-1.noarch.rpm

Wer kein RPM installieren kann oder will, kann das Script auch als tarball bekommen.
http://www.andreas-silberstorff.de/tv_perl/download/SOURCES/tv_perl-0.08.tar.gz

Auf der Homepage werden ausserdem Kanallisten für tv.pl und für xawtv zum Download angeboten. Die neueste Liste ist für analoges Kabel in Kaiserslautern (Danke an Jochen alias jwartenb).
[/editiert]


Hallo.
Ich hatte das Script schon mal in einem anderen Thread gepostet. Da verschimmelt es aber wahrscheinlich und man wird immer wieder auf das Thema kommen und es wieder vergessen. Ich denke, es macht Sinn, dafür einen eigenen Thread zu erstellen. Ich poste daher hier mal mein Script und rege an, drüber zu diskutieren und es schrittweise zu verbessern, so dass möglichst viele Nutzen davon haben sollten.


Ein Punkt, der als erstes verbesserungswürdig wäre ist, die Kanalliste in eine eigene Datei auszulagern. Die Kanalliste ist die für Kabelfernsehen am Westrand von Berlin und dürfte nämlich schon eine Ortschaft weiter nicht mehr passen. Das Script für jeden ändern zu müssen wäre blöd. Da wären unabhängige Kanallisten besser.


Wie wird es verwendet?

Um zu Testen, ob die Kanalliste stimmt, hat es auch eine Option zum Fernsehen (Sender ARD nur mal als Beispiel):


sollte das Fernsehbild mit Bild und Ton im MPlayer anzeigen.

Zum Aufnehmen wird statt play record angegeben und als zusätzlicher Parameter die Dauer:

tv ARD record 00:15:00

würde also von jetzt an 15 Minuten vom Fernseher aufnehmen.

Diesen Aufruf kann man in die Crontab eintragen (mit crontab -e oder mit kcron), wenn man eine Fernsehserie aufnehmen möchte. Hier z.B. der Eintrag in meiner crontab, um u.a. Pondo Rondo und die Sesamstraße für meine Tochter aufzunehmen ( 8) Petzi läuft ja leider grad nicht mehr):

taki@rivendell:~> crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.8768 installed on Thu Feb 17 19:18:53 2005)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
# Petzi aufnehmen
53 7 * * 1,2,3,4,5 /usr/local/bin/tv KiKa record 1:00:00
#TEST 16 21 * * 1,2,3,4,5,6,7 /usr/local/bin/tv KiKa record 0:00:15
# This file was written by KCron. Copyright (c) 1999, Gary Meyer
# Although KCron supports most crontab formats, use care when editing.
# Note: Lines beginning with "#\" indicates a disabled task.

at ist Dein Freund, wenn Du einen bestimmten Film aufnehmen willst:

echo "/pfad/zum/Script/tv arte record 1:40:00" | at 00:25 Mai 1



Hier nun das Script in seiner bisherigen Form:

Code:
#!/bin/bash
# TODO:
# 1.) Die Kanalliste sollte in einer eigenen Datei liegen und nicht hier definiert werden müssen

STATION=$1;
OPCODE=$2;
ENDPOS=$3;
echo "ENDPOS = $ENDPOS";

case $STATION in
   ARD|ard)
      FRQ='210.000';
      ;;
   ZDF|zdf)
      FRQ='196.000';
      ;;
   Arte|arte)
      FRQ='126.250';
      ;;
   3Sat|3sat)
      FRQ='161.000';
      ;;
   RBB|rbb)
      FRQ='182.250';
      ;;
   MDR|mdr)
      FRQ='280.310';
      ;;
   NDR|ndr)
      FRQ='273.000';
      ;;
   WDR|wdr)
      FRQ='311.380';
      ;;
   BR|br)
      FRQ='327.310';
      ;;
   XPP|xpp)
      FRQ='415.000';
      ;;
   Pro7|pro7)
      FRQ='294.000';
      ;;
   Sat1|sat1)
      FRQ='203.000';
      ;;
   VOX|VoX|Vox|vox)
      FRQ='231.000';
      ;;
   Kabel1|kabel1|k1)
      FRQ='140.000';
      ;;
   RTL2|rtl2)
      FRQ='245.379';
      ;;
   SRTL|srtl)
      FRQ='303.380';
      ;;
   TVB|tvb)
      FRQ='147.000';
      ;;
   BBC|bbc)
      FRQ='252.310';
      ;;
   MTV|mtv)
      FRQ='287.190';
      ;;
   Phoenix|phoenix)
      FRQ='189.250';
      ;;
   Euro|euro)
      FRQ='168.250';
      ;;
   NTV|N-TV|ntv|n-tv)
      FRQ='133.000';
      ;;
   CNN|cnn)
      FRQ='238.000';
      ;;
   KIKA|KiKa|kika)
      FRQ='259.000';
      ;;
   DFS|dsf)
      FRQ='319.000';
      ;;
   N24|n24)
      FRQ='335.310';
      ;;
   QVC)
      FRQ='224.129';
      ;;
   HSE24)
      FRQ='175.379';
      ;;
   *)
      echo "unbekannter Sender ( $FQ )";
      echo "evtl. Groß-/Kleinschreibung falsch";
      exit 1;
      ;;
esac

function inittv
{
   su -c 'rmmod saa7134'
}

function showtv
{
  STAT=$1;
  FREQ=$2;
  echo "Frequenz = $FREQ";
  mplayer \
     -fs \
     tv\:// \
     -tv driver=v4l2:norm=pal:width=1280:height=1024:fps=25:outfmt=yuy2:quality=0:freq=$FRQ \
     -vo xv \
     -v 3;
   return;
}

function recordtv
{
  STAT=$1;
  FREQ=$2;
  ENDPOS=$3;
  DATE=`date +%a_%d.%b.%G_%H%M%S`;
  FILE=/home/freevo/Documents/Video/misc/tv_"$STAT"_"$DATE".avi;
  echo "Aufzeichnung heißt $FILE";
  echo "Frequenz = $FREQ";
  echo "Laenge   = $ENDPOS";
  echo "";
#    -v 3
  
  /usr/bin/mencoder \
    -endpos $ENDPOS \
    tv\:// \
    -tv driver=v4l2:\
norm=pal:width=720:height=576:fps=25:outfmt=yuy2:quality=0:\
immediatemode=1:audiorate=32000:forceaudio:alsa:amode=3:\
freq=$FRQ \
    -ovc lavc \
    -lavcopts vcodec=mpeg4:aspect=4.0/3.0:vhq:vbitrate=1800 \
    -vf lavcdeint \
    -oac mp3lame \
    -lameopts fast:preset=standard \
    -mc 10 \
    -o $FILE \
  ;
  return;
}


case "$OPCODE" in
record)
  recordtv $STATION $FRQ $ENDPOS;
  ;;
play)
  showtv $STATION $FRQ;
  ;;
*)
  echo 'Aufruf zum Fernsehen ist';
  echo '        tv Sendername play';
  echo '';
  echo 'Aufruf zum Aufnehmen ist';
  echo '        tv Sendername record Dauer(HH:MM:SS)';
  exit 1;
  ;;
esac
exit 0;
[/b][/url]
 
OP
taki

taki

Advanced Hacker
Aufnahme über composite ist was ganz anderes. Da kannst Du ja auch keinen Kanal einstellen, sondern nimmst eben das Signal auf, welches auf der Schnittstelle anliegt. Das hatte ich mit dem hier vorgestellten Script nicht vor.

Mich hatte bei meinen ersten Gehversuchen mit mencoder als Videorekorder mehr gestört, dass die Steuerung des Tuners so umständlich war. Die Parameter für die Ausgabequalität (Video- und Audiocodec und deren Optionen) sucht man sich einmal zusammen und ändert da eher nichts mehr dran, wenn man einmal zufrieden ist.

Für Deine Anwendung könnte man das Script sehr viel einfacher halten. Ein solches hast Du Dir, wenn ich mich aus dem anderen Thread richtig erinnere, auch schon selbst erstellt.
 

migo

Member
Hi tahi,

super Idee mit dem Skript! Ich hatte mich da auch mal versucht und das ganze mit kdialog, der interaktiven KDE-Shell, aufgebaut. Als Senderfile wird hier ~/.xawtv benutzt, was von xawtv nach dem Scannen automatisch erstellt wird.
Da ich glaube, daß das Rad nicht immer wieder neu erfunden werden muß, poste ich mal meinen Ansatz, der doch ziemlich unterschiedlich aussieht:

Code:
#!/bin/sh
#
# Abfrage der Startzeit
#
start=`kdialog --title "Startzeit" --inputbox "Bitte Startzeit eingeben (Format hh:mm oder "now", falls sofort)"`
#
# Abfrage des gewünschten Senders und Einstellung desselben.
# test: Aufruf zu einer Prüfung, Shell-Befehl
# -eq: "equal" = "ist gleich", Shell-Befehl zum Vergleich zweier Zahlen
# z.B. arte "Arte" bedeutet: in .xawtv ist "arte" eingestellt, im Menü wird "Arte" angezeigt.
#
sender=`kdialog --title "Senderauswahl" --menu "Welcher Sender soll eingestellt werden?" ARD "ARD" ZDF "ZDF" RTL "RTL" SAT1 "SAT1" Pro7 "Pro Sieben" Kabel1 "Kabel 1" RTL2 "RTL2" VOX "VOX" arte "Arte" SuperRTL "Super RTL" KIKA "KiKa" NDR "NDR" WDR "WDR" BR "BR" mdr "MDR" 3sat "3 Sat" VIVA "VIVA" MTV "MTV" Phoenix "Phoenix" EuroSport "EuroSport" DSF "DSF" MTV2 "MTV2" N24 "N24" CNN "CNN" 9Live "9Live" Tele5 "Tele5" HH1 "HH1" NBC "NBC" TV5 "TV5" TRTInt Onyx "Onyx" EuroNews "EuroNews" n-tv "N-TV" "TRT Int" HSE24 "HSE24"`
#
# Abfrage des Dateinamens
#
filmname=`kdialog --title "Dateiname" --inputbox "Vorläufiger Dateiname (ohne Dateiendung)"`
#
# Abfrage der Aufnahmedauer
#
dauer=`kdialog --title "Dauer der Aufnahme" --inputbox "Aufnahmedauer? (Format hh:mm)"`
#
# Umrechnung der Aufnahmedauer in Minuten
# FS: "Field Separator" = "Feldtrennzeichen" für awk
#
minuten=`echo $dauer | awk 'BEGIN { FS= ":" } { print ( $1 * 60 ) + $2 }'`
#
# Festlegung der Bitrate: Unter 120 Minuten Filmdauer stets 2000 kByte/s, darüber Anpassung an max. 2 GB Dateigröße
# lt: "less than" = "kleiner als", Shell-Befehl zum Vergleich zweier Zahlen
# scale: Festlegung der Nachkommastellen der bc-Berechnung, hier: keine ("0"), sonst Fehlermeldung von mencoder
#
if test $minuten -lt 120
then bitrate=2000
else bitrate=`echo "scale=0;(1995-0.9375*$minuten)*8192/(60*$minuten)"|bc`
fi
#
# Abfrage nach Schwarz-Weiss-Aufnahme
#
farbe=`kdialog --title "Schwarz-Weiss?" --menu "Soll in Schwarz-Weiss aufgenommen werden?" "" Farbe "gray" SW`
#
# Ausgabe der eingestellten Daten.
#
kdialog --title "Filmdaten" --yesno "Es wird aufgenommen\n ---------------------------------------------------------------------------------------------------------------- \n Ordner: /daten/videos/tv\n Dateiname: `date +%Y-%m-%d_`$start-$sender-$filmname.avi\n Sender: $sender\n Beginn der Aufnahme: $start Uhr\n Aufnahmedauer: $minuten min\n Bitrate: $bitrate kBit/s\n ---------------------------------------------------------------------------------------------------------------- \n OK?"
#
# Weiteres Vorgehen
# Ja gibt $? = 0
# Nein gibt $? = 1
#
if [ $? = 0 ]
then
#
# Start der zeitprogrammierten Filmaufnahme
#
at $start <<EOF
v4lctl setstation $sender
sudo nice -n-17 mencoder tv:// -tv driver=v4l:width=768:height=576:input=0:norm=PAL \
     -ovc lavc \
     -lavcopts vcodec=mpeg4:vbitrate=$bitrate:$farbe:keyint=25 \
     -oac mp3lame \
     -lameopts cbr:br=128:mode=0 \
     -endpos $dauer:00 \
     -vf pp=hb/vb/dr/al/lb,denoise3d,scale=384:288 \
     -o /daten/videos/tv/`date +%Y-%m-%d_`$start-$sender-$filmname.avi
EOF
fi

Ich hoffe, das sieht nicht besserwisserisch aus, soll es auch garnicht sein. Ich lerne nur gerne von anderen Leuten und habe Spaß daran, deren Ideen zu entdecken. Vielleicht geht's dir ja genauso.

Michael
 
OP
taki

taki

Advanced Hacker
Hallo Michael.
Prima, werde Dein Script heute abend mal ausprobieren. Ich hab kein Problem damit, wenn jemand bessere Umsetzungen vorschlägt. Genau das sollte ja der Sinn des Threads sein, dass möglichst viele gute Ideen zusammenkommen und wir evtl. gemeinsam ein optimales Script erstellen, dass möglichst für viele ein Gewinn bedeutet.

Was mir besonders gut gefällt ist, dass Du die Kanalliste von xawtv nutzt. Meine Liste funktioniert zwar, aber elegant ist das nicht, wenn die Liste in dem Script definiert ist.

Ich hatte schon mal ein wenig mit einer CSV-Liste rumgespielt. Habe das aber fallen gelassen, weil ich nicht die xte Version einer Kanalliste erfinden wollte. Wenn ich mehr drauf hätte (besser gesagt einfach nur mehr Zeit), würde ich gerne die Liste von kdetv einlesen können. Noch besser wäre, ein pluginfähiges System zu erstellen, wo man das Format der Kanalliste wählen könnte (von xawtv oder kdetv oder was immer man bräuchte).

Wenn Dein Script auch bei mir läuft, würde ich es aber noch in Funktionen aufsplitten und die Interaktionen mit kdialog optional machen. Das Script lässt sich so nämlich nicht in die crontab eintragen oder mit at aufrufen. Zeitgesteuertes Aufnehmen war mir aber die wichtigste Funktion.

Auch könnte man den Cron- oder at-Aufruf mit kdialog als Funktion integrieren. Wenn die Bedingung des nicht interaktiven Aufrufs besteht, trägt das Script dann den Aufruf auf sich selbst in die crontab oder gibt ihn an at weiter.

Auch finde ich es ganz gut, wenn man statt nur Aufnehmen auch ein MPlayer-Fenster zum Anschauen starten kann. So kann man erst einmal austesten, ob die Kanalliste funktioniert, ehe man evtl. Murx auf die Platte schaufelt.

Ich lasse heute abend wieder von mir hören.
Gruß,
Taki

[editiert]
Man sollte erst genau lesen, ehe man unsinn verzapft :oops: . Du hast ja schon zeitgesteuertes Aufnehmen vorgesehen. Prima Arbeit. Da bleibt ja dann erst mal gar nichts offen... allenfalls für jemanden, der keine kde-Abhängigkeiten mag, was aber auf mich definitiv nicht zu trifft :p )
[/editiert]

[editiert2]
Ich hoffe, es stört Dich nicht, wenn ich auf dem Script aufsetze und eine erweiterte Fassung hier posten werde.

Was mir noch fehlt, ist die Aufnahme von Serien (cron statt at). Dafür wäre genau die Umstellung, die ich oben vorgeschlagen habe, die Lösung (nicht interaktiver Aufruf wird in crontab eingetragen oder an at übergeben).

Der Ablageort sollte auch flexibel einstellbar werden. Den gleichen Fehler hab ich bei meinem Script auch gemacht, bei mir sollten die Videos nach /home/freevo/Documents/Video/misc. Das fest vorzugeben ist aber blöd. Wenn man die KDE-Abhängigkeiten akzeptiert, sollte es sogar eine Möglichkeit geben, dafür den Fileselector von kde aufzurufen :;-):

Wäre auch schade gewesen, wenns nichts zu verbessern gäbe 8)
[editiert2]
 

mca

Hacker
@taki und migo:
moin ihr programmierer,
ich hab mich sehr über das topic hier gefreut, da ich gerade ne tv-karte zum laufen gebracht habe, ich aber nicht weiss, wie man von da aufnimmt. die record-funktion in xawtv klappt bei mir nicht, er reagiert einfach nicht, wenn ich "start recording" klicke. also will ich jetzt eins von euren mencoder-scripts benutzen, aber irgendwas mach ich falsch:
ich erstelle eine textdatei namens "tv" in /home/ich/scripts/ mit dem inhalt eines scripts von euch, dann rechtsklick-eigenschaften-berechtigungen-haken bei "ausführbar". richtig? jetzt starte ich als root z.b. das script von migo (find ich nett mit den popups) mit "./tv" :
tv-script.jpg

doch dann:
linux:/home/ich/scripts # ./tv
./tv: line 65: syntax error: unexpected end of file

beim script von taki passiert bei mir folgendes:
linux:/home/ich/scripts # ./tv ARD play
ENDPOS =
./tv: line 148: syntax error near unexpected token `;'
./tv: line 148: ` ; '

wenn ich spasses halber das semikolon wegnehme, passiert folgends:
linux:/home/ich/scripts # ./tv ARD play
ENDPOS =
Frequenz = 210.000
MPlayer 1.0pre6-3.3.4 (C) 2000-2004 MPlayer Team
CPU: Advanced Micro Devices Athlon 4 /Athlon MP/XP Palomino (Family: 6, Stepping: 2)
Detected cache-line size is 64 bytes
CPUflags: MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 1 SSE2: 0
Compiled with runtime CPU detection - WARNING - this is not optimal!
To get best performance, recompile MPlayer with --disable-runtime-cpudetection.

Linux RTC init error in ioctl (rtc_irqp_set 1024): Unpassender IOCTL (I/O-Control) für das Gerät
Try adding "echo 1024 > /proc/sys/dev/rtc/max-user-freq" to your system startupscripts.
Opening joystick device /dev/input/js0
Can't open joystick device /dev/input/js0 : Kein passendes Gerät gefunden
Can't init input joystick
Setting up LIRC support...
mplayer: could not connect to socket
mplayer: Verbindungsaufbau abgelehnt
Failed to open LIRC support.
You will not be able to use your remote control.
Playing .
File not found: ' '
Failed to open

Exiting... (End of file)
./tv: line 113: -fs: command not found
./tv: line 114: tv://: Datei oder Verzeichnis nicht gefunden
./tv: line 115: -tv: command not found
./tv: line 116: -vo: command not found
./tv: line 117: -v: command not found

irgendwas mach ich total falsch. ich hoffe, ihr helft mir.

@taki: was sehe ich denn da in deinem script (Zeile 127):
FILE=/home/freevo/Documents/Video/misc/tv_"$STAT"_"$DATE".avi;
ist das kein problem für mich, das so zu benutzen?
 
OP
taki

taki

Advanced Hacker
hassan schrieb:
ich erstelle eine textdatei namens "tv" in /home/ich/scripts/ mit dem inhalt eines scripts von euch, dann rechtsklick-eigenschaften-berechtigungen-haken bei "ausführbar". richtig?
grundsätzlich ja.


hassan schrieb:
jetzt starte ich als root z.b. das script von migo (find ich nett mit den popups) mit "./tv" :
...
doch dann:
linux:/home/ich/scripts # ./tv
./tv: line 65: syntax error: unexpected end of file

Sollte ohne root auch gehen. migo verwendet sudo, um den mencoderaufruf mit nice -17 mehr Biss zu geben.

Der Fehler in Zeile 65 weist darauf hin, dass das mit dem Kopieren aus der Zwischenablage problematisch ist. Da sind Sonderzeichen mit rübergekommen, die da nicht reingehören (DOS-Zeilenenden?). Leider hab ich da noch keine passende Lösung. Wenn ein oder mehrere Scripts ausgereifter sind, würde ich versuchen, die über meine Webseite zum Download zur Verfügung zu stellen. Das Problem ist das gleiche, wie bei den Scripts für apt ().

hassan schrieb:
beim script von taki passiert bei mir folgendes:
linux:/home/ich/scripts # ./tv ARD play
ENDPOS =
./tv: line 148: syntax error near unexpected token `;'
./tv: line 148: ` ; '

Sieht mir nach dem gleichen Problem aus wie oben.

hassan schrieb:
wenn ich spasses halber das semikolon wegnehme, passiert folgends:
linux:/home/ich/scripts # ./tv ARD play
ENDPOS =
Frequenz = 210.000
MPlayer 1.0pre6-3.3.4 (C) 2000-2004 MPlayer Team
CPU: Advanced Micro Devices Athlon 4 /Athlon MP/XP Palomino (Family: 6, Stepping: 2)
Detected cache-line size is 64 bytes
CPUflags: MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 1 SSE2: 0
Compiled with runtime CPU detection - WARNING - this is not optimal!
To get best performance, recompile MPlayer with --disable-runtime-cpudetection.

Linux RTC init error in ioctl (rtc_irqp_set 1024): Unpassender IOCTL (I/O-Control) für das Gerät
Try adding "echo 1024 > /proc/sys/dev/rtc/max-user-freq" to your system startupscripts.
Opening joystick device /dev/input/js0
Can't open joystick device /dev/input/js0 : Kein passendes Gerät gefunden
Can't init input joystick
Setting up LIRC support...
mplayer: could not connect to socket
mplayer: Verbindungsaufbau abgelehnt
Failed to open LIRC support.
You will not be able to use your remote control.
Playing .

Bis hier her sieht es noch gut aus. Die Fehlermeldungen sind vom MPlayer und sind normal.

hassan schrieb:
File not found: ' '
Failed to open

Exiting... (End of file)
./tv: line 113: -fs: command not found
./tv: line 114: tv://: Datei oder Verzeichnis nicht gefunden
./tv: line 115: -tv: command not found
./tv: line 116: -vo: command not found
./tv: line 117: -v: command not found

Das sind Folgefehler des o.g. Fehlers.

hassan schrieb:
irgendwas mach ich total falsch. ich hoffe, ihr helft mir.

...nicht wirklich. :oops:

hassan schrieb:
ich hoffe, ihr helft mir.

Wollens versuchen :wink:


hassan schrieb:
@taki: was sehe ich denn da in deinem script (Zeile 127):
FILE=/home/freevo/Documents/Video/misc/tv_"$STAT"_"$DATE".avi;
ist das kein problem für mich, das so zu benutzen?

Ja, das dürfte ein Problem für Dich sein. Die Zeile muss angepasst werden. Wird in einer späteren Version geändert (flexibler gemacht). Das gleiche Problem (nur ein anderer Pfad) hat auch das Script von migo.

Ein weiteres Problem könnte die Frage sein, welchen Treiber Du brauchst (ich brauche v4l2, migo v4l). Das steht auch bei mir im Pflichtenheft für eine spätere Version.

Im Augenblick sind beide Scripte noch nicht ohne weiteres ohne individuelle Anpassungen einsetzbar. Damit sich das ändert, hatte ich den Thread hier ins Leben gerufen. Es könnte sich lohnen, den Thread über eine längere Zeit zu verfolgen.

Gruß,
Taki
 

mca

Hacker
ok, es klappt jetzt soweit. wenn ich "./tv pro7 play" eingebe, öffnet sich der mplayer mit pro7. wenn ich jedoch "./tv pro7 record 00:00:05" eingebe, höre ich den ton, aber sehe kein bild die fünf sekunden lang. das output-video hat aber keinen ton. hier die ausgabe:
ich@linux:~/scripts> ./tv pro7 record 00:00:05
ENDPOS = 00:00:05
Aufzeichnung heißt /home/ich/tv_pro7_Di_22.Mär.2005_181947.avi
Frequenz = 294.000
Laenge = 00:00:05

MEncoder 1.0pre6-3.3.4 (C) 2000-2004 MPlayer Team
CPU: Advanced Micro Devices Athlon 4 /Athlon MP/XP Palomino (Family: 6, Stepping: 2)
Detected cache-line size is 64 bytes
CPUflags: Type: 6 MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 1 SSE2: 0
Compiled with runtime CPU detection - WARNING - this is not optimal!
To get best performance, recompile MPlayer with --disable-runtime-cpudetection.
File not found: 'frameno.avi'
Failed to open frameno.avi
success: format: 9 data: 0x0 - 0x0
TV detected! ;-)
Selected driver: v4l2
name: Video 4 Linux 2 input
author: Martin Olschewski <olschewski@zpr.uni-koeln.de>
comment: first try, more to come ;-)
Selected device: BT878 video (Leadtek WinFast 20
Tuner cap:
Tuner rxs: LANG1 LANG2
Capabilites: video capture video overlay VBI capture device tuner read/write streaming
supported norms: 0 = PAL; 1 = NTSC; 2 = SECAM; 3 = PAL-Nc; 4 = PAL-M; 5 = PAL-N; 6 = NTSC-JP; 7 = PAL-60;
inputs: 0 = Television; 1 = Composite1; 2 = S-Video; 3 = Composite3;
Current input: 0
Current format: YUYV
v4l2: current audio mode is : LANG2
[V] filefmt:9 fourcc:0x32595559 size:720x576 fps:25,00 ftime:=0,0400
==========================================================================
Opening audio decoder: [pcm] Uncompressed PCM audio decoder
AUDIO: 32000 Hz, 1 ch, 16 bit (0x10), ratio: 64000->64000 (512,0 kbit)
Selected audio codec: [pcm] afm:pcm (Uncompressed PCM)
==========================================================================
Opening video filter: [expand osd=1]
Expand: -1 x -1, -1 ; -1 (-1=autodetect) osd: 1
Opening video filter: [lavcdeint]
==========================================================================
Opening video decoder: [raw] RAW Uncompressed Video
VDec: vo config request - 720 x 576 (preferred csp: Packed YUY2)
Could not find matching colorspace - retrying with -vf scale...
Opening video filter: [scale]
VDec: using Packed YUY2 as output csp (no 0)
Movie-Aspect is undefined - no prescaling applied.
SwScaler: reducing / aligning filtersize 1 -> 4
SwScaler: reducing / aligning filtersize 1 -> 4
SwScaler: reducing / aligning filtersize 1 -> 1
SwScaler: reducing / aligning filtersize 9 -> 8

SwScaler: BICUBIC scaler, from Packed YUY2 to Planar YV12 using MMX2
videocodec: libavcodec (720x576 fourcc=58564944 [DIVX])
High quality encoding selected (non real time)!
Selected video codec: [rawyuy2] vfm:raw (RAW YUY2)
==========================================================================
MP3 audio selected
Building audio filter chain for 32000Hz/1ch/16bit -> 32000Hz/1ch/16bit...
Writing AVI header...
ODML: vprp aspect is 16384:4096.

preset=standard

Forcing audio preload to 0, max pts correction to 0
ODML: vprp aspect is 16384:4096.
Pos: 5,0s 122f ( 0%) 16fps Trem: 0min 0mb A-V:0,000 [2037:32]
Flushing video frames

Writing AVI index...
Fixing AVI header...
ODML: vprp aspect is 16384:4096.

Video stream: 2037,338 kbit/s (254667 bps) size: 1273336 bytes 5,000 secs 122 frames

Audio stream: 32,000 kbit/s (4000 bps) size: 19872 bytes 4,968 secs
v4l2: 189 frames successfully processed, 0 frames dropped.

sieht gut aus, aber ohne ton ist es nummal nix. was tun?
 
OP
taki

taki

Advanced Hacker
Kind schläft, Programmierung nervt, jetzt nehm ich mir endlich die Zeit, mal wieder ins Netz zu lauschen.

hassan schrieb:
ok, es klappt jetzt soweit. wenn ich "./tv pro7 play" eingebe, öffnet sich der mplayer mit pro7. wenn ich jedoch "./tv pro7 record 00:00:05" eingebe, höre ich den ton, aber sehe kein bild die fünf sekunden lang. das output-video hat aber keinen ton.

Hallo Hassan.
Dass es soweit klappt, freut mich schon mal ungemein. Den Ton sollten wir auch noch ins Video bekommen. 8)

Du must mit einem Audiomixer das Capturen von der Videokarte einschalten und die Lautstärke dafür einstellen. Hatte ich vergessen zu erwähnen, weil ich das vor Monaten eingestellt hatte und gar nicht mehr dran dachte.

Evtl. braucht mencoder auch andere Vorgaben für die Tonausgabe der TV-Karte, aber wenn Du bei der Wiedergabe (tv play Sender) Ton hast, können wir das wohl ausschließen. Wäre sonst nicht so schön, weil ich aus der Manpage von mencoder nicht wirklich schlau werde und froh bin, es hinbekommen zu haben.

Ein Problem kann auch ein laufendes Programm sein, welches Arts verwendet. Eigentlich dürfte das nicht stören, aber ich habe da schlechte Erfahrungen mit amaroK gemacht (s.a. http://www.linux-club.de/viewtopic.php?t=25949&highlight=).
 

bussen

Member
Das mit der Soundausgabe sollte auch nicht so schwer sein.

Die Optionen von mencoder werden durch Leerzeichen und - getrennt.
Unteroptionen werden nur durch : getrennt.

Also, das mit:

mencoder tv:// -tv driver=v4l2:input=0:width=512:height=384

ist folgendermassen.

tv:// Dahinter kann ja der Sender angegeben werden.
-tv Gibt an, dass danach durch doppelpunkte getrennt die TV Optionen kommen

Den Rest der Optionen kann man ja in der Manpage nachlesen.

Wichtig fuer den Sound sollten aber Sicherlich folgende Optionen sein:

forceaudio Capture auch dann Audio, wenn v4l keine Audioquellen zurückmeldet.
alsa Benutze ALSA zum Capturen.
amode Wählt einen Audiomodus:
0: mono
1: stereo
2: Sprache 1
3: Sprache 2

forcechan=<1-2> Normalerweise wird die Anzahl der aufgenommenen Audiokanäle automatisch durch Ermitteln des Audiomodus der TV-Karte festgelegt. Mit dieser Option kann Mono/Stereo unabhängig von dem von V4L zurückgegebenen Audiomodus erzwungen werden. Kann benutzt werden, wenn die TV-Karte den aktuellen Audiomodus nicht zurückgeben kann.


Welche werte fuer die Optionen bei euch zutreffen, weiss ich nicht.
(Sorry, aber ich kanns aber echt nicht besser erklaeren)
:oops:
 

bussen

Member
Ach ja, fast vergessen. :oops:

Das mit der Aufnahmequelle ist wichtig.
Die Programme (nicht nur mencoder, sondern z.b. auch Skype) koennen entweder vom Line in, oder vom MIC (Mikrofon) den Sound "abzapfen".

Dies stelle ich mit dem mixer gamix ein. Dafuer gehen sicherlich auch andere Mixer Programme. Der gamix hat nen Regler "Capture". Unter dem Regler kann man die Aufnahmequelle bestimmen.

Also:
Bevor ich mit Skype per Internet telefoniere, gebe ich als Capture device "Mic" an. Sonst wuerde mein gegenueber nur TV Sound hoeren. Wuerde ich da als Capture device "Video" angeben, dann wuerde mein gegenueber nur meine MP3s hoeren.

Wenn ich danach einen Film aufnehmen moechte, dann muss ich den Mixer bei "Capture" auf "Line" stellen. Dadurch nimmt er den Sound dann vom "Line in" der Soundkarte auf.

Ich hoffe, dass diese Erklaerung besser war.
(Kanns echt nicht besser)
:cry:
 
OP
taki

taki

Advanced Hacker
[editiert]
Das hier gepostete Script ist obsolet.

Die jeweils neueste Fassung des Scripts kann ab sofort von meiner HP gezogen werden (http://www.andreas-silberstorff.de/tv_perl/download/tv.pl.tar.gz).

Dort entsteht auch ein kleines Handbuch (http://www.andreas-silberstorff.de/tv_perl/).

Das steht auch im ersten Posting, wo ich auch den Zeitpunkt des letzten Uploads vermerken werde.
[/editiert]





Hier kommt meine nächste Fassung.
Habs aber umgestellt auf perl, weil ich das Setzen der Werte über Funktionen mit dem Bashscript nicht hinkrieg. Das Skelett hab ich übrigens mit kdevelop erzeugt.

Aber Vorsicht: Aufzeichnung hab ich noch nicht getestet. Es ist mit Sicherheit noch einiges zu tun.

Getestet ist die Wiedergabe. Die funktioniert. Um den Rest kümmere ich mich morgen abend oder spätestens am Wochenende.
Gruß,
Taki

Code:
#!/usr/bin/perl -w
#
use strict;
use warnings;
use Shell;

#program version
my $VERSION="0.1";

#For CVS , use following line
#my $VERSION=sprintf("%d.%02d", q$Revision: 1.3 $ =~ /(\d+)\.(\d+)/);

###################################################################################
# Version: 0.01
# Lizens:  gpl
# Autoren: migo, taki
#
# Dieses Script wird im linux-club Forum multimedia besprochen und entwickelt.
# Verbesserungsvorschläge sollen dort gepostet werden.
# URL: http://www.linux-club.de/viewtopic.php?p=153446#153446
#
# TODO: Umstellung auf englisch, I18N,
#       und
#       s. TODO-comment in the subs
#
#       Wenn vollständig, umsetzen in Python oder Ruby
#       -> bessere Performance, Möglichkeit, zu einer vollwertigen KDE-Anwendung
#          zu wachsen (DCOP-Interface, KFileDialog mit kio-slaves, kparts etc.)
###################################################################################

###################################################################################
# Hardwareabhängige Einstellungen (vom Benutzer anzupassen)
#
# TODO: Auslagern in Konfigurationsdatei, Einstellungsmöglichkeit über Dialog
###################################################################################
#my $driver = 'v4l';
my $driver = 'v4l2';
#my $norm   = 'ntsc';
my $norm   = 'pal';

###################################################################################
# Weitere benutzerspezifische Einstellungen (vom Benutzer anzupassen)
#
# TODO: Auslagern in Konfigurationsdatei, Einstellungsmöglichkeit über Dialog
###################################################################################
#my $pfad  = "/data/video";
my $pfad  = "/home/freevo/Documents/Video/misc";
#my $scale = '384:288';
my $scale = '768:576';

#############################################################
# Vorbelegung globaler Variablen (hier Parameter)
#############################################################
my $interactive = "";
my $sender      = "";
my $start       = "";
my $dauer       = "";
my $cron        = "";
my $farbe       = "";
my $film        = "";

my $minuten     = 0;
my $bitrate     = 0;

sub set_sender  {
 # Abfrage des gewünschten Senders und Einstellung desselben.
 # test: Aufruf zu einer Prüfung, Shell-Befehl
 # -eq: "equal" = "ist gleich", Shell-Befehl zum Vergleich zweier Zahlen
 # z.B. arte "Arte" bedeutet: in .xawtv ist "arte" eingestellt, im Menü
 # wird "Arte" angezeigt.
 if ( ! ($sender) )
 {
     $sender = `kdialog --title \"Senderauswahl\" --menu \"Welcher Sender soll eingestellt werden?\" ARD "ARD" ZDF "ZDF" RTL "RTL" SAT1 "SAT1" Pro7 "ProSieben" Kabel1 "Kabel 1" RTL2 "RTL2" VOX "VOX" arte "Arte" SuperRTL "SuperRTL" KIKA "KiKa" NDR "NDR" WDR "WDR" BR "BR" mdr "MDR" 3sat "3 Sat" VIVA "VIVA" MTV "MTV" Phoenix "Phoenix" EuroSport "EuroSport" DSF "DSF" MTV2 "MTV2" N24 "N24" CNN "CNN" 9Live "9Live" Tele5 "Tele5" HH1 "HH1" NBC "NBC" TV5 "TV5" TRTInt Onyx "Onyx" EuroNews "EuroNews" n-tv "N-TV" "TRT Int" HSE24 "HSE24\"`;
  }
  return $sender;
}

sub set_film
{
  #
  # Abfrage des Dateinamens und des Pfads
  #
  ### TODO: hier den Pfad mit auswählen
  ###       mit optionaler Vorbelegung
  ###       dazu kde-Fileselector erzeugen
  ###       hinweisen, dass der Dateiname noch um
  ### Datum, Uhrzeit und Sender erweitert werden wird.
  if ( ! ($film) )
  {
     $film=`kdialog --title "Dateiname" --inputbox "Vorläufiger Dateiname (ohne Dateiendung)"`;
  }
  return $film;
}

sub set_start
{
  #
  # Abfrage der Startzeit
  #
  if ( ! ($start) )
  {
     $start=`kdialog --title "Startzeit" --inputbox "Bitte Startzeit eingeben (Format hh:mm)"`;
  }
  return $start;
}

sub set_dauer
{
  #
  # Abfrage der Aufnahmedauer
  #
  if ( ! ($dauer) )
  {
     $dauer=`kdialog --title "Dauer der Aufnahme" --inputbox "Aufnahmedauer? (Format hh:mm)"`;
  }
  return $dauer;
}

sub set_farbe
{
  #
  # Abfrage nach Schwarz-Weiss-Aufnahme
  #
  if ( ! ($farbe) )
  {
     $farbe=`kdialog --title "Schwarz-Weiss?" --menu "Soll in Schwarz-Weiss aufgenommen werden?" "" Farbe "gray" SW`;
  }
  return $farbe;
}



sub realyNow
{
  if ( ! ($interactive) )
  {
     return;
  }
  #
  # Ausgabe der eingestellten Daten, letzte Abbruchmöglichkeit
  #
  `kdialog --title "Filmdaten" --yesno "Es wird aufgenommen\n\
----------------------------------------------------------------------------------------------------------------\n\
 Dateiname:     $pfad/$(filmname)_$(start)-$(sender).avi\n\
 Sender:        $sender\n Beginn der Aufnahme: $start Uhr\n\
 Aufnahmedauer: $minuten min\n\
 Bitrate:       $bitrate kBit/s\n\\
----------------------------------------------------------------------------------------------------------------\n\
 OK?"`;
  #
  # Weiteres Vorgehen
  # Ja gibt $? = 0
  # Nein gibt $? = 1
  #
  if ( $? == 1 )
  {
     exit 0;
  }
}



sub recordMovie
{
  $sender = set_sender ();
  $start  = set_start ();
  $dauer  = set_dauer ();
  $farbe  = set_farbe ();
  $film   = set_film ();

  #
  # Übergabe des zusammengestellten Aufnahmebefehls an at,
  # um einen einzelnen Film aufzunehmen
  #
  exec ("echo \"tv record r -s=$sender -l=dauer -c=$farbe -f=$film \" | at $start");
  exit 0;
}

sub recordSerial
{
  ### TODO: Wenn Zeitvorgabe schon vorliegt, gleich in Crontab eintragen
  $sender = set_sender();
  $dauer  = set_dauer();
  $farbe  = set_farbe();
  $film   = set_film();

  #
  # Aufruf kcron mit dem zusammengestellten Aufnahmebefehl,
  # um eine Serienaufzuzeichnung einzustellen
  #
  my @crontab = `crontab -l |grep -v \#`;
  push (@crontab, "$cron $0 -record -sender=$sender -dauer=dauer -farbe=$farbe -film=$film \n");
  system ("echo @crontab | crontab - ");
  exec ("kcron");
  exit 0;
}



sub record
{
   $sender = set_sender();
   $dauer  = set_dauer();
   $farbe  = set_farbe();
   $film   = set_film();

   #
   # Umrechnung der Aufnahmedauer in Minuten
   # FS: "Field Separator" = "Feldtrennzeichen" für awk
   #
   my $minuten=`echo $dauer | awk 'BEGIN { FS= ":" } { print ( $1 * 60 ) + $2}'`;

   #
   # Festlegung der Bitrate: Unter 120 Minuten Filmdauer stets 2000 kByte/s, darüber Anpassung an max. 2 GB Dateigröße
   # lt: "less than" = "kleiner als", Shell-Befehl zum Vergleich zweier Zahlen
   # scale: Festlegung der Nachkommastellen der bc-Berechnung, hier: keine ("0"), sonst Fehlermeldung von mencoder
   #
   if ( $minuten lt 120 )
   {
      $bitrate = 2000;
   }   else  {
      $bitrate = `echo "scale=0;(1995-0.9375*$minuten)*8192/(60*$minuten)"|bc)`;
   }

   exit 0 unless (realyNow());
   #
   # Start der zeitprogrammierten Filmaufnahme
   #
   system ("v4lctl setstation $sender" ) || die "Konnte Sender $sender nicht einstellen; $!\n";
#    sudo nice -n-17 mencoder tv:// \
   exec ("mencoder tv:// \
        -tv driver=$driver:norm=$norm:fps=25:outfmt=yuy2:quality=0:input=0:width=768:height=576 \
        -ovc lavc \
        -lavcopts vcodec=mpeg4:vbitrate=$bitrate:$farbe:keyint=25 \
        -oac mp3lame \
        -lameopts cbr:br=128:mode=0 \
        -endpos $dauer:00 \
        -vf pp=hb/vb/dr/al/lb,denoise3d,scale=$scale \
        -o $pfad/$film-$(date +%Y-%m-%d)_$start-$sender.avi" );
}


sub play
{
    $sender = set_sender();

#TODO?   farbe=set_farbe();
#TODO?   film=set_film();

#   system ( "v4lctl setstation $sender" ) || die "Konnte Sender $sender nicht einstellen; $! \n";
   system ( "v4lctl setstation $sender" );
   exec ("mplayer -fs tv:// -tv driver=$driver:norm=$norm:outfmt=yuy2:quality=0:width=1280:height=1024:fps=25 -vo xv  -v 3");
}


sub usage
{
   print "\n";
   print "Usage: tv -OPCODE [-i] [args]\n";
   print "\n";
   print "Aufruf zum Fernsehen ist\n";
   print "        tv -play -sender sender -dauer dauer -c farbe\n";
   print "\n";
   print "Aufruf zum sofort Aufnehmen ist\n";
   print "        tv -record [-i] -sender sender -dauer dauer -farbe farbe -film film\n";
   print "\n";
   print "Aufruf zum zeitgesteuerten Aufnehmen eines Films ist\n";
   print "        tv -recordAt [-i] -sender sender -t start -dauer dauer -farbe farbe -film film\n";
   print "\n";
   print "Aufruf zum zeitgesteuerten Aufnehmen einer Serie ist\n";
   print "        tv -recordSerial -sender sender -t start -dauer dauer -farbe farbe -film film\n";
   print "\n";
   print "Fehlende Argumente werden ggf. erfragt.\n";
   print "Mit -i kann man ggf. die Ausführung der Aufnahme abbrechen.\n";
   print "\n"
}



#############################################################
# Auswertung der Parameter und Argumente
#############################################################

use Getopt::Long;
GetOptions ('interactive'  => \$interactive,
            'sender'       => \$sender,
            'start'        => \$start,
            'dauer'        => \$dauer,
            'cron'         => \$cron,
            'farbe'        => \$farbe,
            'film=s'       => \$film,
            'pfad=s'       => \$pfad,
            'help'         => sub { usage () },
            'play'         => sub { play () },
            'record'       => sub { record () },
            'recordAt'     => sub { recordAt () },
            'recordSerial' => sub { recordSerial () }
);
usage ();
exit 2;

__END__

=head1 NAME

tv_perl - simple tv recording app

=head1 SYNOPSIS

 tv -play         -sender SENDER -dauer DAUER in HH:MM
 tv -record       -sender SENDER -dauer DAUER in HH:MM -film FILMTITEL
 tv -recordAt     -sender SENDER -dauer DAUER in HH:MM -film FILMTITEL -start STARTZEIT in HH:MM
 tv -recordSerial -sender SENDER -dauer DAUER in HH:MM -film FILMTITEL -start STARTZEIT in HH:MM -cron ZEITANGABE im Crontabformat

=head1 DESCRIPTION

 long description of your program

=head1 SEE ALSO

 need to know things before somebody uses your program

=head1 AUTHOR

 Andreas Silberstorff

=cut
8)
 

mca

Hacker
moin taki und bussen,
es geht tatsächlich 8) ich musste im gamix die vier kanäle bei "CD" öffnen, was vielleicht daran liegt, dass mein soundkabel von der tv-karte in der buchse steckt, wo man wohl normalerweise sein cd-rom anschliesst (da waren halt zwei plätze). so klappts jedenfalls mit der video- und ton-aufnahme. vielen dank.
jetzt ist da nur noch ein ding, was ich nicht so hinkriege: die farbe des bildes ist immer ziemlich schwach. hier ein beweis-schnappschuss:
mencoder-papst.png

zum fernsehen muss ich immer erstmal die farbe (in xawtv) oder die farbsättigung (in tvtime) einstellen. welche parameter muss ich an mencoder übergeben, um die farbsättigung zu erhöhen? und vielleicht @taki: wo muss ich was im script ändern?
-das ziel ist nahe-
 
OP
taki

taki

Advanced Hacker
hassan schrieb:
zum fernsehen muss ich immer erstmal die farbe (in xawtv) oder die farbsättigung (in tvtime) einstellen. welche parameter muss ich an mencoder übergeben, um die farbsättigung zu erhöhen?

Hier muss ich erst mal passen. Die Optionen für mencoder finden sich in der Manpage von mencoder (man mencoder in Konsole oder man:mencoder in Adressleiste vom Konqueror). Die Manpage erschlägt einen, weil es sehr viele Optionen gibt.

hassan schrieb:
und vielleicht @taki: wo muss ich was im script ändern?
-das ziel ist nahe-

Suche im Script nach mencoder. Dann findest Du das eigentliche Kommando zum Aufnehmen.

Code:
  /usr/bin/mencoder \ 
    -endpos $ENDPOS \ 
    tv\:// \ 
    -tv driver=v4l2:\ 
norm=pal:width=720:height=576:fps=25:outfmt=yuy2:quality=0:\ 
immediatemode=1:audiorate=32000:forceaudio:alsa:amode=3:\ 
freq=$FRQ \ 
    -ovc lavc \ 
    -lavcopts vcodec=mpeg4:aspect=4.0/3.0:vhq:vbitrate=1800 \ 
    -vf lavcdeint \ 
    -oac mp3lame \ 
    -lameopts fast:preset=standard \ 
    -mc 10 \ 
    -o $FILE \ 
  ;

Der Aufruf gehört eigentlich in eine einzige Zeile. Mit dem \ am Zeilenende ist selbiges maskiert, damit das noch einigermaßen lesbar bleibt. Parameter hinter den Optionen müssen ohne Leerzeichen zusammen stehen und werden durch den Doppelpunkt getrennt.


Ein Sinn dieses Threads soll auch sein, möglichst viele funktionierende Einstellungen zu sammeln und im endgültigen Script mehrere mögliche Einstellungen als möglichst anwenderfreundliche Profile anbieten zu können.

Also brauchbare Einstellungen bitte posten, am besten mit Kommentar, insbesondere Angaben zur verwendeten Hardware (TV-Karte, Soundkarte und Grafikkarte). So wissen andere dann später, ob schon für sie brauchbare Einstellungen vorhanden sind.

Die Einstellungen im ursprünglichen Script sind übrigens mit folgender Kombination getestet:

  • Medion TV-Karte mit saa7134, On Board Sound i870, ATI 9700 (Aldi-PC von März 2003)
 

mca

Hacker
ok, ich habs gelöst. die man-pages hams gebracht. bestes bild beim mplayer bekomme ich mit einem +10 erhöhtem kontrast und einer bilschärfe von 32bit. die farbsättigung (saturation) muss man beim v4l2-treiber vornehmen. so sehen die mplayer- und mencoder-funktionen jetzt bei mir aus:
mplayer \
-bpp 32 \
-contrast 10 \
-fs \
tv\:// \
-tv driver=v4l2:norm=pal:saturation=100:width=1280:height=1024:fps=25:eek:utfmt=yuy2:quality=0:freq=$FRQ \
-vo xv \
-v 3;
=========================================
/usr/bin/mencoder \
-endpos $ENDPOS \
tv\:// \
-tv driver=v4l2:\
norm=pal:saturation=100:width=720:height=576:fps=25:eek:utfmt=yuy2:quality=0:\
...
zusammen mit meinen senderfrequenzen klappt das script jetzt 1a, kanns nur weiterempfehlen. eine stunde tv aufnehmen werden zu einer etwa 800mb grossen divx, sehr nett
:D
ach ja, getestet mit der tv-karte leadtek winfast2000 xp (bt878) und suse 9.2
 
OP
taki

taki

Advanced Hacker
Hi.
Habe am Script inzwischen etwas weitergebastelt und will mal den Zwischenstand durchgeben. Das Script selbst will ich aber erst wieder posten, wenn die Grundfunktionen vollständig funktionieren.

Was sich bisher getan hat
Mit dem Script habe ich erst mal beide oben geposteten Scripte erfolgreich verheiratet.

Es kann sowohl interaktiv verwendet werden (wie das Script von migo) als auch per Parameterübergabe, womit es für at oder crontab zur zeitgesteuerten Aufnahme taugt. Interaktiv ist das Script, wenn man benötigte Parameter weglässt. Das Abfragefenster, welches die Einstellungen anzeigt und eine letzte Möglichkeit zum Abbrechen bietet, schaltet man mit dem Schalter -i ein.

Den Kanal ermittelt es wie migos Script mit v4lcfg aus der Kanalliste von xawtv. Die Auswahlliste der Sender ist nicht mehr im Script kodiert (wie es bei mogo und mir war), sondern wird aus der Konfigurationsdatei von xawtv ausgelesen (wenn vorhanden aus $HOME/.xawtvrc, sonst aus /etc/X11/xawtvrc).

Den Dialog zum Erfragen, ob die Aufnahme farbig oder schwarz-weiss sein soll, habe ich aber rausgelassen. Das fand ich zwar interessant, aber bei jeder Aufnahme nach einem Feature gefragt zu werden, welches man sehr selten benötigt, fand ich nicht so genial. Wenn man Schwarz-Weiss-Aufnahme wünscht, kann man das beim Aufruf mit dem Schalter -grey einschalten.

Es gibt eine Wiedergabefunktion (Aufruf mit -play), mit der man testen kann, ob die Kanalliste funktioniert (öffnet MPlayer mit dem Fernsehprogramm im Vollbildmodus).

Die Bitrate wird wie im Script von mogo berechnet, so dass keine Filme > 2G entstehen.

Die sofortige Aufnahme eines Filmes (Aufruf mit -record) beherscht es wie das Script von mogo.

Die Aufnahme eines Filmes zu einer bestimmten Zeit (Aufruf mit -recordMovie) beherscht es wie das Script von mogo, wobei es dazu einen Aufruf auf sich selbst an at übergibt.

Was noch fehlt ehe ich das Script poste:
  1. Ich schaffe es noch nicht einzurichten, dass sich das Script selbst in die crontab einträgt.
  2. Das Script braucht noch eine gute Hilfsfunktion
    noch als mögliche Einstellung im Profil
  3. Option, um wie bei mogos Script dem mencoder-Aufruf mit sudo und nice eine höhere Priorität zu geben (nach der Aufnahme sollten aber dann noch die Rechte an der erzeugten Filmdatei an den Aufrufer zurückgegeben werden, sonst gehört die Datei root)
  4. Hassans Einstellungen zur Farb- und Kontrastkorrektur fehlen

Apropos Profil: Profile sind in der nächsten Version noch fest im Script eingetragen. Sie sind leicht zu finden und werden durch Ändern der Kommentarzeichen aktiviert. In einer späteren Version sollen Profile in Dateien ausgelagert werden, die man nachladen können soll. Wer ein funktionierendes Profil für bestimmte Zwecke erstellt, braucht dann nur das Profil zu posten, um es anderen zur Verfügung zu stellen.

Leider werde ich voraussichtlich frühestens morgen abend dazu kommen, weiterzubasteln. Ich melde mich dann wieder hier.
Gruß,
Taki
 

marcor

Member
Hi ihr Multimedia-Cracks,

Das Script klappt bei mir auch wunderbar :lol:

Habe mir gestern CSI auf VOX aufgenommen.

Jetzt habe ich noch ein Problem: Ich würde den fertigen Film gerne mit Broadcast oder MainActor oder ??? bearbeiten um die Werbepausen raus zu schneiden. Dazu muss der Film allerdings in mpeg umgewandet werden :(

Jetzt meine Frage: Wie wandel ich den Film xxx.avi in xxx.mpg um, und das ganze OHNE viel Qualitätsverlust?

Oder noch besser: Kann ich auch mit Mencoder direkt mpg aufnehmen, und wenn ja wie?

Achso, wenn es wichtig ist, mein System: Suse 9.2, KDE 3.3.2 Level "a", Hauppauge WinTV.


Viele Grüße
 
OP
taki

taki

Advanced Hacker
marcor schrieb:
Hi ihr Multimedia-Cracks,

Danke für nicht (s.u.) gebührende Lorbeeren :)


marcor schrieb:
Das Script klappt bei mir auch wunderbar :lol:

Das freut mich sehr.


marcor schrieb:
Ich würde den fertigen Film gerne mit Broadcast oder MainActor oder ??? bearbeiten um die Werbepausen raus zu schneiden. Dazu muss der Film allerdings in mpeg umgewandet werden :(

Auch mein wunder Punkt! Ich habe bisher keine einzige brauchbare Lösung gefunden, um Werbung herauszuschneiden. Die AVIs, die mit meinen Einstellungen erzeugt werden, können u.a. mit kmenc15 geschnitten werden. Dabei kann man allerdings nur Teile herausschneiden. Man hat dann bei einem Film mit Werbepausen mehrere Dateien. Ausserdem entstehen nach dem Schnitt oft Artefakte am Anfang. Mit denen kann ich leben, sind i.d.R. nur ganz kurz zu sehen. Aber man hätte doch gerne den Film hinterher in einer einzigen Datei.

Mit mainactor habe ich bisher keine guten Erfahrungen gemacht. Kann aber durchaus sein, dass ich nur nicht hinbekommen habe, MPEGs zu erzeugen, die das Programm korrekt verarbeiten kann.


marcor schrieb:
Kann ich auch mit Mencoder direkt mpg aufnehmen, und wenn ja wie?

Ja, das geht. Das Problem bleibt aber, dass man beim Erzeugen einer MPEG-Datei wohl mehr falsch machen kann als man glauben mag (s.o.).


marcor schrieb:
Wie wandel ich den Film xxx.avi in xxx.mpg um, und das ganze OHNE viel Qualitätsverlust?

Grundsätzlich geht das mit mencoder (auch mit dem hervorragenden Frontend kmenc15). Aber das oben genannte Problem besteht hier genauso.


Ich bin leider kein crack, programmiere aber gern. Weil ich kein Crack bin, aber gerne eine einfache und doch flexible Aufnahmemöglichkeit hätte, deren Einrichtung nicht zu schwierig ist, habe ich den Thread hier ins Leben gerufen.

Meine Parameter habe ich mit viel Lesen (insbesondere immer wieder 'man mencoder') und ausprobieren herausgefunden. Andere haben auf dem gleichen Weg andere Einstellungen gefunden, die bei ihrer Hardware oder ihren Vorlieben die für sie besten Ergebnisse erziehlen. Ich würde hier gerne viele funktionierende Ergebnisse sehen, aus denen man Profile für das Script machen könnte, so dass jeder auf die Erfahrungen anderer zurückgreifen kann, um schnell zu guten Ergebnissen zu kommen.

Solltest Du es hinbekommen, brauchbare Einstellungen zu finden, die ein mit mainactor und Co. weiterverarbeitbares MPEG erzeugen, poste es hier und ich werde diese Einstellungen als Profil für das Script vorsehen. Man könnte dann auch gleich den Aufruf des passenden Videoeditors im Script vorsehen... Ich schieße schon wieder übers Ziel hinaus :eek:
Gruß,
Taki
 

marcor

Member
Solltest Du es hinbekommen, brauchbare Einstellungen zu finden, die ein mit mainactor und Co. weiterverarbeitbares MPEG erzeugen, poste es hier und ich werde diese Einstellungen als Profil für das Script vorsehen. Man könnte dann auch gleich den Aufruf des passenden Videoeditors im Script vorsehen... Ich schieße schon wieder übers Ziel hinaus :eek:
Gruß,
Taki

Dann werde ich jetzt auch mal viel lesen und googlen (Obwohl ich bei Google auch nix gefunden habe, muss da den/die Suchbegriffe mal abändern).

Wenn ich was brauchbares finde poste ich das hier.

Eine "Verbesserung" hab ich in das Script noch rein gebracht:
Da mir das auf den Nerv geht, dass ich den Ton beim Aufnehmen höre, hab ich das Script (letzter Teil) umgearbeitet:

Code:
if [ $? = 0 ]
then
at $start <<EOF
v4lctl setstation $sender
amixer set Master 0

sudo nice -n-17 mencoder tv:// -tv driver=v4l2:norm=pal:width=720:height=576:fps=25:outfmt=yuy2:quality=0:immediatemode=1:audiorate=32000:forceaudio:alsa:amode=3 \
-ovc lavc \
-lavcopts vcodec=mpeg4:aspect=4.0/3.0:vhq:vbitrate=1800 -vf lavcdeint \
-oac mp3lame \
-lameopts fast:preset=standard \
-endpos $dauer:00 -mc 10 \
-vf pp=hb/vb/dr/al/lb,denoise3d,scale=384:288 \
-o /home/mrk/$filmname-`date +%Y-%m-%d_`$start-$sender.avi

amixer set Master 26
EOF
fi

Durch den Aufruf von amixer wird der Master-Volume auf 0 gesetzt und wenn der Film aufgenommen ist wieder auf 26

Viele Grüße
 
Oben