max5moritz
Goto Top

Werte aus einer Medien-Info-Datei auslesen in Varibale schreiben zwecks Weiterverarbeitung

Hallo miteinander,

und einen schönen Abend erst einmal.

Ich möchte mir die Transkodierung von Sat-Aufnahmen ein wenig "erleichtern".
Bis zum Kopieren, Umwandeln in ts-Dateien und Auslesen der Medien-Infos oder wie VLC sagt Codec-Details bin ich schon gekommen.
Jetzt hänge ich daran, diese Werte irgendwie in Variable zu kriegen, damit ich mittels VLC die Sache in mp3-Dateien bzw. mp4-Dateien transkodiert bekomme.
Ich habe mich schon an diesem Abschnitt dank dieses tollen Forum ( vieles bekommt man ja hier so schon mit) schon einwenig versucht.
Allein, ich glaube, ich bin da irgendwie auf dem Holzweg. Deshalb vorab "meine" Testsschleife (das Orginal stammt von Bastla oder Biber glaub ich) samt Ergebnis:

@echo off & setlocal
::> test-2.txt
for %%i in (ID Format Bit Width Height Channel) do (
    for /f "tokens=1* delims=:" %%a in ('findstr /b "%%i" "%~dp0\test.nfo"') do call :%%i "%%b"  
)
echo --------------------------------------
ECHO aus Schleife 
Echo Var1=%Var1%
echo Var2=%Var2%, Var3=%Var3%,
ECHO Var4=%Var4%, 
echo Var5=%Var5%,
echo Var6=%Var6%,
echo.
pause
goto :eof

:ID
set var1=%1
set var1=%var1:~2,-1%
echo ID=%var1%
echo ID=%var1% >> test-2.txt
goto :eof

:Width
set var2=%1
set var2=%var2:~2,-1%
echo Width=%var2%
goto :eof

:Height
set var3=%1
set var3=%var3:~2,-1%
echo Height=%var3%
goto :eof

:Format
set var4=%1
set var4=%var4:~2,-1%
echo Format=%var4%
goto :eof

:Bit
set var5=%1
set var5=%var5:~2,-1%
echo Bit=%var5%
goto :eof

:Channel
set var6=%1
set var6=%var6:~2,-1%
echo Channel=%var6%
goto :eof
 

Das zeigt die Bildschirm-Anzeige
ID=1101 (0x44D)
ID=101 (0x65)
ID=106 (0x6A)
Format=MPEG-TS
Format=MPEG Video
Format=Version 2
Format=Main@Main
Format=Yes
Format=Custom
Format=M=3, N=12
Format=AC-3
Format=Audio Coding 3
Bit=Variable
Bit=6 109 Kbps
Bit=8 bits
Bit=0.589
Bit=Constant
Bit=448 Kbps
Bit=16 bits
Width=720 pixels
Height=576 pixels
Channel=6 channels
Channel=Front: L C R, Side: L R, LFE
--------------------------------------
aus Schleife
Var1=106 (0x6A)
Var2=720 pixels, Var3=576 pixels,
Var4=Audio Coding 3,
Var5=16 bits,
Var6=Front: L C R, Side: L R, LFE,

Drücken Sie eine beliebige Taste . . .

Das steht am Beispiel für var1 in der Text-Datei:

ID=1101 (0x44D) 
ID=101 (0x65) 
ID=106 (0x6A)

Und dies ist die zu verarbeitende Datei, aus der ich ein paar Werte benötige:

General
ID                                       : 1101 (0x44D)
Complete name                            : Die Gänsemagd.ts
Format                                   : MPEG-TS
File size                                : 2.83 GiB
Duration                                 : 58mn 41s
Overall bit rate mode                    : Variable
Overall bit rate                         : 6 903 Kbps

Video
ID                                       : 101 (0x65)
Menu ID                                  : 28106 (0x6DCA)
Format                                   : MPEG Video
Format version                           : Version 2
Format profile                           : Main@Main
Format settings, BVOP                    : Yes
Format settings, Matrix                  : Custom
Format settings, GOP                     : M=3, N=12
Codec ID                                 : 2
Duration                                 : 58mn 40s
Bit rate mode                            : Variable
Bit rate                                 : 6 109 Kbps
Maximum bit rate                         : 15.0 Mbps
Width                                    : 720 pixels
Height                                   : 576 pixels
Display aspect ratio                     : 16:9
Frame rate                               : 25.000 fps
Standard                                 : PAL
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Interlaced
Scan order                               : Top Field First
Compression mode                         : Lossy
Bits/(Pixel*Frame)                       : 0.589
Stream size                              : 2.50 GiB (88%)

