max5moritz
Goto Top

Filme und Medienstreams mit einem Klick konvertieren (Variante2)

Mit Batch und ffmpeg ist das möglich.

Liebe User,

da die meisten Hinweise bereits in der Batch stehen, also nur die Ergänzungen.

Was ist neu?

1. Untertitel sind möglich, vorhandene *.srt-Dateien werden klaglos eingemuxt.
2. Paramter via GUI-Fenster ebenso.
3. Zusatzskripte für besondere Ziele (z.B. Handy) können beliebig eingefügt und ergänzt werden.

Zusätzlich wird AutoHotKey Basic benötigt. Die Freeware gibt es dort und
Das Paket Hybrid, mit "ffmpeg" etc. kann dort herunterladen werden.
Diesen Skript als *.ahk - Pfadangabe bitte anpassen - speichern.

InputBox,VAR,Parameter eingeben, Handy Mini-PC snip oder enter
if ErrorLevel <> 0
ExitApp
run, %COMSPEC% /K D:\batFolder\Media-Convert.bat %1% %VAR%
ExitApp

Die Arbeitsweise ist wie gehabt:
Datei oder Ordner auf den Link zur Batch oder *.ahk ziehen, Umwandlung abwarten, fertig.
Dank Test-Funktion, können schnell verschiedene ffmpeg-Anweisungen (Parameter) ausprobiert werden.
Auf das Dekodieren von Untertitel versteht sich "ffmpeg" noch nicht perfekt, oder ich habe es noch nicht herausgefunden.
Vielleicht mag mir ja da jemand helfen? Jetzt ist die Situation so, falls diese nicht demuxt werden können,
weist das Skript daraufhin, dass dieser Vorgang separat ausgeführt werden muss.

Die Zusatzskripte (in Batch-Form) müssen nur folgende Variable neu festlegen:
%outex% - welcher Ziel-Container soll es werden, und
%para% - wie soll "ffmpeg" arbeiten, dieser muss naturgemäß mit einem "-" anfangen: set "para=-t 30"

Die Schnittstellen zu den Skripten sind ab Zeile 68 einzupflegen ( if "%2"=="Handy" call %batFolder%\Handy-set ).

Wer die Hinweise zu den Datei-Verzeichnisse beachtet, sorgt für zusätzliche Dateisicherheit, da dann die Batch "weiss", wohin und doppelte
Dateinamen zu sichern sind.

Nun viel Spass beim Ausprobieren und Umwandeln.

Ich danke für Eure Aufmerksamkeit.
max5moritz


::Bat-File-Name: Media-Convert, Version: 1.00_2012-05-18
@echo off&setlocal enabledelayedexpansion
mode con cols=100 lines=10&cls&color 3F
set "input=%1"&set "para=-sameq"  
set "start=-ss 00:03:00.000"  
set "batFolder=%~dp0"  
set "auto=*.avi, *.flv, *mp4, *mkv, *.mpg, *.mpeg, *.ps, *.ts, *.wmv"  
if n%1==n goto help
set "parm1=-vcodec copy"&set "parm2=-acodec copy"  
set "parmstd=%parm1% %parm2% -sn"  
goto :Main

::Hinweise
Beliebige Media-Container-File(s) in *.mp4 oder *.mkv oder *.mp3 ohne Aufwand umwandeln.
Mögliche Methoden der Verwendung:
1. Eine Datei oder Ordner auf die Batch oder deren Link ziehen (Auto-Modus)
2. Per Aufruf: Batch-Name "%1" "%2" %3 (1=Media-File, 2="ffmpeg"-Codes, 3=Extension des Ziel)  
3. Eine Datei oder Ordner auf einen AutoHotKey-Skript (*.ahk) ziehen, der die Batch aufruft
   Dann mit Übergabe der Parameter "%2" %3 oder ohne (Auto-Modus)  
   Im Abschnitt :run habe ich als Bespiel eine mögliche Aufrufstelle für ein Handy vorgesehen.
   Dort können per Batch auch aufwändige "ffmpeg"-Codes eingesetzt werden.  
