ubuntuusers.de

Skripte/TV-Skript

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |
Dieses Thema ist die Diskussion des Artikels Skripte/TV-Skript.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

auch du darfst den Artikel korrigieren. ☺

Gruß, noisefloor

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11335

Wohnort: Bremen

Hi!

habe jetzt noch ein wenig an dem Skript herumgebastelt, sodass ich jetzt eine Version hinbekommen habe, die die Aufnahme über MPlayer als .TS-Datei abspeichert.

Damit kommt es nicht mehr (wie anscheinend bei etlichen TV-Karten der Fall) zu asynchronem Ton.

Hier die derzeitige Version:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
## Author stw0815; revised by Heinrich Schwietering
## http://forum.ubuntuusers.de/topic/70377/; http://forum.ubuntuusers.de/topic/155644
MCD=/usr/bin/mplayer
zenity --help > /dev/null || { echo "Fehler: Du benötigst \"zenity\" um dieses Script nutzen zu können." && exit 1 ; }
test -e $MCD || { zenity --error --text "Fehler: Du benötigst \"MPlayer\" um dieses Script nutzen zu können." && exit 1 ; }
test ! -e ~/.mplayer/channels.conf && zenity --error --text "~/.mplayer/channels.conf wurde nicht gefunden" && exit 1
SENDER=`cat ~/.mplayer/channels.conf | cut -d ":" -f 1 | zenity --list --title "Bitte Sender auswählen" --column "Sender:"` || exit 0
test "$SENDER" || { zenity --error --text "Es wurde kein Sender ausgewählt." && exit 1 ; }
DAY=`zenity --calendar --title "Aufnahmedatum" --text "Bitte das Datum der Aufnahme festlegen"` || exit 0
TIME=`zenity --entry --title "Aufnahmestart (HH.MM)" --text "Bitte den Startzeitpunkt der Aufnahme festlegen" --entry-text "$(date --date="30 seconds" +%H.%M)"` || exit 0
END=`zenity --entry --title="Endzeit" --entry-text="24:00" --text="Endzeit im Format HH:MM eingeben."`
FILE=`zenity --file-selection --save --confirm-overwrite --title "Name und Ort zum Speichern auswählen" --filename=/home/heinrich/Videos/"$SENDER"-"$DAY"-"$TIME"-"$END".TS` || exit 0
REC="dvb://\"$SENDER\" -dumpstream -dumpfile \"$FILE\""
echo "$MCD $REC" | at $TIME $DAY &> /tmp/recerror
echo "killall $MCD" | at $END &> /tmp/recerror
test $? -gt 0 && zenity --error --text "$(cat /tmp/recerror)" && rm /tmp/recerror && exit 1
zenity --info --text "Sender: $SENDER\nBegin: $DAY, $TIME Uhr\nEnde: $END Uhr, Dateiname: $FILE\n\nStatus: OK\n$(cat /tmp/recerror)"
test -e /tmp/recerror && rm /tmp/recerror

Auch hier gilt: Der Speicherort kann bei Filename natürlich den eigenen Bedürfnissen angepasst werden; die Startzeit für die "Sofort-Aufnahme" habe ich um 30 Sekunden verzögert, damit genügend Zeit bleibt, das Ende anzugeben - sonst kommt es ggf. zu Meldungen, dass cron-Jobs in der Vergangenheit nicht angenommen werden können, oder die Ausführung des Jobs wird gleich auf den nächsten Tag verschoben... Vielleicht geht das aber noch etwas eleganter?

Leider ist "zeitversetztes" Fernsehen mit MPlayer nicht (oder nur solange die Aufnahme noch läuft) möglich,spätestens mit dem Ausführen des "killall $MCD"-Befehls ist erstmal Schluss. Ich habe es nicht hinbekommen, die Routine mit der Dauer der Aufnahme wie im "Original"-Skript zu regeln; ggf. geht das nur mit Mencoder (da bin ich noch nicht firm drin...Weiß jemand, wie auch mit Mplayer hinhauen könnte?). Das führt auch dazu, dass jetzt zwei "jobs" pro Aufnahme in der atq-Ausgabe auftauchen; der erste für den Aufnahme-Start, der zweite für den Zeitpunkt der "killall-$MCD"-Befehls. Auch die Berechnung der Anzahl der Frames fällt flach, aber das ist vielleicht zu verschmerzen.