Audio
ID                                       : 106 (0x6A)
Menu ID                                  : 28106 (0x6DCA)
Format                                   : AC-3
Format/Info                              : Audio Coding 3
Mode extension                           : CM (complete main)
Codec ID                                 : 6
Duration                                 : 58mn 41s
Bit rate mode                            : Constant
Bit rate                                 : 448 Kbps
Channel(s)                               : 6 channels
Channel positions                        : Front: L C R, Side: L R, LFE**
Sampling rate                            : 48.0 KHz
Bit depth                                : 16 bits
Compression mode                         : Lossy
Delay relative to video                  : 3ms
Stream size                              : 188 MiB (6%)
Language                                 : German

Leider sind manche Worte doppelt belegt (z.Bsp.: Bit oder Format), bzw. sind mehrteilig, Ein paar Werte habe ich mal herausgenommen:

Format : AC-3
Format/Info : Audio Coding 3
Mode extension : CM (complete main)
Bit rate mode : Constant
Bit rate : 448 Kbps
Channel(s) : 6 channels

Die können ja als Orientierung dienen.
Für jede TS-Datei, gibt es eine solche Info-Datei. Sie liegen im selben Ordner, haben den gleichen Namen. Allein die Extension (*.ts,*.nfo) ist verschieden.
Ich benötige die Werte zum Steuern des VLC, da dieser sich ja blind / per Skript bedienen läßt.
Im Ergebnis soll dann je nach dem, welche Infos gefunden oder nicht werden (reinen AudioStreams fehlt der Videokomplex), eine MP3-Datei oder eine MP4-Datei daraus werden.

Wenn wir dafür eine Lösung finden, würde mich das sehr freuen und mit dem Rest käme ich sicherlich allein weiter.

Das Ergebnis, den kompletten Skript, würde ich dann gern als Anleitung einstellen. Vielleicht kann den ja noch jemand mal gebrauchen.

Vorerst noch einen schönen Abend, oder vieleicht doch besser: Eine gute Nacht.

Herzlichst Max5Moritz
Kommentar vom Moderator Biber am 09.11.2011 um 14:22:35 Uhr
Verschoben von "Tools & Utilities" nach "Batch &Shell".

Content-Key: 175977

Url: https://administrator.de/contentid/175977

Ausgedruckt am: 28.03.2024 um 09:03 Uhr

Mitglied: 60730
60730 09.11.2011 um 02:04:10 Uhr
Goto Top
moin oder N8...

zuerst mal - nimm das €cho off raus..
Dann hast du die Sets nicht wirklich hybsch gemacht...
set var1=%1
besser:
set "var1=%1"
Auch das:
echo ID=%var1% >> test-2.txt
echo ID=%var1%>> test-2.txt
macht sich besser.

Soviel zum Vorschlag, dann zum weiteren Ansatz:
Ich nehme mal an - ich habs nur überflogen - deine mp3 Audio Info files haben keinen Eintrag Video.
Andersherum, wirst du keine Stummfilme haben, aber wie siehts mit mehreren Tonspuren aus?

  • Ich würd das so angehen - finde "Video" und merke dir die Zeilen Nummer, finde Audio und alles zwischen Zeile Video bis Audio ist der Videoteil.
Sinngemäß also:
for /f "tokens=1,* delims=:" %a in ('findstr /n /i "Video" "%Var1%"') do echo Videoabschnitt=%a
for /f "tokens=1,* delims=:" %a in ('findstr /n /i "Audio" "%Var1%"') do echo Audioabschnitt=%a

Und das natürlich nicht echo, sondern set
Via set /a hast du dann die auszuwertenden Zeilen.

sorry, vielleicht nachher mehr, der Tag ist zu früh für heute..

Gruß

Ps: verschiebs doch in den B Bereich zu BP & Shell
Mitglied: bastla
bastla 09.11.2011 um 08:01:07 Uhr
Goto Top
Hallo max5moritz!

Den Inhalt der Ausgangsdatei kennen wir einmal - aber was ist genau das Ziel, wie sieht die gewünschte Ergebnisdatei aus?

Grüße
bastla
Mitglied: max5moritz
max5moritz 09.11.2011 um 08:59:53 Uhr
Goto Top
@timobeil
@ bastla

Den Inhalt der Ausgangsdatei kennen wir einmal - aber was ist genau das Ziel, wie sieht die gewünschte Ergebnisdatei aus?

Hallo, und danke Euch beiden für die schnelle Reaktion.

Ich benötige ein Teil der Werte als Variable für den VLC. Zum besseren Verständnis ein Schnipsel aus der Befehlszeile:

transcode{width=720,canvas-height=576,vcodec=mp2v,vb=3072,scale=1,acodec=mpga,ab=192,channels=2,soverlay,fps=25}

Die Werte dazu finden sich in der Datei, nur wie bekomme ich sie alle in einem Rutsch in Variable geschrieben?

Grüße
Max5Moritz
Mitglied: bastla
bastla 09.11.2011 um 11:53:04 Uhr
Goto Top
Hallo max5moritz!