4. Per Doppelklick *.ahk Starten, dann alle Paramater wie bei 2. eingeben.
Unterstützte Eingangs-Formate mindestens siehe set "auto=..."  
Alternativ per Einzelprobe testen / "ffmpeg" ist recht clever!  
Die Variablen %ffmpeg%, %sox% und %mediainfo% (Pfad+Programmename), im Programm-Paket "Hybrid" sind diese enthalten,  
sowie %ddm% und %weg% (Ordner, bzw., der zentrale Spezial-Papierkorb) werden durch die Batch "start-set" gesetzt.  
Deshalb sollten beide BAT-File im gleichen Verzeichnis sein.
SOX dient dem Anheben der Lautstärke von ac3-Stream, da diese of zu leise sind.
Die Tests beginnen ab der 3. Video-Minute - eventuell set "start=-ss 00:03:00.000"  anpassen.  
Mit %snip% können kurze, unsaubere Video-Anfänge (max. 59 s) abgeschnitten werden. (lt. "ffmpeg" abhängig vom Arbeitsspeicher)  
"para=-sameq", mit diesem Wert versucht "ffmpeg" das Beste aus dem Input zu machen. Dieser Wert kann zu Testzwecken verändert werden.  
Die Input-Dateien werden nicht verändert oder gelöscht - diese oder die Test-Files befinden sich immer im "Spezial-Ordner"   
--- Verzeichnisse
(%ddm%)=D:\Medien\Edition\
Folgende Unterverzeichnisse von %ddm% werden in dieser Batch verwendet, bzw., sind durch die Länge ihrer Namen von Bedeutung. 
4_Umwandlung
4_Umwandlung\Filmtrans\
5_Videos
============
Entwurf und Layout by max5moritz

:Main
if not "%2"=="" set "para=%2"  
if not "%3"=="" (set "outex=%3") ELSE set "outex=mkv"  
echo %outex%>%tmp%\getlen.tmp
FOR %%i IN ("%tmp%\getlen.tmp") DO set /a "theLen=%%~zi-2"&del "%tmp%\getlen.tmp"  
if not "%3"=="" (if "%theLen%"=="3" (set "outex=%3") ELSE set "outex=mkv")  
if  "%para%"=="snip" if not "%3"=="" set "snip=-ss %3"&set "para=-sameq"  
echo Verzeichnis der Bat-Datei "%batFolder%"  
if "%input:~1,1%"==":" (goto Abfrage1) ELSE goto Abfrage2  

:Abfrage1
if "%input:~-3,1%"=="." set "inex=%input:~-3,3%"&echo 12-"!inex!"&set "name=%input:~0,-3%  
if "%input:~-4,1%"=="." set "inex=%input:~-4,4%"&echo 13-"!inex!"&set "name=%input:~0,-4%  
if "%input:~-5,1%"=="." set "inex=%input:~-5,5%"&echo 14-"!inex!"&set "name=%input:~0,-5%  
if "!process!"=="dir" set "inex=!inex:~1,4!"&goto :eof  
goto :run

:Abfrage2
if "%input:~-4,1%"=="." set "inex=%input:~-4,3%"&echo 22-"!inex!"&set "name=%input:~1,-4%  
if "%input:~-5,1%"=="." set "inex=%input:~-5,4%"&echo 23-"!inex!"&set "name=%input:~1,-5%  
if "%input:~-6,1%"=="." set "inex=%input:~-6,5%"&echo 24-"!inex!"&set "name=%input:~1,-6%  
goto :run

:run
if /I "%inex%"==".mp3" set "anzeig=Datei ist eine *.mp3"&goto ende  
call %batFolder%\start-set
if "%2"=="Handy" call %batFolder%\Handy-set  
if "%inex%"=="" goto :auto  
if "%inex:~0,1%"=="." goto :run-once  
goto ende

:run-once
set "run=once"  
if "%inex:~-3,1%"=="." (set "inex=%inex:~1,2%") ELSE set "inex=%inex:~1,3%"  
call :process
if "!proid!"=="none" (call :ohne-process) ELSE call :post-process  
cls&set "anzeig=Process-%run% hat fertig"  
goto ende

:auto
set "run=auto"&pushd "%input%"  
echo aktuelles Verzeichnis ist "%cd%"  
if "%cd:~18,6%"=="4_UMWA" set "transfer=%ddm%"  
if "%cd:~20,10%"=="Umwandlung" set "transfer=%ddm%"  
FOR /r "%cd%" %%i IN (%auto%) DO (  
	set "input=%%i"  
	set "outex=mkv"  
	set "inex=!input:~-3,3!"&set "name=!input:~0,-4!"  
	if "!inex:~-3,1!!inex:~-1,1!"==".s" set "inex=!input:~-2,2!"&set "name=!input:~0,-3!"  
	call :process
	if "!proid!"=="none" (call :ohne-process) ELSE call :post-process  
)
cls&set "anzeig=Process-%run% hat fertig"  
goto ende