Wenn man z.B. gxine oder Kaffeine verwenden, kann man die entstehende Datei gleichzeitig "zeitversetzt" anschauen; leider hab' ich aber immer wieder Probleme mit xine-basierten Anwendungen. VLC erkennt leider das Format nicht (oder ich bin noch nicht dahinter, wie das funktioniert - jedenfalls werden die .TS-Dateien zwar aufgerufen, aber nicht abgespielt; Totem kann das Format - trotz extra installiertem MPEG2-Demuxer-plugin auch nicht erkennen.)

Ich weiß nicht, was passiert, wenn der Endpunkt für frühmorgens am nächsten Tag angegeben wird, werde das bei Zeiten mal austesten. Aber immerhin verschwindet der Bild-Ton-Zeit-Versatz ohne das Ganze weiterverarbeiten zu müssen, und die Bedienung ist etwas komfortabler als mit der im Artikel bisher aufgeführten Alternative.

Ich verlinke das Skript erstmal bei der Alternative; ggf. kann es aber auch in den Artikel selbst aufgenommen werden.

Rückmeldungen, Tests, Verbesserungsvorschläge etc. herzlich willkommen!

so long
hank

EDIT: Es funktioniert auch, die Aufnahme erst am "nächsten Tag" enden zu lassen; hab's gerade noch ausprobiert!

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11335

Wohnort: Bremen

Hi!

Habe noch etwas weiter gebastelt: Jetzt fragt das Skript explizit das Datum des Aufnahmeendes ab, denn sonst klappt zwar eine Aufnahme, die in den nächsten Tag reicht, aber eine zeitgesteuerte Aufnahme, die für späteren Zeitpunkt angegeben wird, würde mit der vorherigen Version nicht beendet werden: Der killall $MCD-Befehl würde am Tag der Eingabe zur angegebenen Uhrzeit ausgeführt werden, und nicht am Tag der Aufnahme (oder dem darauffolgenden, falls die Aufnahme über Mitternacht hinausgehen soll).

Im letzten Info-Fenster werden jetzt sowohl Zeitpunkt des Aufnahme-Starts als auch des Endes mit jeweils dazugehöriger jobnr. ausgegeben; ich habe noch einen Hinweis auf die Überprüfbarkeit mit atq und den Befehl atrm zum Löschen mit eingebaut. Wie mann allerdings die immer angezeigte Warnung wegbekommt, dass "/bin/sh" verwendet wird, hab' ich noch nicht raus (wenn ich im Skript statt #!/bin/bash dann #!/bin/sh verwende, verschwindet zwar die Warnung, aber die Jobs werden auch nicht mehr angezeigt...)

Um "Timeshift" mit Mplayer hinzubekommen, hab' ich einen kleinen Trick verwendet: Das Skript verwendet jetzt eine "Kopie" von MPlayer; es ruft /usr/bin/tvmplayer auf. Dieses Programm muss natürlich erst erstellt werden, indem man /usr/bin/mplayer kopiert und als /usr/bin/tvmplayer wieder abspeichert... Damit wird bei Beenden der Aufnahme nicht MPlayer gekillt, sondern nur tvmplayer, und MPlayer kann ungestört weiter laufen - noch komfortabler ist zur Wiedergabe der SMPlayer, der "merkt" sich nämlich auch noch, wo man ggf. stoppt, und fängt bei Neustart an der Stelle wieder an, wo man aufgehört hat zu schauen (greift allerdings auch auf /usr/bin/mplayer zurück, deshalb auch da der "Umweg" mit dem tvmplayer).

