max5moritz
Goto Top

Filme und Medienstreams einfach konvertieren

ffmpeg als Lösung

Hallo Users,

Konvertierungstools gibt es reichlich, oft verlangen selbst die Programme mit Oberfläche mehr, als der "Durchschnitts"-User versteht.
Fast entsteht der Eindruck, dass selbst das produzierende Film-Gewerbe bei der Vielzahl der Verpackungs-Möglichkeiten nicht mehr "durchsieht".
Doch Dank der Freeware "ffmpeg" ist es möglich, sich die "Arbeit" ganz einfach zu machen!

Bevor gleich alle aufschreien: "ffmpeg" versteht ja nur Kommandozeile!
Doch es geht - ffmpeg kann es wirklich, man muss dem Programm nur sagen, was man will.

Dabei hilft das folgende Bat-File. Und in Verbindung mit einem Link auf diese Bat-File benötigt niemand besondere Kodierungs- oder BAT-Kenntnisse.
Speicher-Ort und Name für BAT und Link sind beliebig, einfach eine Datei oder einen Ordner auf den Link ziehen, fertig. Aber: Bitte den Hinweis beachten!

Derzeit sind im Auto-Betrieb folgende Eingangs-Formate implementiert: *.avi, *.flv, *.mpg, *.ps, *.ts, *.wmv
Per Einzel-Test können alle Dateien ausprobiert werden, deren EXT (Erweiterung) genau 3 Zeichen enthält - ffmpeg ist wirklich mächtig.
Wer will, kann auch per Aufruf: Bat-File "Input-Datei" "Parameter" Output-EXT spezielle Tests durchführen.
Die Output-EXT sollte genau 3 Zeichen enthalten.
Wer erst einmal einen Probelauf machen will, hängt an den Datei- oder Ordnernamen "_test" an (ohne Anführungszeichen).
Dann werden kurze Test-Files von ca. 30 s Länge erzeugt. Damit kann bereits die Qualität recht gut beurteilt werden.
Die Eingabe-Dateien (Input) werden natürlich nicht verändert oder gelöscht. Sie "landen" nur in dem Spezial-Ordner.

::Bat-File-Name: Media-Convert, Version: 0.99_2012-05-10
::Media-Container-File(s) in *.mp4 oder *.mkv oder *.mp3 umwandeln
::Unterstützte Eingangs-Formate mindestens siehe set "auto= / Alternativ per Einzelprobe testen / ffmpeg ist recht clever! 
::Hinweis zu den Variablen %ffmpeg%, %sox% und %mediainfo% (Pfad+Programmename), im Programm-Paket "Hybrid"  
::ist alles enthalten, sowie %weg% (Ordner, der als zentraler Spezial-Papierkorb dient).
::Diese werden durch den Aufruf von start-set gesetzt, d.h., beide BAT-File sollten im gleichen Verzeichnis sein.
::SOX dient dem Anheben der Lautstärke von ac3-Stream, da diese of zu leise sind
::Der Parameter "-t 30" (ohne Anführungszeichen) muss immer am Ende von %para% stehen, damit der Test-Lauf richtig funktioniert. 
::Die Tests beginnen ab der 5. Video-Minute - eventuell set "start=-ss 00:05:00.000"  anpassen. 
::%para% "-sameq" - ffmpeg versucht, 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"  
::Entwurf und Layout by max5moritz
@echo off&setlocal enabledelayedexpansion
set "inex=flv"  
set "input=%1"  
set "para=-sameq"  
set "start=-ss 00:05:00.000"  
set "Verzeichnis=%~dp0"  
set "auto=*.avi, *.flv, *.mpg, *.ps, *.ts, *.wmv"  
if n%1==n goto help
set "parm1=-vcodec copy"&set "parm2=-acodec copy"  
set "parmstd=%parm1% %parm2%"  
echo "%input%" >%tmp%\input.tmp  
find /n /i "_test" %tmp%\input.tmp  
if errorlevel 1 set "para=%para%"&goto :weiter  
set "para=%para% -t 30"  
:weiter
del %tmp%\input.tmp
if not "%2"=="" (set "para=%2") ELSE set "para=%para%"  
if "%para:~0,1%"=="-" (set "parm3=%para%") ELSE set "parm3=%para%"  
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 "%theLen%"=="3" (set "outex=%3") ELSE set "outex=mkv"  
echo Verzeichnis der Bat-Datei "%verzeichnis%"  
if "%input:~1,1%"==":" (goto Abfrage1) ELSE goto Abfrage2  

