
У меня есть различные типы медиафайлов (например, .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")