Die Dateien werden standardmäßig in /home/"user"/Videos/ abgelegt; das kann natürlich auch angepasst werden; gleich in der 5. Zeile das gewünschte Verzeichnis angeben.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
## Author stw0815; revised by Heinrich Schwietering
## http://forum.ubuntuusers.de/topic/70377/; http://forum.ubuntuusers.de/topic/155644
MCD=/usr/bin/tvmplayer
USER=~/Videos
zenity --help > /dev/null || { echo "Fehler: Du benötigst \"zenity\" um dieses Script nutzen zu können." && exit 1 ; }
test -e $MCD || { zenity --error --text "Fehler: Du benötigst \"tvmplayer\" um dieses Script nutzen zu können. Dazu ggf. erst mplayer installieren, dann mit root-Rechten die Datei /usr/bin/mplayer kopieren und als /usr/bin/tvmplayer abspeichern" && exit 1 ; }
test ! -e ~/.mplayer/channels.conf && zenity --error --text "~/.mplayer/channels.conf wurde nicht gefunden" && exit 1
SENDER=`cat ~/.mplayer/channels.conf | cut -d ":" -f 1 | zenity --list --title "Bitte Sender auswählen" --column "Sender:"` || exit 0
test "$SENDER" || { zenity --error --text "Es wurde kein Sender ausgewählt." && exit 1 ; }
DAY=`zenity --calendar --title "Aufnahmedatum" --text "Bitte das Datum der Aufnahme festlegen"` || exit 0
TIME=`zenity --entry --title "Aufnahmestart (HH.MM)" --text "Bitte den Startzeitpunkt der Aufnahme festlegen" --entry-text "$(date --date="30 seconds" +%H.%M)"` || exit 0
END=`zenity --entry --title="Endzeit" --entry-text="20.00" --text="Endzeit im Format HH.MM eingeben."`
DAY2=`zenity --calendar --title "Ende der Aufnahme" --text "Wichtig: Bitte den Folgetag angeben, falls die Aufnahmezeit über Mitternacht hinaus geht"` || exit 0
FILE=`zenity --file-selection --save --confirm-overwrite --title "Name und Ort zum Speichern auswählen" --filename=/"$USER"/"$SENDER"-"$DAY"-"$TIME"-"$END".TS` || exit 0
REC="dvb://\"$SENDER\" -dumpstream -dumpfile \"$FILE\""
echo "$MCD $REC" | at $TIME $DAY &> /tmp/recerror
test $? -gt 0 && zenity --error --text "$(cat /tmp/recerror)" && rm /tmp/recerror && exit 1
echo "killall $MCD" | at $END $DAY2 &> /tmp/recerror1
test $? -gt 0 && zenity --error --text "$(cat /tmp/recerror1)" && rm /tmp/recerror1 && exit 1
zenity --info --text "Sender: $SENDER\nBegin: $DAY, $TIME Uhr\nEnde: $DAY2, $END Uhr, Dateiname: $FILE\n\nStatus: OK\n$(cat /tmp/recerror)\n$(cat /tmp/recerror1)\n\nTermin mit \"atq\" im Terminal überprüfbar;\nmit \"atrm 'jobnr'\" löschbar!"
test -e /tmp/recerror && rm /tmp/recerror
test -e /tmp/recerror1 && rm /tmp/recerror1

Schön wäre natürlich, wenn für die zeitgesteuerte Aufnahme auch für spätere Tage gleich der "richtige" Kalendereintrag verwendet würde, damit könnte die Abfrage des Aufnahme-Ende-Datums wegfallen; vielleicht finde ich ja auch noch irgendwie heraus, ob und wie das geht...

so long
hank

20100801

Anmeldungsdatum:
3. Januar 2007

Beiträge: 1050

Mal naiv gefragt...Kann man die Kennung (Screenshot) nicht auslesen und somit mehrere Instanzen laufen lassen und unterschiedlich beenden?

Bilder

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11335

Wohnort: Bremen

Hi!

Keine Ahnung... theoretisch vielleicht schon, und dann könnte der "kill"-Befehl sich nur auf die ensprechende Instanz beziehen, darauf willst du hinaus, oder? Eine Instanz zum Aufnehmen, eine zum Anschauen, deswegen ja der Umweg über "verschiedene" Player.

