2017-03-28 3 views
0

ich diese Batchdatei haben ffmpeg mit einem Logo meine Videos hinzufügen und dann ein Intro hinzufügen, aber es ist überall von 10 Stunden bis zu einem Tag nehmen, je nachdem, wie viele ich Wasserzeichen haben, ist es eine effizientere Art und Weise, dies zu erreichen? Die Videos haben manchmal unterschiedliche Auflösungen, daher kann ich die Konvertierung in die 1280 * 720 Größe nicht entfernen.Gibt es eine effizientere Möglichkeit, Videos durch fmpeg mit Wasserzeichen zu versehen und Videos hinzuzufügen?

for %%I in ("C:\Users\Administrator\Desktop\work\*.mp4") do ffmpeg.exe -y -i "%%I" -i white.png -filter_complex "[0:v]scale=iw:ih[v0];[1:v][v0]scale2ref=iw/6:ih/18[logo][0v];[0v][logo]overlay=W-w-3:H-h-1[v]" -map "[v]" -map 0:a -codec:v libx264 -preset ultrafast -crf 23 -codec:a copy "C:\Users\Administrator\Desktop\Complete-videos\%%~nI.mp4" 

for %%I in ("C:\Users\Administrator\Desktop\work\*.mp4") do ffmpeg -y -i %%I -c copy -vbsf h264_mp4toannexb -f mpegts -s 1280*720 %%I.ts && ffmpeg -y -i "concat:out1.ts|%%I.ts|out1.ts" -c:v libx264 -strict experimental -bsf:a aac_adtstoasc -ar 48000 -r 20 "C:\Users\Administrator\Desktop\Complete-videos\%%~nI.mp4" 
pause 
+2

Eine Frage zur Verbesserung eines bereits funktionierenden Codes sollte in [Code Review] (http://codereview.stackexchange.com/) gestellt werden. – Mofi

+0

Warum in Ihrem ersten Befehl der erste Skalierungsfilter? In Ihrem zweiten Befehl hat die Größenoption keinen Effekt, da Sie die Streams kopieren. Sie können all dies in einem Befehl ausführen und einen Videocodierungsschritt überspringen. Ihr endgültiger Codierungsschritt könnte eine schnelle Voreinstellung verwenden. Es macht keinen großen Unterschied in der Qualität. – Mulvya

+0

Werden die ersten Befehlsergebnisse nicht durch die zweite überschrieben? – Magoo

Antwort

1

Einzelbefehl:

ffmpeg -i main.mp4 -i white.png -i out1.ts -filter_complex 
    "[1][0]scale2ref=iw/6:ih/18[logo][0v];[0v][logo]overlay=W-w-3:H-h-1,scale=hd720[vid]; 
    [2][2:a][vid][0:a][2][2:a]concat=n=3:v=1:a=1[v][a]" 
-map "[v]" -map "[a]" -r 20 -preset fast -ar 48000 out.mp4 
1
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
:: make a tempdir 
:maketemp 
SET "tempdir=%temp%\%random%" 
IF EXIST "%tempdir%\" (GOTO maketemp) ELSE (MD "%tempdir%") 

:: read each filename from source and process 

for %%I in ("%sourcedir%\*.txt") DO (
    TITLE Processing %%I 
    START "%%I" q43060025s "%%I" 
    CALL :wait 10 
) 
CALL :wait 1 
RD "%tempdir%" 

GOTO :EOF 

:: monitor number of files in temp directory and return if fewer than %1 
:wait 
:: wait 1 second 
timeout /t 1 >NUL 
FOR /f %%c IN ('dir /b /a-d "%tempdir%\*" 2^>nul ^| find /c /v "" ') DO IF %%c geq %1 GOTO wait 
GOTO :eof 

Sie müssten die Einstellung von sourcedir zu ändern, um Ihre Umstände anzupassen. Ich habe einige Dummy .txt Dateien zum Testen verwendet.

Die Zeitanforderung wird wahrscheinlich verursacht, weil Sie die Dateien seriell verarbeiten. Die Lösung besteht darin, die Dateien parallel zu verarbeiten, indem die Leistungsfähigkeit der mehreren Kerne in modernen PCs genutzt wird.

Die Idee hier ist ein temporäres Verzeichnis machen Steuerdateien enthalten soll, dann jede Datei verarbeiten, um eine Unterprozedur Charge mit (q43060025s.bat)

Die Unterprozedur der rufenden Prozedur Umwelt erbt, so wird tempdir hergestellt werden .

@ECHO OFF 
SETLOCAL 
:: do some operation on the filename passed as %1 
title processing %~1 
ECHO %time%>"%tempdir%\%~n1" 
:: 4 to 21-second delay 
SET /a delay=%RANDOM% %% 18 + 4 
timeout /t %delay% >NUL 
DEL "%tempdir%\%~n1" 
CLS 
exit 

Also - die Unterprozedur hier ist ein Dummy zur Demonstration. Es verwendet tempdir und erstellt eine Datei in diesem Verzeichnis mit dem Namen der Datei zu verarbeitet werden, die etwas - Früher habe ich nur die Zeit.

Meine Sub-Prozedur verzögert dann einfach für 4 bis 21 Sekunden und simuliert einen Prozess mit einer variablen Verarbeitungszeit.

Anschließend löscht er die Datei, erstellt und beendet.

Die Hauptprozedur überwacht die Anzahl der Dateien im temporären Verzeichnis, dh die Anzahl der ausgeführten Unterprozesse. Zählen Sie einfach die Dateien und wenn die Anzahl größer oder gleich dem übergebenen Parameter ist, warten Sie 1 Sekunde und versuchen Sie es erneut.

Wenn die Unterprozedur ihre Arbeit beendet, wird die Zählung reduziert und die Routine :wait wird beendet. Die nächste Datei wird ausgewählt, an den Unterprozess gesendet und wir warten erneut.

Wenn die letzte Datei gesendet wurde, warten wir weiter, bis die Anzahl der Unterprozesse null ist (dh kleiner als 1), wenn wir das temporäre Verzeichnis löschen können.

Also - alles, was Sie tun müssen, ist Ihre Verarbeitung anstelle der Verzögerung Routine in q43060025s mit dem Dateinamen als %1 übergeben und Ihr Problem sollte gelöst werden.

+0

Ausgezeichnete Antwort! Es kam mir nicht in den Sinn, es parallel zu implementieren, ich werde sehen, ob ich meinen Code so anpassen kann, dass er funktioniert. –

Verwandte Themen