Ein allgemeiner Batch, um aus zB
Channel(s)                               : 6 channels
eine Variable "%Channel[s]%" (die runden Klammern werden zur Sicherheit durch eckige sowie Leerzeichen durch "_" ersetzt) mit dem Wert "6" zu machen, könnte etwa so
@echo off & setlocal
::set "Datei=%~1"  
set "Datei=Test.nfo"  

for %%i in (Width,Height,Format,"Bit rate",Format,"Bit rate","Channel(s)","Frame rate") do call :ProcessLine %%i  
::Nachbehandlung
::  am Dezimalpunkt trennen
for /f "delims=." %%i in ("%Frame_rate%") do set "Frame_rate=%%i"  
::  Video-Bitrate ermitteln
for /f "tokens=2 delims=:" %%v in ('findstr /b /c:"Bit rate  " "%Datei%"') do if not defined VB set "VB=%%v"  
set "Bit_rate=%VB: =%"  
set "Bit_rate=%Bit_rate:Kbps=%"  

echo(
echo transcode{Width=%width%,canvas-height=%Height%,vcodec=%Format%,vb=%Bit_rate%,scale=1,acodec=%aFormat%,ab=%aBit_rate%,channels=%Channel[s]%,soverlay,fps=%Frame_rate%}
endlocal
goto :eof


:ProcessLine
set "Var=%~1"  
set "Var=%Var: =_%"  
set "Var=%Var:(=[%"  
set "Var=%Var:)=]%"  
set "Audio="  
setlocal enabledelayedexpansion
if "!%Var%!" neq "" set "Audio=true"  
endlocal & set "Audio=%Audio%"  
for /f "tokens=2 delims=:" %%v in ('findstr /b /c:"%~1  " "%Datei%"') do (  
    for /f %%a in ("%%v") do (  
        if not defined %Var% set "%Var%=%%a  
        if defined Audio set "a%Var%=%%a"  
    )
)
::Demo
if not defined Audio (
    call echo %Var%=%%%Var%%%
) else (
    call echo a%Var%=%%a%Var%%%
)
goto :eof
aussehen. Für einzelne Variablenwerte (etwa im Beispiel die "Frame_rate" mit "25.000") kann noch eine Nachbearbeitung und für andere (zB die "Bit_rate" des Videos wegen des enthaltenen Leerzeichens bei "6 109") eine noch spezifischere Ermittlung erforderlich sein ...

Das Problem "gleiche Eigenschaftsnamen für Video und Audio" (etwa "Bit_rate") habe ich so gelöst, dass beim zweiten "Auftauchen" eines solchen Namens dem Variablennamen ein "a" (sollte dann ja der Audio-Wert sein) vorangestellt wird.

Grüße
bastla
Mitglied: max5moritz
max5moritz 12.11.2011 um 00:15:10 Uhr
Goto Top
Hallo bastla!

Wow, ich bin begeistert !

Danke für die Hilfe, ich bin erst heute wieder zum Forum gekommen und habe den Skript gleich gestest.

Die Echo in Zeile 37 und 39 habe ich erst einmal testweise in ein Txt-File umgeleitet. Das Ergebnis sieht gut aus - ich bin begeistert.

Eine Frage zur 14. codezeile: Was bewirkt echo( ?

Warum in 36. Zeile if not defined Audio und nicht Video? (Falls es nur ein Audio-Stream ist)

Auf jedenfall kome ich jetzt schon ein gutes Stück weiter. Ich werde über das Ergebnis berichten und darstellen.

Herzliche Grüße,
max5moritz
Mitglied: bastla
bastla 12.11.2011, aktualisiert am 18.10.2012 um 18:49:05 Uhr
Goto Top
Hallo max5moritz!
Eine Frage zur 14. codezeile: Was bewirkt echo( ?
Im Prinzip das Gleiche wie ein herkömmliches
echo.
- allerdings lasse ich mich ja auch gerne eines Besseren belehren und glaube daher jeb-the-batcher, dass die Schreibweise mit "(" gelegentlich vorteilhafter ist ...
Warum in 36. Zeile if not defined Audio und nicht Video? (Falls es nur ein Audio-Stream ist)
Ich verwende die Variable %Audio% als Schalter, der immer dann gesetzt ist, wenn eine Eigenschaft (wie "Bit rate") zum zweiten Mal vorkommt (das erste Vorkommen wird, dem Aufbau der Info-Datei entsprechend, als "Video"-Wert interpretiert und nicht weiter gekennzeichnet). Damit nun in der Demo-Ausgabe die Variable mit dem vorangestellten "a" verwendet wird, muss vorweg festgestellt werden, ob bei diesem Schleifendurchlauf die "Audio"-Variante dran ist ...

Grüße
bastla