
Ich habe verschiedene Arten von Mediendateien (z. B. .wav, .mp4) in verschiedenen Ordnern. Ich möchte eine Batchdatei verwenden, um eine Auflistung ihrer Dauer zu erstellen, wie folgt:
D:\Some Folder 1\Movie File.mp4 | 2:15:23
E:\Some Folder 2\Audio File.mp3 | 0:08:17
Ich würde die Batchdatei bei Bedarf manuell auf separaten Laufwerken erneut ausführen. Die Liste würde idealerweise etwas wie das Symbol | enthalten, von dem ich weiß, dass es nicht Teil des Windows-Dateinamens wäre, um die Trennung von Dateipfad und -name von der Dauer beim Parsen der Liste in Excel zu erleichtern.
Ich habe einen MediaInfo-Befehl, der eine Liste angegebener Dateitypen in einem einzelnen Ordner bereitstellt, wie folgt:
mediainfo --output=General;%FileName%.%FileExtension%^|%Duration/String3%\r\n *.mp3 *.wav
Meine Probleme damit sind (1) die Menge der möglichen Dateitypen in einem Ordner ist unbegrenzt; ich kann nicht sicher sein, dass .mp3 und .wav (in diesem Beispiel) sie alle erfassen; (2) ich finde keine detaillierte MediaInfo-Dokumentation, um diesen aktuellen Bedarf zu decken und sicher zu sein, den Befehl für zukünftige Anforderungen ändern zu können (siehe z. B.Kalishian); (3) Ich bin kein Batch-Rekursions-Zauberer -- das heißt, obwohl ich mehrere Methoden ausprobiert habe, diesen Befehl in eine for-Schleife einzuschließen, wie in1 2StackExchange-Diskussionen sowieein altes Doom9-ForumIch empfehle es zwar usebackq
, aber ich schaffe es nicht, es über mehrere Ordner hinweg zum Laufen zu bringen; und (4) im Idealfall würde ich sowieso lernen, wie das in ffmpeg/ffprobe geht, und zwar als Teil einer längerfristigen Anstrengung, diese Tools zu erlernen.
In ffprobe habe ich festgestellt, dass dies für einzelne Dateien funktioniert:
ffprobe -i "input.mp4" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal
als Alternative zu einem weniger eleganten, aber vielleicht anpassungsfähigerenBatchdatei-- allerdings war nicht klar, wie man Dateiname und Dauer in derselben Ausgabezeile erhält. Aber wie bei MediaInfo konnte ich dies nicht auf mehrere Dateien ausweiten (z. B. durch Ersetzen von "input.mp4" durch "*.*") oder es mit den oben genannten Methoden rekursiv machen. Ich habe beispielsweise diese Anpassung vonJack Allans Vorschlag:
for /R %f in (*.*) do ffprobe -i *.* -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal
aber das hat keine Dateiinformationen erzeugt.
Meine Frage:wie kann ich ffmpeg/ffprobe in einer Batchdatei verwenden, um eine Liste von Mediendateien mit vollständigen Pfaden und Dauern zu erstellen, die rekursiv aus mehreren Ordnern gezogen werden?
Antwort1
Versuchen Sie Folgendes mit einer Batchdatei:
for /R %%i in (*) do ffprobe -i "%%~fi" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal
Versuchen Sie Folgendes in der Eingabeaufforderung:
for /R %i in (*) do ffprobe -i "%~fi" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal
Antwort2
Gleiches Bedürfnis hier Ich war sehr an einer Antwort interessiert, da ich Probleme hatte und nach einigen Versuchen, hier ist eine unelegante Lösung, aber es hat für mich funktioniert
für /R %f in (*) mache (echo "%~ff" >>"Dateiname.txt" & ffprobe -i "%~ff" -show_entries format=Dauer -v quiet -of csv="p=0" -sexagesimal >>"Dateiname.txt")