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:
Das zeigt die Bildschirm-Anzeige
Das steht am Beispiel für var1 in der Text-Datei:
Und dies ist die zu verarbeitende Datei, aus der ich ein paar Werte benötige:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Biber am 09.11.2011 um 14:22:35 Uhr
Verschoben von "Tools & Utilities" nach "Batch &Shell".
Content-ID: 175977
Url: https://administrator.de/contentid/175977
Ausgedruckt am: 24.11.2024 um 15:11 Uhr
6 Kommentare
Neuester Kommentar
moin oder N8...
zuerst mal - nimm das €cho off raus..
Dann hast du die Sets nicht wirklich hybsch gemacht...
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?
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
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.echo ID=%var1%>> test-2.txt
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.
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
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
Hallo max5moritz!
Ein allgemeiner Batch, um aus zB
eine Variable "
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
Ein allgemeiner Batch, um aus zB
Channel(s) : 6 channels
%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
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
Hallo max5moritz!
- allerdings lasse ich mich ja auch gerne eines Besseren belehren und glaube daher jeb-the-batcher, dass die Schreibweise mit "(" gelegentlich vorteilhafter ist ...
Grüße
bastla
Eine Frage zur 14. codezeile: Was bewirkt echo( ?
Im Prinzip das Gleiche wie ein herkömmlichesecho.
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