eine Schleife einbauen.

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von rabadag, 08.08.2009.

  1. #1 rabadag, 08.08.2009
    rabadag

    rabadag Mitglied

    Dabei seit:
    21.05.2005
    Beiträge:
    30
    Zustimmungen:
    0
    Hallo Linux Freunde.

    Ich hab mir ein kleines Skript gebastelt, das mir MKV file die DTS Spur in AC3 umwandelt und automatisch wider zusammen baut.

    Das Skript funktioniert auch einwandfrei mit einem MKV File das 1 DTS spur enthält. Sind aber 2 oder mehr DTS Spuren vorhanden, Ignoriert mein Skript die 2,3,4,5 Spur.

    kann mir da einer helfen wie man das abändern muss, damit das Skript alle DTS Spuren umwandelt und wider einbindet.

    wenn ich mit | grep -m 5 "audio (A_DTS)" | wird nur die erste Spur umgewandelt.


    Code:
    #!/bin/bash -x
    
    IFS=$'\t\n'
    
    
    
    
    
    for i in `find $1 -name '*.mkv'`
    do
    DIRPATH=`dirname "$i"`
    VNAME=`basename $DIRPATH`
    FNAME=`basename $i`
    MKV=$DIRPATH/$FNAME
    
    
     
    if [[ "$FNAME" == *.mkv ]] ; then
       
       TESTMKV=`/usr/bin/mkvinfo $MKV | grep 'Codec ID' | grep DTS`
    	 #echo "V_MPEG4/ISO/AVC, "$MKV", insertSEI, contSPS, track=1, lang=ger" > /Daten1/Filme/meta.meta
    	 #echo "A_DTS, "$MKV", track=2, lang=ger"  >> /Daten1/Filme/meta.meta
       #echo "A_AC3, "$MKV", track=4, lang=ger"  >> /Daten1/Filme/meta.meta
       
     
    
      if [[ "$TESTMKV" == *A_DTS ]] ; then
    	 MKVDTS="1"
       else
       MKVDTS="0"
      fi
    fi 
    
    
    
    if [[ "$MKVDTS" == 1 ]] ; then
    
    ## Used to time execution
    STARTDECODE=$(date +%s)
    
    DEST=$DIRPATH
    WD=$DEST
    MKVFILE=$DIRPATH/$FNAME
    
    
    NAME=$(basename "$MKVFILE" .mkv)
    
    
    ## Get the track number for the DTS track 1
    DTSTRACK=$(mkvmerge -i "$MKVFILE" | grep -m 1 "audio (A_DTS)" | cut -d: -f1 | cut -d" " -f3)
    VIDEOTRACK=$(mkvmerge -i "$MKVFILE" | grep -m 1 "video" | cut -d: -f1 | cut -d" " -f3)
     
    
    
    ## Setup temporary files
    DTSFILE="$WD/$NAME.dts"
    AC3FILE="$WD/$NAME.ac3"
    DSTFILE="$WD/$NAME.ac3.mkv"
    VIDFILE="$WD/$NAME.video.mkv"
     
    ## Extract the DTS track
    
    
    mkvextract tracks "$MKVFILE" $DTSTRACK:"$DTSFILE"
    
    ## Extract the Video track
    #mkvextract tracks "$MKVFILE" $VIDEOTRACK:"$VIDFILE"
    
    ## Convert DTS to AC3
    dcadec -o wavall "$DTSFILE" | aften - "$AC3FILE"
     
    ## Remux AC3 into original file (retaining DTS)
    mkvmerge -o "$DSTFILE" "$MKVFILE" "$AC3FILE"
     
    ## Delete our temporary files
    #rm -f "$DTSFILE" "$AC3FILE"
    ## Move the newly created file over the old one
    #mv "$DSTFILE" "$MKVFILE"
    
    ## Display total execution time
    END=$(date +%s)
    echo "Total processing time: $(($END - $STARTDECODE)) seconds."
    
      
    fi
    
    done		
    
    
    
    
    	 
    
    
    

    Hier noch die Ausgabe von mkmerge aussehen
    Code:
    mkvmerge -i file.mkv
    File 'dfd-despereaux-1080p-sample.mkv': container: Matroska
    Track ID 1: video (V_MPEG4/ISO/AVC)
    Track ID 2: audio (A_DTS)
    Track ID 3: audio (A_DTS)
    Track ID 4: subtitles (S_TEXT/UTF8)
    
    
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Aqualung, 08.08.2009
    Aqualung

    Aqualung Routinier

    Dabei seit:
    12.02.2008
    Beiträge:
    404
    Zustimmungen:
    0
  4. #3 rabadag, 08.08.2009
    rabadag

    rabadag Mitglied

    Dabei seit:
    21.05.2005
    Beiträge:
    30
    Zustimmungen:
    0
    Danke für die Info.

    Aber das Skript ist genau falsch und nur für 1 DTS Spur gut.
    funktioniert nicht mit mehreren DTS Spuren.
     
  5. #4 Aqualung, 08.08.2009
    Aqualung

    Aqualung Routinier

    Dabei seit:
    12.02.2008
    Beiträge:
    404
    Zustimmungen:
    0
    Code:
    mkvmerge -i file.mkv |while read line; do 
        if [[ "$line" =~ 'audio (A_DTS)' ]]; then 
            echo "$line"
            ...
            ...
        fi 
    done
     
  6. #5 rabadag, 08.08.2009
    rabadag

    rabadag Mitglied

    Dabei seit:
    21.05.2005
    Beiträge:
    30
    Zustimmungen:
    0
    Hi suppi.

    Hab das mal zusammen gebaut.
    Code:
    X=0
    mkvmerge -i "$MKVFILE" | grep "audio (A_DTS)" | cut -d: -f1 | cut -d" " -f3 |while read line; do 
    
        if [[ "$line" != '' ]]; then
    	X=$line
    	mkvextract tracks "$MKVFILE" $X:"$DTSFILE1.$X"
            dcadec -o wavall "$DTSFILE1.$X" | aften - "$AC3FILE.$X"
          fi 
    done
    
    Das geht nun mal super und ich erhalte alle Spuren die DTS sind als AC3

    nun muss ich noch nach der schleife das ganze zusammen bauen.

    Hast da noch ein tip wie ich innerhalb der schleife das "$AC3FILE.$X" Ergebnis in ne variable Array packe, das ich alle ac3 file namen darin habe in Form von
    "file.ac31 file.ac3.2 file.ac3.3"

    Damit ich dann
    Code:
    mkvmerge -o "$DSTFILE" "$MKVFILE" "VARIABLE AUS DER SCHLEIFE"
    habe.
     
  7. #6 tuxlover, 08.08.2009
    tuxlover

    tuxlover Der den Tux knuddelt

    Dabei seit:
    26.10.2005
    Beiträge:
    2.106
    Zustimmungen:
    0
    Ort:
    berlin
  8. #7 Aqualung, 09.08.2009
    Zuletzt bearbeitet: 09.08.2009
    Aqualung

    Aqualung Routinier

    Dabei seit:
    12.02.2008
    Beiträge:
    404
    Zustimmungen:
    0
    Code:
    X=0
    mkvmerge -i "$MKVFILE" | grep "audio (A_DTS)" | cut -d: -f1 | cut -d" " -f3 |while read line; do 
         if [[ "$line" != '' ]]; then
    	X=$line
    	mkvextract tracks "$MKVFILE" $X:"$DTSFILE1.$X"
            dcadec -o wavall "$DTSFILE1.$X" | aften - "$AC3FILE.$X"
            ALL_AC3FILES="$ALL_AC3FILES $AC3FILE.$X"
          fi 
    done
    
     
  9. #8 rabadag, 09.08.2009
    Zuletzt bearbeitet: 09.08.2009
    rabadag

    rabadag Mitglied

    Dabei seit:
    21.05.2005
    Beiträge:
    30
    Zustimmungen:
    0
    He supper. besten dank Aqualung für deine Hilfe.

    Jetzt geht es und ich kann meine 150 HDTV Filme konvertieren.
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    hab doch noch ein kleines Prob.
    Code:
    X=0
    mkvmerge -i "$MKVFILE" | grep "audio (A_DTS)" | cut -d: -f1 | cut -d" " -f3 | while read line; do
    
        if [[ "$line" != '' ]]; then
    	X=$line
    	mkvextract tracks "$MKVFILE" $X:"$DTSFILE1.$X"
            dcadec -o wavall "$DTSFILE1.$X" | aften - "$AC3FILE.$X"
    	FNAMEAC3="basename $AC3FILE.$X"
            ALL_AC3FILES="$ALL_AC3FILES $AC3FILE.$X"
    	
    	fi 
    echo $ALL_AC3FILES >$TEXTFILE
    
    done
    
    ALLFILESAC3="cat $TEXTFILE"
    mkvmerge -o $DSTFILE $MKVFILE $ALLFILESAC3
    Da die Variable $ALL_AC3FILES außerhalb der schleife leer ist, dachte ich mir ich schreib das ganze in ein file und lese es außerhalb der schleife wider ein.

    Naja geht soweit, ausser das ich in der ausgabe der Variable $ALLFILESAC3
    die Zeile in 'inhalt' habe also so
    ./dfd-despereaux-1080p-sample.ac3.mkv ./dfd-despereaux-1080p-sample.mkv ' ./dfd-despereaux-1080p-sample.ac3.2 ./dfd-despereaux-1080p-sample.ac3.3'

    wie kann ich nun noch die hochkommas entfernen.
    Danke für die hilfe
     
  10. #9 Aqualung, 09.08.2009
    Aqualung

    Aqualung Routinier

    Dabei seit:
    12.02.2008
    Beiträge:
    404
    Zustimmungen:
    0
    Code:
    typeset -x  ALL_AC3FILES
    vor die Schleife.
     
  11. #10 rabadag, 09.08.2009
    rabadag

    rabadag Mitglied

    Dabei seit:
    21.05.2005
    Beiträge:
    30
    Zustimmungen:
    0
    hmm.

    Irgendwie will es einfach nicht. hab immer noch die ' ' in der ausgabe drin.
    Code:
    mkvmerge -o $DSTFILE $MKVFILE $ALLFILESAC3
    
    mkvmerge -o ./dfd-despereaux-1080p-sample.ac3.mkv ./dfd-despereaux-1080p-sample.mkv ' ./dfd-despereaux-1080p-sample.ac3.2 ./dfd-despereaux-1080p-sample.ac3.3'
    

    Code:
    X=0
    typeset -x  ALL_AC3FILES
    mkvmerge -i "$MKVFILE" | grep "audio (A_DTS)" | cut -d: -f1 | cut -d" " -f3 | while read line; do
    
        if [[ "$line" != '' ]]; then
    	X=$line
    	mkvextract tracks "$MKVFILE" $X:"$DTSFILE1.$X"
            dcadec -o wavall "$DTSFILE1.$X" | aften - "$AC3FILE.$X"
    	FNAMEAC3="basename $AC3FILE.$X"
            ALL_AC3FILES="$ALL_AC3FILES $AC3FILE.$X"
    fi 
    
    #mkvmerge -o "$DSTFILE" "$MKVFILE""$ALL_AC3FILES"
     echo $ALL_AC3FILES > $TEXTFILE
    
    
    done
    
    typeset -x ALLFILESAC3
    ALLFILESAC3=`cat $TEXTFILE` 
    mkvmerge -o $DSTFILE $MKVFILE $ALLFILESAC3
    
    sieht jemand irgend ein Fehler?
     
  12. #11 Aqualung, 09.08.2009
    Zuletzt bearbeitet: 09.08.2009
    Aqualung

    Aqualung Routinier

    Dabei seit:
    12.02.2008
    Beiträge:
    404
    Zustimmungen:
    0
    Den Umweg über das Textfile vergessen!

    Code:
    man export

    Code:
    mkvmerge -o "$DSTFILE" "$MKVFILE""$ALL_AC3FILES"
    funzt nicht?

    Poste nochmal das ganze script,
     
  13. #12 rabadag, 09.08.2009
    Zuletzt bearbeitet: 09.08.2009
    rabadag

    rabadag Mitglied

    Dabei seit:
    21.05.2005
    Beiträge:
    30
    Zustimmungen:
    0
    ich raf es nicht,
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Hier nomal das ganze.

    Code:
    #!/bin/bash -x
    
    # Wordsplitting auf Tab und Newline beschraenken
    # Dateien duerfen Leerzeichen enthalten
    IFS=$'\t\n'
    
    
    
    
    
    for i in `find $1 -name '*.mkv'`
    do
    DIRPATH=`dirname "$i"`
    VNAME=`basename $DIRPATH`
    FNAME=`basename $i`
    MKV=$DIRPATH/$FNAME
    
    
     
    if [[ "$FNAME" == *.mkv ]] ; then
       
       TESTMKV=`/usr/bin/mkvinfo $MKV | grep 'Codec ID' | grep DTS`
    	 #echo "V_MPEG4/ISO/AVC, "$MKV", insertSEI, contSPS, track=1, lang=ger" > /Daten1/Filme/meta.meta
    	 #echo "A_DTS, "$MKV", track=2, lang=ger"  >> /Daten1/Filme/meta.meta
       #echo "A_AC3, "$MKV", track=4, lang=ger"  >> /Daten1/Filme/meta.meta
       
     
    
      if [[ "$TESTMKV" == *A_DTS ]] ; then
    	 MKVDTS="1"
       else
       MKVDTS="0"
      fi
    fi 
    
    
    
    if [[ "$MKVDTS" == 1 ]] ; then
    
    ## Used to time execution
    STARTDECODE=$(date +%s)
    
    ## Working Directory
    ## I personally use the current directory since my temp partition
    ## is tiny (WD=.). To use the directory the file is in use $DEST.
    DEST=$DIRPATH
    WD=$DEST
    MKVFILE=$DIRPATH/$FNAME
    
    
    NAME=$(basename "$MKVFILE" .mkv)
    
    
    ## Get the track number for the DTS track
    DTSMENGE=$(mkvmerge -i "$MKVFILE" | grep "audio (A_DTS)" | cut -d: -f1 | cut -d" " -f3)
    DTSTRACK=$(mkvmerge -i "$MKVFILE" | grep -m 1 "audio (A_DTS)" | cut -d: -f1 | cut -d" " -f3)
    VIDEOTRACK=$(mkvmerge -i "$MKVFILE" | grep -m 1 "video" | cut -d: -f1 | cut -d" " -f3)
     
    
    
    ## Setup temporary files
    DTSFILE1="$WD/$NAME.dts1"
    DTSFILE2="$WD/$NAME.dts2"
    AC3FILE="$WD/$NAME.ac3"
    DSTFILE="$WD/$NAME.ac3.mkv"
    VIDFILE="$WD/$NAME.video.mkv"
    TEXTFILE="$WD/$NAME.ac3files.txt"
     
    ## Extract the DTS track
    X=0
    typeset -x  ALL_AC3FILES
    mkvmerge -i "$MKVFILE" | grep "audio (A_DTS)" | cut -d: -f1 | cut -d" " -f3 | while read line; do
    
        if [[ "$line" != '' ]]; then
    	X=$line
    	mkvextract tracks "$MKVFILE" $X:"$DTSFILE1.$X"
            dcadec -o wavall "$DTSFILE1.$X" | aften - "$AC3FILE.$X"
    	FNAMEAC3="basename $AC3FILE.$X"
            ALL_AC3FILES="$ALL_AC3FILES $AC3FILE.$X"
    fi 
    
    
    
    echo $ALL_AC3FILES
    #mkvmerge -o "$DSTFILE" "$MKVFILE""$ALL_AC3FILES"
     #echo $ALL_AC3FILES > $TEXTFILE
    
    
    done
    
    
    ## Delete our temporary files
    #rm -f "$DTSFILE" "$AC3FILE"
    ## Move the newly created file over the old one
    #mv "$DSTFILE" "$MKVFILE"
    
    ## Display total execution time
    END=$(date +%s)
    echo "Total processing time: $(($END - $STARTDECODE)) seconds."
    
      
    fi
    
    done		
    
    
    
    
    	 
     
  14. #13 Aqualung, 09.08.2009
    Aqualung

    Aqualung Routinier

    Dabei seit:
    12.02.2008
    Beiträge:
    404
    Zustimmungen:
    0
    Code:
    #!/bin/bash -x
    
    # Wordsplitting auf Tab und Newline beschraenken
    # Dateien duerfen Leerzeichen enthalten
    IFS=$'\t\n'
    
    
    
    
    
    for i in `find $1 -name '*.mkv'`
    do
    DIRPATH=`dirname "$i"`
    VNAME=`basename $DIRPATH`
    FNAME=`basename $i`
    MKV=$DIRPATH/$FNAME
    
    
     
    if [[ "$FNAME" == *.mkv ]] ; then
       
       TESTMKV=`/usr/bin/mkvinfo $MKV | grep 'Codec ID' | grep DTS`
    	 #echo "V_MPEG4/ISO/AVC, "$MKV", insertSEI, contSPS, track=1, lang=ger" > /Daten1/Filme/meta.meta
    	 #echo "A_DTS, "$MKV", track=2, lang=ger"  >> /Daten1/Filme/meta.meta
       #echo "A_AC3, "$MKV", track=4, lang=ger"  >> /Daten1/Filme/meta.meta
       
     
    
      if [[ "$TESTMKV" == *A_DTS ]] ; then
    	 MKVDTS="1"
       else
       MKVDTS="0"
      fi
    fi 
    
    
    
    if [[ "$MKVDTS" == 1 ]] ; then
    
    ## Used to time execution
    STARTDECODE=$(date +%s)
    
    ## Working Directory
    ## I personally use the current directory since my temp partition
    ## is tiny (WD=.). To use the directory the file is in use $DEST.
    DEST=$DIRPATH
    WD=$DEST
    MKVFILE=$DIRPATH/$FNAME
    
    NAME=$(basename "$MKVFILE" .mkv)
    
    ## Get the track number for the DTS track
    DTSMENGE=$(mkvmerge -i "$MKVFILE" | grep "audio (A_DTS)" | cut -d: -f1 | cut -d" " -f3)
    DTSTRACK=$(mkvmerge -i "$MKVFILE" | grep -m 1 "audio (A_DTS)" | cut -d: -f1 | cut -d" " -f3)
    VIDEOTRACK=$(mkvmerge -i "$MKVFILE" | grep -m 1 "video" | cut -d: -f1 | cut -d" " -f3)
     
    ## Setup temporary files
    DTSFILE1="$WD/$NAME.dts1"
    DTSFILE2="$WD/$NAME.dts2"
    AC3FILE="$WD/$NAME.ac3"
    DSTFILE="$WD/$NAME.ac3.mkv"
    VIDFILE="$WD/$NAME.video.mkv"
    TEXTFILE="$WD/$NAME.ac3files.txt"
     
    ## Extract the DTS track
    X=0
    export ALL_AC3FILES=""
    mkvmerge -i "$MKVFILE" | grep "audio (A_DTS)" | cut -d: -f1 | cut -d" " -f3 | while read line; do
    
        if [[ "$line" != '' ]]; then
    	X=$line
    	mkvextract tracks "$MKVFILE" $X:"$DTSFILE1.$X"
            dcadec -o wavall "$DTSFILE1.$X" | aften - "$AC3FILE.$X"
    	FNAMEAC3="basename $AC3FILE.$X"
            ALL_AC3FILES="$ALL_AC3FILES $AC3FILE.$X"
    fi 
    
    ALLAC3=$(echo "$ALL_AC3FILES" | tr -d \')
    mkvmerge -o "$DSTFILE" "$MKVFILE" "$ALL_AC3"
    
    done
    
    ## Delete our temporary files
    #rm -f "$DTSFILE" "$AC3FILE"
    ## Move the newly created file over the old one
    #mv "$DSTFILE" "$MKVFILE"
    
    ## Display total execution time
    END=$(date +%s)
    echo "Total processing time: $(($END - $STARTDECODE)) seconds."
    
      
    fi
    
    done
    Woher diese single quotes kommen wird mir ein Rätsel bleiben...
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 rabadag, 09.08.2009
    rabadag

    rabadag Mitglied

    Dabei seit:
    21.05.2005
    Beiträge:
    30
    Zustimmungen:
    0
    Geht leider nicht.

    Hab immer noch die ' ' in der ausgabe der variable $ALLAC3 drin.

    mkvmerge -o ./dfd-despereaux-1080p-sample.ac3.mkv ./dfd-despereaux-1080p-sample.mkv ' ./dfd-despereaux-1080p-sample.ac3.2 ./dfd-despereaux-1080p-sample.ac3.3'
     
  17. #15 Aqualung, 09.08.2009
    Zuletzt bearbeitet: 09.08.2009
    Aqualung

    Aqualung Routinier

    Dabei seit:
    12.02.2008
    Beiträge:
    404
    Zustimmungen:
    0
    Poste die Ausgabe des Skripts von

    Code:
    ALLAC3=$(echo "$ALL_AC3FILES" | tr -d \')
    Kommentier mal am Anfang das "IFS=$'\t\n'" raus.
     
Thema:

eine Schleife einbauen.

Die Seite wird geladen...

eine Schleife einbauen. - Ähnliche Themen

  1. for schleife für eine Zeile

    for schleife für eine Zeile: Hallo, ich bin neu hier in diesem Forum. Evtl. kann mir ja einer von euch bei meinem Problem helfen. Ich möchte für ein entpackprogramm eine...
  2. [FRAGE] Dateinamen normalisieren während sie in einer "for" Schleife sind

    [FRAGE] Dateinamen normalisieren während sie in einer "for" Schleife sind: Moin Gemeinde, ich habe ein Skript welches Emails abholt und weiterverarbeitet, manche müssen ausgedruckt werden. Nun hat sich herausgestellt...
  3. Dateien verschieben + Zeitstempel anhängen mit Hilfe einer for - Schleife

    Dateien verschieben + Zeitstempel anhängen mit Hilfe einer for - Schleife: Guten morgen zusammen, könnt ihr mir bitte sagen warum meine for - Schleife nicht funktioniert? timestamp=$( date +%d.%m.%y_%H:%M:%S )...
  4. 2 Listen in einer for Schleife abarbeiten

    2 Listen in einer for Schleife abarbeiten: Hallo zusammen, Betriebssystem ist Suse Linux mit SH-Shell. Ich möchte folgendes machen: VAR1="/pfad1/" VAR2="/pfad2/" VAR3="${VAR1}1...
  5. Schleife in einer Schleife

    Schleife in einer Schleife: Hallo Zusammen, ich möchte in einer Schleife eine neue Schleife starten lassen. Folgendes Konstrukt: while read hosts do while...