eine Schleife einbauen.

R

rabadag

Mitglied
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)
 
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.
 
Code:
mkvmerge -i file.mkv |while read line; do 
    if [[ "$line" =~ 'audio (A_DTS)' ]]; then 
        echo "$line"
        ...
        ...
    fi 
done
 
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.
 
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
 
Zuletzt bearbeitet:
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
 
Zuletzt bearbeitet:
Code:
typeset -x  ALL_AC3FILES

vor die Schleife.
 
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?
 
Den Umweg über das Textfile vergessen!

Code:
man export


Code:
mkvmerge -o "$DSTFILE" "$MKVFILE""$ALL_AC3FILES"

funzt nicht?

Poste nochmal das ganze script,
 
Zuletzt bearbeitet:
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
 
Zuletzt bearbeitet:
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...
 
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'
 
Poste die Ausgabe des Skripts von

Code:
ALLAC3=$(echo "$ALL_AC3FILES" | tr -d \')

Kommentier mal am Anfang das "IFS=$'\t\n'" raus.
 
Zuletzt bearbeitet:
Irgendwie komisch...

+ export 'ALLAC3= ./dfd-despereaux-1080p-sample.ac3.2 ./dfd-despereaux-1080p-sample.ac3.3'
+ ALLAC3=' ./dfd-despereaux-1080p-sample.ac3.2 ./dfd-despereaux-1080p-sample.ac3.3'
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

hmmm

Hab ne Variante gefunden. damit gehts.

export ALLAC3=$(echo "$ALL_AC3FILES" | tr -d \')
RUN="mkvmerge -o"
EXEC="$RUN $DSTFILE $MKVFILE $ALLAC3"
$EXEC


done

Wenn ich die $ALLAC3 jetzt noch außerhalb der Schleife hätte wäre das Ding Tauglich.

+ export 'ALLAC3= ./dfd-despereaux-1080p-sample.ac3.2 ./dfd-despereaux-1080p-sample.ac3.3'
+ ALLAC3=' ./dfd-despereaux-1080p-sample.ac3.2 ./dfd-despereaux-1080p-sample.ac3.3'
 
Zuletzt bearbeitet:
Wenn ich die $ALLAC3 jetzt noch außerhalb der Schleife hätte wäre das Ding Tauglich

Dafür sollte eigentlich "export ALLAC3" sorgen.
Setz vor die Schleife noch

Code:
export ALLAC3=""
 

Ähnliche Themen

HandbrakeCLI Shell Skript

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

Shellskript - Fehler in Cron

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Variableninhalt wird nicht gespeichert

Zurück
Oben