:process
echo !name!.!inex!>%tmp%\!inex!.txt
findstr "~1" %tmp%\!inex!.txt  
if not errorlevel 1 if "!name:~27,8!" =="FILMTR~1" (set "pthnam=!name:~0,35!") ELSE set "pthnam=!name:~0,26!"  
if errorlevel 1 set "newpth=no"  
dir /B "!name!.!inex!">"%tmp%\!inex!.txt"  
set /p input=<"%tmp%\!inex!.txt"  
set "process=dir"&call :Abfrage1  
if "!newpth!"=="no" set "pthnam=%cd%"  
set datnam=!name!
set "name=!pthnam!\!datnam!"  
cls&echo.&set "info=echo --"!name!.!inex!"--"&!info!  
echo "%input%" >%tmp%\!inex!.txt  
find /n /i "_test" %tmp%\!inex!.txt  
if not errorlevel 1 set "para=%para% -t 30"&set "test=Test"  
if "%para:~0,1%"=="-" (set "parm3=%para%") ELSE set "parm3=%2"  
cls&echo.&!info!
call :suche
cls&color 0A&echo.&set "prostart=echo   Umwandlung wird gestartet..."  
if not "%snip%"=="" set "prostart=echo   Umwandlung wird %snip% gestartet..."  
ping -n 3 localhost 1>nul 2>nul
if "!proid!"=="none" goto :eof  
if "!proid!"=="normal" call :process0  
if "!proid!"=="mpeg1" call :process1  
if "!proid!"=="ac3" call :process2  
if "!text!"=="srt" call :process3  
color 0F&ping -n 8 localhost 1>nul 2>nul
if not "!proid!"=="normal" set "run=auto"&set "proid=none"  
call :processinfo
call :processend
goto :eof

:process0
!prostart!&echo.
echo --"!name!.!inex!"--&echo.&title Norm-Process wandelt !inex! zu !outex! mitttels (!parm!) um.  
if "%test%"=="Test" (  
	%ffmpeg% %start% -i "!name!.!inex!" !parm! "!name!+.!outex!" & pause  
) ELSE %ffmpeg% -i "!name!.!inex!" !parm! %snip% "!name!+.!outex!"  
set "trans=normal"  
goto :eof

:process1
set "outex=mp4"&!prostart!&echo.  
echo --!name!--&echo.&title MPG-Process, Video in Einzel-Streams zerlegen
if "test"=="Test" (  
	%ffmpeg% %start% -i "!name!.!inex!" !parm1! -an -t30 "!name!-.mpeg"  
) ELSE %ffmpeg% -i "!name!.!inex!" !parm1! -an "!name!-.mpeg"  
title MPG-Process, transkodiere Audio-Stream zu MP3
if "test"=="Test" (  
	%ffmpeg% %start% -i "!name!.!inex!" -vn -acodec libmp3lame -sameq -t 30 "!name!-.mp3"  
) ELSE %ffmpeg% -i "!name!.!inex!" -vn -acodec libmp3lame -sameq "!name!-.mp3"  
title MPG-Process, transkodiere Video-Stream / alle Streams zu !outex! muxen
%ffmpeg% -i "!name!-.mpeg" -i "!name!-.mp3" !parm2! -sameq %snip% "!name!+.!outex!"  
set "trans=mpg"  
goto :eof

:process2
set "outex=mkv"&!prostart!&echo.  
echo --!name!--&echo.
title AC3-Process, Video in Einzel-Streams zerlegen
if "%test%"=="Test" (  
	%ffmpeg% %start%  -i "!name!.!inex!" !parm1! -an -t 30 "!name!-.mp4"  
) ELSE %ffmpeg% -i "!name!.!inex!" !parm1! -an "!name!-.mp4"  
if "%test%"=="Test" (  
	%ffmpeg% %start%  -i "!name!.!inex!" -vn !parm2! -t 30 "!name!-.aac"  
) ELSE %ffmpeg% -i "!name!.!inex!" -vn !parm2! "!name!-.aac"  
title AC3-Process, korrigieren des Audio-Streams
%ffmpeg% -y -i "!name!-.aac" -ac 6 -ar 48000 -acodec pcm_s16le -f wav - | %sox% -G --volume 2.5 -s -b 16 -c 6 -r 48000 -t raw - -t wav - | %ffmpeg% -y -i - -ab 576000 -ac 6 -ar 48000 "!name!-.ac3"  
title AC3-Process, transkodiere Video-Stream / alle Streams zu !outex! muxen
%ffmpeg% -i "!name!-.mp4" -i "!name!-.ac3" !parm2! %snip% "!name!+.!outex!"  
set "trans=ac3"  
goto :eof