Aber wie das geht, da bin ich zumindest überfragt... (das Skript hab' ich auch nur "übernommen", und im "Try-and-error"-Verfahren an meine Bedürfnisse angepasst...)

so long
hank

20100801

Anmeldungsdatum:
3. Januar 2007

Beiträge: 1050

darauf willst du hinaus, oder?

Ja!

Ich werde mich auch mal schlau machen, das werden wir schon raus bekommen, wie das funktioniert,.. wenn es denn funktioniert. ☺

20100801

Anmeldungsdatum:
3. Januar 2007

Beiträge: 1050

Habe schon mal was gefunden

Schau mal hier

8.5.1 Einen Prozess killen/beenden

Verwenden Sie kill zum Killen eines Prozesses mittels der Prozess-ID-Nummer

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11335

Wohnort: Bremen

Hi!

Naja, soweit wär ich wohl auch schon... Nur wie bringe ich dem Skript bei, die Prozess-ID des "richtigen" Mplayers auszulesen? Ihn dann per "kill pid xxxx" zu beenden zu lassen, dürfte weniger schwierig sein 😉

so long
hank

20100801

Anmeldungsdatum:
3. Januar 2007

Beiträge: 1050

Naja, soweit wär ich wohl auch schon...

Na toll und ich suche das halbe Web ab ☺

Nur wie bringe ich dem Skript bei, die Prozess-ID des "richtigen" Mplayers auszulesen?

Wenn es irgendwo beschrieben steht, dann werden wir es auch finden.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Nur wie bringe ich dem Skript bei, die Prozess-ID des "richtigen" Mplayers auszulesen?

Das dürfte sehr sehr schwierig sein - denke ich.

Beim Suchen sollte ihr IMHO etwas abstrakter vorgehen - es soll ein einzelnes Fenster (=Instanz eines Progs mit eigener ID) beendet werden, richtig? Dabei ist es ja egal, ob es der MPlayer, der Firefox oder sonst wer ist.

Manuell sollte es gehen. In dem man jedes Mal, wenn man eine neue Instanz startet z.B. via pstree -p nachschaut, welche PID dazu gekommen ist. Ist aber nicht sehr komfortabel.

Gruß, noisefloor

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11335

Wohnort: Bremen

Hi!

Ja, deswegen hab' ich ja auch den weg über den "fake"-mplayer gewählt; da brauch ich keine extra pid, killall reicht 😉

Aber theoretisch müsste es ja möglich sein, beim Start der Aufnahme gleich die Prozessnr. des Players mit abzugreifen, um ihn dann im Kill-Befehl zu verwenden (naja, theoretisch, nur wie in der Praxis umsetzen? Direkt ins script eine pid-Abfrage mit einbauen, und den höchsten Wert der auftaucht, speichert... geht aber nur, wenn das tatsächlich die höchste pid-Nr wäre...)

Der Weg über pstree -p ist wirklich recht unübersichtlich, und schon gar nicht "automatisierbar"...

so long
hank

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

da war doch was... → Shell/Prozesssteuerung. Könnte mit dem Befehl jobs gehen.

Gruß, noisefloor

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11335

Wohnort: Bremen

Hi!

Ja, hab' ich eben auch ausprobiert, aber bei laufender Aufnahme wird mir der Job nicht angezeigt, warum auch immer...- ansonsten wär' das ein Ansatz.

so long
hank

EDIT Alternative:

ps aux | grep tvmplayer
heinrich 14575  0.7  0.6  51124  6728 ?        SN   19:51   0:01 /usr/bin/tvmplayer dvb://DasErste -dumpstream -dumpfile //home/heinrich/Videos/DasErste-05.05.2009-19.51-19.57.TS
heinrich 14590  0.0  0.0   3344   808 pts/7    S+   19:54   0:00 grep tvmplayer

Nur hab' ich damit ggf. bei zwei tvmplayern (oder welchem programm auch immer) auch zwei Ausgaben, und je nach dem, welchen ich zuerst gestartet hab, (den abspielenden oder den aufnehmenden) hab ich eine höhere oder niedrigere pid, die ich killen muss, wenn der aufnehmende ausgestellt werden soll. (der zweite Prozess in diesem Beispiel ist die Suche nach dem tvmplayer...)

baumeisterschramm

Anmeldungsdatum:
17. April 2008

Beiträge: 17

Hallo,

es ist zwar schon einige Zeit vergangen, aber ich würde den kill-Befehl nach Ende der Aufnahme einfach durch einen sleep-Befehl anschieben. Damit wäre dann auch das Problem bei Aufnahmen, die über die 00:00 Uhr - Grenze hinweggehen gelöst.

Hier der entsprechende Code-Ausschnitt:

# AUFNAHME STARTEN
while  ! [ -f "$DATA_PATH/$NAME $DATE.ts" ] 
do
	$TVREC dvb://"$SENDER" -dumpstream -dumpfile "$DATA_PATH/$NAME $DATE.ts" &
	$ECHO 'Start der TV-Aufnahme von '$Name''
	$SLEEP 3
done

# AUFNAHME BEENDEN
$SLEEP $DAUER
$KILL $TVREC

Die Dauer muss allerdings in Sekunden angegeben werden (oder man muss min in s umrechnen 😉). Ansonsten @ Heinrich Schwietering: Vielen Dank für das tolle Skript

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11335

Wohnort: Bremen

Hi!

@ baumeisterschramm

Danke für den Hinweis! Die Dauer in Sekunden umzurechnen müsste eigentlich auch "automatisierbar" sein; im "ersten" Skript ist das ganz gut gelöst.

Leider kann ich es momentan nicht umsetzen, da meine TV-Karte letzte Woche den Geist aufgegeben hat, und ich noch keinen Ersatz habe. Aber: Kommt Zeit, kommt Karte, kommt Versuch der Umsetzung...

so long
hank