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 2StackExchange 讨论以及一个旧的 Doom9 论坛推荐usebackq,我无法让它在多个文件夹中工作;(4)无论如何,我理想​​情况下还是会学习如何在 ffmpeg/ffprobe 中执行此操作,作为学习这些工具的长期努力的一部分。

在 ffprobe 中,我发现这对单个文件有效:

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

作为一种不太优雅但可能更适应的批处理文件-- 虽然不清楚如何在同一行输出中获取文件名和持续时间。但是,与 MediaInfo 一样,我无法将其扩展到多个文件(例如,将“input.mp4”替换为“*.*”)或使用上面提到的方法使其递归。例如,我尝试了这种改编Jack Allan 的建议

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" >>"filename.txt" & ffprobe -i "%~ff" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal >>"filename.txt")

相关内容