:process3
set "outex=mkv"&!prostart!&echo.  
set "parmsrt=-i "!name!.srt" -scodec copy"  
if not "!trans!"=="" goto :muxen  
echo --!name!--&echo.
title SubTitel-Process, löschen der Untertitel
if "%test%"=="Test" (  
	%ffmpeg% %start% -i "!name!.!inex!" !parmstd! -t 30 "!name!-.mp4"  
) ELSE  %ffmpeg% -i "!name!.!inex!" !parmstd! "!name!-.mp4"  
title SubTitel-Process, alle Streams transkodieren und zu !outex! muxen
if "%test%"=="Test" (  
	%ffmpeg% %start% -i "!name!-.mp4" !parm! "!name!+.!outex!"  
) ELSE  %ffmpeg% -i "!name!-.mp4" !parmA! %snip% "!name!+.!outex!"  
if "!text!"=="srt" goto :muxen  
goto :eof
:muxen
title SubTitel-Process, Untertitel ins Video zu !outex! muxen
if not "!trans!"=="" (  
	%ffmpeg% -i "!name!+.!outex!" !parmsrt! %parmstd:~0,-4% "!name!_.!outex!"  
) ELSE %ffmpeg% -i "!name!+.!outex!" !parmsrt! !snip! %parmstd:~0,-4% "!name!_.!outex!"  
ping -n 5 localhost 1>nul 2>nul
if exist "!name!+.!outex!" move /y "!name!+.!outex!" "!name!-.!outex!"  
ping -n 5 localhost 1>nul 2>nul
if exist "!name!_.!outex!" move /y "!name!_.!outex!" "!name!+.!outex!"  
goto :eof

:processinfo
set "info=MediaInfo von "!name!.!outex!""  
if "test"=="Test" (Pause) ELSE REM Pause  
mode con cols=100 lines=100&cls&color 0E&echo.&title !info!&echo  !info
%mediainfo% "!name!+.!outex!">"!name!+.txt"  
%mediainfo% "!name!+.!outex!"  
echo.&echo  Fenster schlieát in 8 Sekunden
ping -n 15 localhost 1>nul 2>nul
goto :eof

:processend
set "info=Dateien werden verschoben..."  
mode con cols=75 lines=5&cls&color 0A&echo.&title !info!
cls&color 0A&echo.&echo  !info!
if "!run!"=="auto" if not "%test%"=="Test" move /y "!name!.*" "%weg%"  
if "%test%"=="Test" (  
	move /y "!name!+.!outex!" "!name!_TEST.!outex!"  
	move /y "!name!+.txt" "!name!_TEST.txt"  
	ping -n 5 localhost 1>nul 2>nul
	move /y "!name!_TEST.*" "%weg%"  
)
if "!run!"=="auto" if exist "!name!-.*" move /y "!name!-.*" "%weg%"  
goto :eof

:post-process
if "!run!"=="once" (set "info=  Prozess wird beendet...") ELSE set "info=  ein neuer Prozess wird gestartet..."  
mode con cols=75 lines=40&cls&color 0A&echo.&echo !info!&title !info!
ping -n 5 localhost 1>nul 2>nul&color 0F
if exist "!name!+.!outex!" (  
	move /y "!name!+.!outex!" "!name!.!outex!"  
	if exist "!name!+.txt" move /y "!name!+.txt" "!name!.txt"  
	if not "!transfer!"=="" (  
			if exist "!transfer!5_Videos\!datnam!.!outex!" (  
			set "t-name="!transfer!5_Videos\!datnam!"  
			move /y "!t-name!.*" "!t-name!_save.*"  
			))
	move /y "!name!.*" "!transfer!5_Videos"  
)
if exist "!name!-.*" move /y "!name!-.*" "%weg%"  
ping -n 5 localhost 1>nul 2>nul
del %tmp%\!inex!.txt
goto :eof

:ohne-process
if "!sub!"=="text" (set "info=  Erst demuxen...") ELSE set "info=  Video ist bereits transkodiert"   
mode con cols=100 lines=10&cls&color E0&echo.&title !info!
if "!sub!"=="text" (  
	echo  SubTitel gefunden:
	echo  "!name!.!inex!"&echo.  
	echo  Datei wird ausgelassen, mit "TSDoctor" oder "ProjektX" demuxen  
	move /y "!name!.!inex!" "!name!_demuxen.!inex!"  
) ELSE echo  Fenster schlieát in 8 Sekunden
ping -n 10 localhost 1>nul 2>nul
goto :eof