:Abfrage1
set "name=%input:~0,-4%"&set "inex=%input:~-4,4%"  
if /I "%inex:~1,3%"==".ps" set "inex=%inex:~1,3%"&set "input=%input:~0,-3%"  
if /I "%inex:~1,3%"==".ts" set "inex=%inex:~1,3%"&set "input=%input:~0,-3%"  
if "%inex:~-3,1%%inex:~-1,1%"==".s" set "name=%input%"  
goto :run

:Abfrage2
set "name=%input:~1,-5%"&set "inex=%input:~-5,4%"  
if /I "%inex:~1,3%"==".ps" set "inex=%inex:~1,4%"&set "input=%input:~1,-4%"  
if /I "%inex:~1,3%"==".ts" set "inex=%inex:~1,4%"&set "input=%input:~1,-4%"  
if "%inex:~-3,1%%inex:~-1,1%"==".s" set "name=%input%"  
goto :run

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

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

:auto
set "run=auto"&pushd "%input%"  
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!"  
	set "parm=-vcodec copy -acodec copy"  
	echo aktuelles Verzeichnis ist "%cd%"	  
	call :process
	call :post-process
)
cls&set "anzeig=Process-auto hat fertig"  
goto ende

:process
mode con cols=130 lines=63&cls&color 0F&echo.
echo --"!name!.!inex!"--  
ping -n 5 localhost 1>nul 2>nul
call :suche
if "!bild!"=="mpeg1" call :process1  
if "!ton!"=="ac3" call :process2  
echo --"!name!.!inex!"--&echo.&title !inex! to !outex! with !parm!  
if "%para:~-5,2%"=="-t"  (%ffmpeg% %start% -i "!name!.!inex!" !parm! "!name!+.!outex!") ELSE %ffmpeg% -i "!name!.!inex!" !parm! "!name!+.!outex!"  
REM pause
:process-info
cls&color 0E&echo.&echo  MediaInfo werden geladen...
%mediainfo% -f "!name!+.!outex!">"!name!+.txt"  
%mediainfo% -f "!name!+.!outex!"  
echo.&echo  Fenster schlieát in 8 Sekunden
ping -n 15 localhost 1>nul 2>nul
call :processend
goto :eof

