Windows: Пакетная рекурсия каталогов для определения длительности медиафайлов с помощью FFmpeg

Windows: Пакетная рекурсия каталогов для определения длительности медиафайлов с помощью FFmpeg

У меня есть различные типы медиафайлов (например, .wav, .mp4) в разных папках. Я хотел бы использовать пакетный файл для создания списка их длительностей, например:

D:\Some Folder 1\Movie File.mp4 | 2:15:23
E:\Some Folder 2\Audio File.mp3 | 0:08:17

Я бы вручную перезапустил пакетный файл на отдельных дисках, если бы это было необходимо. В идеале список должен включать что-то вроде символа |, который, как я знаю, не будет частью имени файла Windows, чтобы облегчить разделение пути и имени файла от продолжительности при разборе списка в Excel.

У меня есть команда MediaInfo, которая выводит список указанных типов файлов в одной папке, например:

mediainfo --output=General;%FileName%.%FileExtension%^|%Duration/String3%\r\n *.mp3 *.wav

У меня возникли следующие проблемы: (1) набор возможных типов файлов в папке не ограничен; я не могу быть уверен, что .mp3 и .wav (в этом примере) охватят их все; (2) я не нашел подробной документации MediaInfo, чтобы удовлетворить эту текущую потребность и быть уверенным в возможности изменить команду для будущих потребностей (см., например,Калишский); (3) Я не мастер пакетной рекурсии, хотя и пробовал несколько методов обертывания этой команды в цикл for, как описано в1 2Обсуждения StackExchange, а такжестарый форум Doom9рекомендую usebackq, у меня не получается заставить это работать с несколькими папками; и (4) в идеале я бы в любом случае научился делать это в ffmpeg/ffprobe, в рамках более долгосрочных усилий по изучению этих инструментов.

В ffprobe я обнаружил, что это работает для отдельных файлов:

ffprobe -i "input.mp4" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal

как альтернатива менее элегантному, но, возможно, более адаптивномупакетный файл-- хотя было непонятно, как получить имя файла и длительность в одной строке вывода. Но, как и в случае с MediaInfo, мне не удалось расширить это на несколько файлов (например, заменив "input.mp4" на "*.*") или сделать это рекурсивным, используя методы, указанные выше. Например, я попробовал эту адаптациюПредложение Джека Аллана:

for /R %f in (*.*) do ffprobe -i *.* -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal

но это не дало никакой информации о файле.

Мой вопрос:как использовать ffmpeg/ffprobe в пакетном файле для создания списка медиафайлов с полными путями и продолжительностью, рекурсивно взятых из нескольких папок?

решение1

Попробуйте это из пакетного файла:

for /R %%i in (*) do ffprobe -i "%%~fi" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal

Попробуйте выполнить это из командной строки:

for /R %i in (*) do ffprobe -i "%~fi" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal

решение2

Та же самая потребность здесь Я был очень заинтересован в ответе, так как я боролся и после нескольких попыток, вот неэлегантное решение, но оно сработало для меня

для /R %f в (*) сделать (echo "%~ff" >>"имя_файла.txt" & ffprobe -i "%~ff" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal >>"имя_файла.txt")

Связанный контент