:suche
set "info=suche Parameter..."  
title !info!&echo.&echo  !info!
ping -n 3 localhost 1>nul 2>nul
%ffmpeg% -i "!name!.!inex!" 2> %tmp%\!inex!.txt  
:subtitle
if exist "!name!.srt" set "text=srt"&goto :audio-mp2  
findstr /c:"Subtitle: text" %tmp%\!inex!.txt  
if not errorlevel 1 set parmV=&set "text=text"&goto :audio-mp2  
find /n /i "dvb_subtitle" %tmp%\!inex!.txt  
if not errorlevel 1 set "proid=none"&set "sub=text"&goto :eof  
:video-0
find /n /i "Video:" %tmp%\!inex!.txt  
if errorlevel 1 set "outex=mp3"&goto :audio-mp2  
findstr /c:"Video: none" %tmp%\!inex!.txt  
if not errorlevel 1 set "outex=mp3"&goto :audio-mp2  
if /I "%inex%"=="mp4" set "sv=mp4"&goto :video-HD  
:video-1
findstr "mpeg1video" %tmp%\!inex!.txt  
if not errorlevel 1 set parmV=&set "proid=mpeg1"&goto :audio-mp2  
:video-2
findstr "wmv1 mpeg2video" %tmp%\!inex!.txt  
if not errorlevel 1 set "parmV=  
:video-4
findstr "mpeg4" %tmp%\!inex!.txt  
if not errorlevel 1 set parmV=
set "proid=normal"&set "outex=mp4"&goto :audio-mp2  
:video-HD
findstr "h264" %tmp%\!inex!.txt  
if not errorlevel 1 set "parmV=!parm1!"&set "outex=mkv"&set "proid=normal"& (  
if "!sv!"=="mp4" set "bild=h264"&set "proid=none"&goto :eof  
)
:audio-mp2
findstr "wmav2 mp2 pcm_u8" %tmp%\!inex!.txt  
REM if not errorlevel 1 set "parmA=-acodec libmp3lame"  
if not errorlevel 1 set "parmA=-acodec libmp3lame"  
:audio-mp3
findstr /c:"Audio: mp3" %tmp%\!inex!.txt  
if not errorlevel 1 set "parmA=!parm2!"  
set "proid=normal"&goto :suchend  
:audio-ac3
findstr "ac3" %tmp%\!inex!.txt  
if not errorlevel 1 set parmA=&set "proid=ac3"  
if "!sv!"=="mp4" set "outex=mkv"&set "parmA=!parm2!"  
:suchend
if "!parm3:~0,6!"=="-sameq" (if "!text!"=="text" (set "parm=!parmV! !parmA! !parm3! -scodec copy")ELSE set "parm=!parmV! !parmA! !parm3! -sn") ELSE set "parm=!parm3!")  
if "!parm:~0,2!"==" -"  set "parm=!parm:~1,500!"  
if not "!name!.!inex!"=="!name!.!outex!" (if exist "!name!.!outex!" move /y "!name!.!outex!" "!name!_save.!outex!")  
mode con cols=130 lines=63
cls&color 0A&echo.&echo   Diese Parameter wurden gefunden:
echo.&echo --"!name!.!inex!"--&echo.&echo  --"!parm!"--  
echo --------------------------------------------------
ping -n 5 localhost 1>nul 2>nul&color 0F&echo.
type %tmp%\!inex!.txt&echo.
echo ______________________________
echo   Parameter-Suche beendet...
ping -n 10 localhost 1>nul 2>nul
goto :eof

:help
mode con cols=75 lines=10&cls&color 3E&echo.&title Hilfe zu %~n0
echo  Entweder eine Media-Container-Datei
echo  (%auto%)&echo.
echo  auf den Link ziehen oder&echo.
echo  ein komplettes Verzeichnis mit Media-Dateien.&echo.
ping -n 12 localhost 1>nul 2>nul

:ende
if not n%1==n mode con cols=75 lines=5&color 3E&title %~n0 ist beendet&echo.&echo  %anzeig%&echo.
echo  Fenster schlieát in 8 Sekunden
ping -n 8 localhost 1>nul 2>nul&exit

Content-Key: 185168

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

Printed on: April 26, 2024 at 23:04 o'clock