Name: | comagConvert |
Typ: | bash |
benötigt: | comagMeta, comagTitle (c-Programme, s.u.), projectX, mplex, requant (ggf.) |
Das Script dient dazu, die Comag TS-Dateien in eine mpg Datei umzuwandeln.
Probleme:
Details: Das Script ruft eine Reihe anderer Programme auf, um die TS-Files des Comag-Festplattenrekorders umzubenennen und in eine mpg-Datei umzuwandeln.
Der Aufruf lautet comagConvert rec....
Die Batch-Variante erfordert keine weitere Benutzer-Interaktion und es können mehrere Verzeichnisnamen übergeben werden, z.B. : comagConvertBatch rec*
Der Quellcode zu comagConvert
Der Quellcode zu comagConvertBatch Download / View Source / Run it (depends on file type)
- Ich habe unter den bisher konvertierten Filmen (>100) 2 gehabt, bei denen der Ton nach dem Script fehlte. Ein schrittweises durchführen der einzelnen Schritte zeigte, dass sich die Dateien (video und audio) zwar per mplex zusammen führen ließen, dann aber der Ton weg war. Die Ursache ist mir natürlich unbekannt, da ich die Details nicht verstehe. Ein Workaround besteht darin, die in projectX alle ts-Dateien zu laden, zu schneiden, dann zu demuxen und die entstehenden Dateien dann zusammen zu fügen (mplex). Man sollte also die TS-Files behalten, bis man eine mpg Datei mit Ton hat.
-
Ebenfalls selten gelingt die Konvertierung mit projectX nicht. Dann bietet sich zunächst eine Umwandlung der TS-Dateien
mit ffmpeg an: ffmpeg -i REC.TS -target dvd rec0.mpg, dann die REC.01 ... analog. Die entstehenden mpg Dateien lassen sich
dann mit projectX schneiden, es entstehen die m2v und die Audio-Dateien (ac3 und oder mp2). Die zusammen gehörenden
werden mit mplex verbunden, hier ein Beispiel (bei dem evtl. die mp2 Daten nicht brauchbar waren):
mplex -f 8 -o hairspray1.mpg rec1.m2v rec1.ac3
mplex -f 8 -o hairspray2.mpg rec2.m2v rec2.ac3
mplex -f 8 -o hairspray3.mpg rec3.m2v rec3.ac3
cat hairspray1.mpg hairspray2.mpg hairspray3.mpg > hairspray.mpg
Details: Das Script ruft eine Reihe anderer Programme auf, um die TS-Files des Comag-Festplattenrekorders umzubenennen und in eine mpg-Datei umzuwandeln.
Es existiert eine Version (comagConvert), die eine Benutzer-Interaktion erfordert und eine (comagConvertBatch), welche keine Eingaben entgegen nimmt und somit auf eine Reihe von Verzeichnissen angewandt werden kann.
Benötigte Programme (ich hoffe vollständig:
- projectX: ein Java-Programm, dass zum demultiplexen verwendet wird (ich verwende es auch später zum schneiden) man findet das Nötige beim Autor
- mplex um die von ProjectX erzeugten Dateien wieder zu einer mpg zusammen zu fassen. Ich gehe davon aus, dass jede Distribution ein Paket zur Verfügung stellt.
- comagTitle und comagMeta sind zwei kurze C-Programme, die ich geschrieben habe, um die Informationen aus der Binär-Datei META.DAT auszulesen. Diese Datei wird vom comag-Rekorder erzeugt.
- Gegebenenfalls wird requant von Metakine benötigt: requant
Der Aufruf lautet comagConvert rec....
Die Batch-Variante erfordert keine weitere Benutzer-Interaktion und es können mehrere Verzeichnisnamen übergeben werden, z.B. : comagConvertBatch rec*
Der Quellcode zu comagConvert
show
comagConvert
#!/bin/bash # mar 09: Umstellung, lasse die REC.. verzeichnisse auf der # externen Platte - ziehe nur die benoetigten Daten in das neue Verzeichnis #noch nicht bearbeitet - wenn ich die verzeichnisse schon umbenannt habe #dann gibt es stress - fehler im script bei Ausgangsverzeichnissen mit leerzeichen zielPfad=/MediaNew/videoConverted/ echo "Bearbeite ein Verzeichnis das von Comaq Recorder erzeugt wurde" echo "Verzeichnis kann auf externer HD liegen" echo "Vorsicht - Verzeichnis darf nur aus einem Wort bestehten, z.B REC001" echo "Enter druecken" read a echo "Ergebnisverzeichnis in $zielPfad<titel>" echo "-> umbenennen von Dateien" echo "-> zusammenfuegen der ts-Dateien" echo "-> Meta-Infos auslesen" echo " (um Meta-Info für mehrere Filme auszulesen -> siehe comagMetaCSV)" echo " nicht Interaktiv: comagConvertBatch" echo " Aufruf " $(basename $0) "<verzeichnisname>" if [[ $# -ne 1 ]] then echo "Parameter-Zahl nicht ok" exit else oldVerz=$1 # ein slash mehr stoert nicht fi echo -n "Start: " sdatum=$(date); echo $sdatum cd "$oldVerz" && comagMeta > meta.txt && verz=$(comagTitel) && cd .. #hatte ein / im Dateinamen: nikolaikirche 1/2 ... verz=${verz////v} if [[ "$oldVerz" != /* ]] then pfad=$(pwd) oldVerz=$pfad/$oldVerz fi echo "Titel / neuer Verzeichnisname: "$verz echo "anderer Name j/n"; read a ##fuer batch a=n #a="n" if [[ $a. == "j." ]] then echo "Neuer Verzeichnisname (ohne Pfad): " read verz fi ######################## ##fuer batchbetrieb bei erhalt des verzeichnisnamens #verz=$oldVerz #folgendes raus fuer Batch: ######################### fullVerz=$zielPfad/$verz mkdir -v "$fullVerz" cd "$fullVerz" echo -n "work in dir " pwd #das folgende geht nicht, ln ist auch erfolgreich, wenn die Datei nicht existiert #ln -s $oldVerz/REC.TS "$verz""_0".ts || ln -s $oldVerz/rec.ts "$verz""_0".ts i=$(find $oldVerz -maxdepth 1 -iname "REC.TS") ln -s $i "$verz""_0".ts counter=1 for i in $(find $oldVerz -maxdepth 1 -iname "REC.0?" | sort) do ln -s $i "$verz""_"$counter.ts let counter++ done #links angelegt (ts-Dateien) #kopiere restlichen Daten - meta sinnvoll - der Rest - fraglich #sichergehen, dass ich klein / gross habe cp "$oldVerz/"*.bm "$fullVerz" || cp "$oldVerz/"*.BM "$fullVerz" cp "$oldVerz/"*.cp "$fullVerz" || cp "$oldVerz/"*.CP "$fullVerz" cp "$oldVerz/"*.txt "$fullVerz" || cp "$oldVerz/"*.TXT "$fullVerz" cp "$oldVerz/"*.dat "$fullVerz" || cp "$oldVerz/"*.DAT "$fullVerz" #liste=$(find . -iname "*.ts" | sed "s/ /\\\ /g" | sort) #in der liste soll jeder dateiname von " umgeben sein liste=$(find . -iname "*.ts" | sed "s/ /\\\ /g" | sort | \ while read eintrag do eintrag=${eintrag#./} eintrag=\"$eintrag\" echo -n $eintrag " "; done) #dieser seltsame konstrukt ist noetig, da ich liste in der #schleife nicht veraendern kann - habe ich nicht verstanden echo "Liste: $liste" echo "umbenannt, soll noch geschnitten werden? (j/n)" echo "ich denke es ist doch sinnvoller erst spaeter das mpg zu scheiden und demux zu wählen" echo "danach dann wieder per mplex zusammen fuegen" read a if [[ "$a." == "j." ]] then echo "Bitte nacheinander mit öffnen (originale), schneiden, als binary copy speichern" echo "es entsteht eine Datei mit Namen ...[copy]" echo "umbenennen, so dass die erzeugten links in $fullVerz gültig sind" echo -n "ENTER" read a eval java -jar /home/roemke/Infos/Linux/Multimedia/Project-X/ProjectX.jar echo -n "Enter, wenn die Links wieder stimmen achte auf CASE - Sensitive" read a fi echo "fuege ts zusammen und demultiplexe mit Project-X" # project-x macht stress mit . in Dateiname - ersetze verz=${verz//./ } verz=${verz//:/ } #doppelpuntk - sicher gehen demuxName=$verz"_demux" eval java -jar /home/roemke/Infos/Linux/Multimedia/Project-X/ProjectX.jar -demux\ -name \"$demuxName\" $liste #warum ist da denn ein eval noetig - unklar #log datei umbenennen mv "$verz""_demux_log.txt" "$verz""_log.txt" echo "Habe die Dateien erzeugt, Größen: (m2v ist Video): " du -sm * size=$(du -s "$verz"_demux.m2v | cut -f 1 -s) echo "Beachte: nur 4482 MB Platz auf der DVD - Vorsicht dazu noch Bilder und Menus (wahrscheinlich < 20 MB)"; #spaeter vielleicht mal eine Empfehlung berechnen lassen echo "Geben Sie einen Faktor ein, um die Viedeodateien (nicht Audio) verringert wird (neueGröße=größe*1/faktor: (1)" echo "Hinweis wollen Sie die m2v um b bytes reduzieren so sollte sich der faktor aus $size/($size - b) berechnen lassen" echo -n " 1 oder Enter - nichts passiert: " read fak if [[ ( "$fak". != "." ) && ( $fak != "1" ) ]] then cat "$verz""_demux.m2v" | requant $fak 0 $size > "$verz""_requant_demux.m2v" mv "$verz""_requant_demux.m2v" "$verz""_demux.m2v" fi echo "erzeuge DVD-Format" #hinweise im Netz: fuer dvdauthor ist -f 8 sinnvoll mplex -f 8 -o "$verz""_result.mpg" "$verz""_demux"* tFile="$verz"".mpg" if [[ -f $tFile ]] then mv -v $tFile "$verz""_save.mpg" fi tFile="$verz""_result.mpg" if [[ -f "$tFile" ]] then #die liste eval rm $liste #die demuxten Dateien rm "$verz""_demux"* mv "$tFile" "$verz".mpg else echo "Fehler? Datei \"$tFile\" nicht da" fi cd .. echo "Insgesamt lief der Prozess von - bis" echo "Start: "$sdatum echo -n "Stop: " date # altes verzeichnis doch umbenennen, -> erkenne das gelaufen mv "$oldVerz" "${oldVerz%/}_$verz" #echo "original-verzeichnis nicht verschoben"
Parsed using GeSHi 1.0.8.6
Der Quellcode zu comagConvertBatch
show
comagConvertBatch
#!/bin/bash zielPfad=/MediaNew/videoConverted/ echo "Bearbeite Verzeichniss das von Comaq Recorder erzeugt wurde" echo "Verzeichnis kann auf externer HD liegen" echo "-> umbenennen von Dateien" echo "-> zusammenfuegen der ts-Dateien" echo "-> Meta-Infos auslesen" echo " Aufruf " $(basename $0) "verzeichnisname1 vzname2 ..." echo " Ergebnisse in " $zielPfad echo "known Bug / Feature 1: keine Leerzeichen in Verzeichnisnamen gestattet" echo "known Bug / Feature 2: keine Leerzeichen in Verzeichnisnamen gestattet" echo "Abbruch: ctrl c" echo "Normal: enter" echo "dry run: dry -> ohne mplex project x, verzeichnisse werden nicht umbenannt, nur anzeige." read a dry="" if [[ $a. == "dry." ]] then dry="echo" fi echo -n "Start: " sdatum=$(date); echo $sdatum maskiere="( )" for dir in "$@" do if [[ -d "$dir" ]] then cd "$dir" && comagMeta > meta.txt && verz=$(comagTitel) && cd .. #comagTitel checkt nicht auf irgendwelche sonderzeichen -> maskiere hier #nein, hatte ein / im Dateinamen: nikolaikirche 1/2 ... verz=${verz////v} # / durch v ersetzt verz=${verz//\"/} # " durch nichts ersetzt #for i in $maskiere #do #verz=${verz//$i/\\$i} #done #echo Verzeichnis lautet $verz #exit ######################## ##fuer batchbetrieb bei erhalt des verzeichnisnamens #verz=$oldVerz #folgendes raus fuer Batch: #if [[ "$oldVerz" != "$verz" ]] #then # mv -v "$oldVerz" "$verz" #fi ######################### zurNot=$(cat "$dir/meta.txt" | grep Startdatum | cut -d ' ' -f 2) fullVerz=$zielPfad/$verz if [[ -e $fullVerz ]] then fullVerz=$fullVerz"_"$zurNot if [[ -e $fullVerz ]] then # wenn das auch noch da, hänge startzeit noch an :-) zurNot=$(cat "$dir/meta.txt" | grep Startzeit | cut -d ' ' -f 2) #:kritisch - ersetze durch - zurNot=${zurNot//:/-} fullVerz=$fullVerz"_"$zurNot fi echo "fullVerz ist $fullVerz" fi #exit echo "fullVerz ist $fullVerz" eval $dry mkdir -v "$fullVerz" pfad=$(pwd) if [[ "$dir" != /* ]] then dir=$pfad/$dir fi eval $dry cd "$fullVerz" #mv -v REC.TS "$verz""_0".ts || mv -v rec.ts "$verz""_0".ts # ln -s $dir/REC.TS "$verz""_0".ts || ln -s $dir/rec.ts "$verz""_0".ts #obiges nicht if [[ "$dry." != "echo." ]] then i=$(find "$dir" -maxdepth 1 -iname "REC.TS") ln -s $i "$verz""_0".ts counter=1 for i in $(find $dir -maxdepth 1 -iname "REC.0?" | sort) do ln -s $i "$verz""_"$counter.ts let counter++ done #links angelegt (ts-Dateien) #kopiere restlichen Daten - meta sinnvoll - der Rest - fraglich find "$dir" -maxdepth 1 -mindepth 1 -iname "*.bm" -exec cp {} "$fullVerz" \; find "$dir" -maxdepth 1 -mindepth 1 -iname "*.cp" -exec cp {} "$fullVerz" \; find "$dir" -maxdepth 1 -mindepth 1 -iname "*.dat" -exec cp {} "$fullVerz" \; find "$dir" -maxdepth 1 -mindepth 1 -iname "*.txt" -exec cp {} "$fullVerz" \; echo "fuege ts zusammen und demultiplexe mit Project-X" #liste=$(find . -iname "*.ts" | sed "s/ /\\\ /g" | sort) #in der liste soll jeder dateiname von " umgeben sein liste=$(find . -iname "*.ts" | sed "s/ /\\\ /g" | sort | \ while read eintrag do eintrag=${eintrag#./} eintrag=\"$eintrag\" echo -n $eintrag " "; done) #dieser seltsame konstrukt ist noetig, da ich liste in der #schleife nicht veraendern kann - habe ich nicht verstanden echo "Liste: $liste" #projectx macht stress mit dem . - dem : vielleicht auch renVerz=$verz verz=${verz//./_} verz=${verz//:/_} demuxName=$verz"_demux" eval java -jar /home/roemke/Infos/Linux/Multimedia/Project-X/ProjectX.jar -demux\ -name \"$demuxName\" $liste #warum ist da denn ein eval noetig - unklar #log datei umbenennen mv "$verz""_demux_log.txt" "$verz""_log.txt" echo "Habe die Dateien erzeugt, Größen: (m2v ist Video): " du -sh * echo "erzeuge DVD-Format" #hinweise im Netz: fuer dvdauthor ist -f 8 sinnvoll mplex -f 8 -o "$verz""_result.mpg" "$verz""_demux"* tFile="$verz"".mpg" if [[ -f $tFile ]] then mv -v $tFile "$verz""_save.mpg" fi tFile="$verz""_result.mpg" if [[ -f "$tFile" ]] then #die liste eval rm $liste #die demuxten Dateien rm "$verz""_demux"* mv "$tFile" "$verz".mpg else echo "Fehler: Datei \"$tFile\" nicht da" fi mv "$dir" "${dir%/}_$renVerz" fi fi cd $pfad done echo "Insgesamt lief der Prozess von - bis" echo "Start: "$sdatum echo -n "Stop: " date
Parsed using GeSHi 1.0.8.6
Karsten Römke (k Ponkt roemke at gmx in de), Rechtliches, Datenschutz, etc.
Rein private Seite, lediglich eine Spielerei Last modified: 2010-05-13
Created: 2010-05-13
Reason: –
Rein private Seite, lediglich eine Spielerei Last modified: 2010-05-13
Created: 2010-05-13
Reason: –