:processend
mode con cols=75 lines=5&cls&color 0A&echo.
cls&color 0A&echo.&echo  Dateien werden verschoben...
if "!run!"=="auto" if not "%para:~-5,2%"=="-t" move /y "!name!.*" "%weg%"  
if "%para:~-5,2%"=="-t" (  
	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

:process1
set "outex=mp4"  
echo --!name!--&echo.&title !inex! to !outex! with !parmstd! als mp3-process
if "%para:~-5,2%"=="-t"  (%ffmpeg% %start% -i "!name!.!inex!" -vcodec copy -an "!name!-.mpeg") ELSE %ffmpeg% -i "!name!.!inex!" -vcodec copy -an "!name!-.mpeg"  
if "%para:~-5,2%"=="-t"  (%ffmpeg% %start% -i "!name!.!inex!" -vn -acodec libmp3lame -sameq "!name!-.mp3") ELSE %ffmpeg% -i "!name!.!inex!" -vn -acodec libmp3lame -sameq "!name!-.mp3"  
%ffmpeg% -i "!name!-.mpeg" -i "!name!-.mp3" !parmstd! "!name!+.!outex!"  
ping -n 8 localhost 1>nul 2>nul
set "run=auto"  
goto :process-info

:process2
set "outex=mkv"  
echo --!name!--&echo.&title !inex! to !outex! with !parmstd! als ac3-process
if "%para:~-5,2%"=="-t"  (%ffmpeg% %start%  -i "!name!.!inex!" -vcodec copy -an "!name!-.mp4") ELSE %ffmpeg% -i "!name!.!inex!" -vcodec copy -an "!name!-.mp4"  
if "%para:~-5,2%"=="-t"  (%ffmpeg% %start%  -i "!name!.!inex!" -vn -acodec copy "!name!-.aac") ELSE %ffmpeg% -i "!name!.!inex!" -vn -acodec copy "!name!-.aac"  
%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"  
%ffmpeg% -i "!name!-.mp4" -i "!name!-.ac3" !parmstd! "!name!+.!outex!"  
ping -n 8 localhost 1>nul 2>nul
set "run=auto"  
goto :process-info

:post-process
mode con cols=75 lines=5&cls&color 0A&echo.
if "!run!"=="auto" (echo  ein neuer Prozess wird gestartet...) ELSE echo  Prozess wird beendet...   
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"  
ping -n 5 localhost 1>nul 2>nul
goto :eof

:suche
set "info=suche Parameter..."&title !info!  
%ffmpeg% -i "!name!.!inex!" 2> %tmp%\!inex!.txt  
::kein Video >> mp3
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  

::Video: "flv1 vp6f" Zuordnung noch offen 
::Video: wmv1 >>-vcodec mpeg4>> mp4
::Video: mpeg1video >>process1
::Video: mpeg2video >>-vcodec mpeg4>> mp4
::Video: mpeg4 >>-vcodec copy >> mp4
::Video: h264, mjpeg >>-vcodec copy >> mkv

if /I "%inex%"=="mp4" set "sv=mp4"&goto :audio-mp2  
:video1
findstr "mpeg1video" %tmp%\!inex!.txt  
if not errorlevel 1 set "bild=mpeg1"  
:video2
findstr "wmv1 mpeg2video" %tmp%\!inex!.txt  
if not errorlevel 1 set "parm1=-vcodec mpeg4"&set "outex=mp4"  
:video4
findstr "mpeg4" %tmp%\!inex!.txt  
if not errorlevel 1 set "outex=mp4"  
:videoHD
findstr "h264" %tmp%\!inex!.txt  
if not errorlevel 1 set "outex=mkv"  

::Audio: mp3 >>-acodec copy
::Audio: ac3 >>process2
::Audio: wmav2 >>-acodec libmp3lame
::Audio: mp2 >>-acodec libmp3lame

:audio-mp2
findstr "wmav2 mp2 pcm_u8" %tmp%\!inex!.txt  
REM if not errorlevel 1 set "parm2=-acodec libmp3lame"  
if not errorlevel 1 set "parm=-acodec libmp3lame"&goto :suchend  
:audio-ac3
findstr "ac3" %tmp%\!inex!.txt  
if not errorlevel 1 set "ton=ac3"  
if "!sv!"=="mp4" set "outex=mkv"&set "parm=!parm2!"&goto :suchend  
if "!parm3:~0,6!"=="-sameq" (set "parm=!parm1! !parm2! !parm3!") ELSE set "parm=!parm3!"  

:suchend
if "!parm3:~0,6!"=="-sameq" (set "parm=!parm! !parm3!") ELSE set "parm=!parm3!"  
if exist "!name!.!outex!" move /y "!name!.!outex!" "!name!_save.!outex!"  
cls&color 0A&echo.&echo   Parameter-Suche beendet...
echo.&echo --"!name!.!inex!"--  
ping -n 3 localhost 1>nul 2>nul&color 0F&echo.
type %tmp%\!inex!.txt
ping -n 10 localhost 1>nul 2>nul
cls&color 0A&echo.&echo   Umwandlung wird gestartet...&echo.
ping -n 3 localhost 1>nul 2>nul&color 0F
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

Die Hinweise stehen zwar bereits in der BAT, doch für die Schnell-Leser:
%ffmpeg%, %sox% und %mediainfo% sind als Variable in der start-set definiert. Diese enthält den Pfad inlusive Programm (z.B.: ...\bin\ffmpeg),
ebenso %weg% ein Ordner zum Sammeln der bearbeiteten Dateien bevor der letzte Lösch-Befehl kommt.
Wer das so nicht mag (extra BAT), kann diese Angaben mit oben "set"-zen.
Benötigt werden also die Freeware-Programme "ffmpeg", "SOX" und "MediaInfo", die per Internet-Suche schnell gefunden sind.
Am einfachsten das Paket Hybrid, dort erhältlich, herunterladen. Darin sind alle Programme enthalten.

Das Tool sagt also ffmpeg folgendes:
1. Name der zu bearbeitenden Datei(en)
2. Inhalt der Streams
3. Prozecc der verwendet werden soll
3.1. Einfaches Umlabeln (Containern) auf MP4 oder MKV oder, falls nur Audio, MP3
3.2. Trennen der Streams, umkodieren der Audiospur und zusammenfügen zu MP4
3.3. Trennen der Streams und zusammenfügen zu MKV
3.4. Komplett neu Umkodieren zu MKV
4. Erstellen von Output-Infos
5. Verschieben der Input-Datei oder Test-Files in den "Spezial-Papierkorb"

Der Link läßt die Wahl zwischen einer einzelnen Datei oder komplette Ordner samt Unterordner.
"_test" - mit Unterstrich, Schreibweise sonst ist es egal - erzeugt einen Probelauf, der ab der 5. Video-Minute beginnt.
Dank der eigenen tollen Programm-Routinen sorgt ffmpeg dafür, dass die Qualität nicht leidet und reichlich Platz gespart wird.
Die Zwei REM-Stellen haben folgenden Grund:
Zeile 90 - Pause, damit bei Bedarf die Hinweise von ffmpeg gelesen werden können.
Zeile 180 - IF, auf Wunsch mal ausprobieren. Dann den REM in Zeile 181 setzen!
Die Gewählte Einstellung (Zeile 181) bewirkt ein Umkodieren des Films, die Zeile 180 nur ein "Umlabeln"

Nun bitte ich um fleißiges Ausprobieren und Rückinfos, insbesondere zu gefundenen Codecs, damit ich diese einpflegen kann.
Verbesserungsvorschläge zum Skript-Ablauf freuen mich natürlich auch, dito, Fehlerhinweise.
Die geteste Umgebung: WinXP + SP3.
Doch dürfte das Bat-File sicherlich auch auf den anderen Win-Systemen laufen, auf denen auch ffmpeg es kann.

Ich danke für Eure Aufmerksamkeit.
max5moritz

Content-ID: 184642

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

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

drnatur
drnatur 10.05.2012 um 19:06:08 Uhr
Goto Top
hallo max5moritz,

Hut ab vor deiner Arbeit

da du dich anscheinend sehr für Video- und Audiobearbeitung interessierst, könnte dir vielleicht das Tool "WinFF", zu finden unter http://www.winff.org eine große Hilfe sein.
Denn das ist so ähnlich wie deine Batch-Datei, nur eben eine grafische Oberfläche für FFMPEG.
D.h., in das GUI können mehrere Dateien per Drag-&-Drop gezogen werden, die dann alle ins gewünschte Verzeichnis und Ausgabeformat gebracht werden.

liebe Grüße,
drnatur
max5moritz
max5moritz 18.05.2012 um 15:30:34 Uhr
Goto Top
Hallo drnatur,

danke für Deinen Hinweis. Zwar gehört WinFF bereits schon zu den GUI, die die Sache versuchen, möglichst einfach zu gestalten.
Doch ist mir das aber immer noch nicht einfach genug. Deshalb die Batch.

Einfach eine Datei darauf, oder einen Ordner, Umwandlung abwarten, fertig. Nix zum Einstellen, etc. p.p.
Mein Ansatz war, möglichst beste Qualität bei höchster Komprimierung - ffmpeg organisert das selbst ganz gut.
Die Umwandlung findet immer in dem Ordner statt, in welchem sich der Input befindet.

Inzwischen habe ich den Skipt weiter entwicklet.
In Kombination mit einem AutoHotKey-Skript (*.ahk) können jetzt "Sonderwünsche" verarbeitet werden.

Herzlichst,
max5moritz