我想要一个.bat 文件,它可以找出一个目录中所有视频(.avi、.flv、.mkv、.mov、.mp4、.swf、.webm 等)的总时间,不需要其他任何附加功能。
我只想使用 DOS 命令(Windows / .bat),必要时还想使用 ffmpeg / ffprobe。(我完全不懂 Unix/Linux 或它们的命令)我不想使用 PowerShell,只想使用纯 DOS 命令。
使用的语法必须适用于 .bat 文件而不是命令行。
此外,能够找到一组曲目的总时间也很有趣。
\directory 1 > total time 1
\directory 2 > total time 2
…
我搜索并发现以下内容,但它并没有提供我想要的内容:
#1 – 在线 DOS 命令
for %i in ("*.mp4") do ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "%i" -sexagesimal
但它没有给出总时间。它给出了目录中每个文件的时间。
#2 – DOS 批处理文件(.bat)
@echo off
˃ output.txt(
for %%F in (*.mpg *.mp4 *.mkv *.avi *.m4a *.flac *.mp3 *.wav) do (
for /f "tokens=2 delims==" %%a in (
'ffprobe "%%F" -show_entries format^=duration -sexagesimal -v quiet -of compact'
) do (
echo %%~nxF^|%%a seconds
)
)
)
pause
结果位于 output.txt 文件中并针对每个文件。
答案1
我认为这就是你的目标。不过有一些注意事项。
- 任何包含“&”符号的文件名在处理时都会导致批量出错。
- 输出以秒为单位从计算中删去了毫秒数。
- 这是针对单个目录的。需要扩展批处理才能遍历目录树。
- 我使用的是
call
与 DelayedExpansion 配对的批处理文件函数方法goto :EOF
。我个人觉得它更容易读写。 - 此批处理应
ffmpeg
位于您的路径中,并且您当前的目录应是您正在查询的目录。我将其拉出pushd D:\stupid_cat_videos
,popd
然后才发布。
注意:
您的 ffmpeg 命令将时间拼接成 HH:MM:SS:MS。我删除了该sexagesimal
参数以将其保留为秒数。事后您可以随时将其转换回 HH:MM:SS。
我希望这就是您所寻找的,或者能帮助您更接近奖品。
@echo off
SetLocal
Set TotalSeconds=0
Set TotalFiles=0
for %%F in (*.mpg *.mp4 *.mkv *.avi *.m4a *.flac *.mp3 *.wav) do call :CountLensOnFile "%%F"
echo -----------------------------------------
echo %TotalFiles% files processed.
echo Total time is %TotalSeconds% seconds.
echo -----------------------------------------
goto :EOF
EndLocal
:: -----------------------------------------------------
:CountLensOnFile
:: Calls ffprobe to calculate file time for input param 1
:: -----------------------------------------------------
Set InputFile=%~1
echo Calculating file time for %InputFile%
for /f "tokens=2 delims==" %%a in ( 'ffprobe "%InputFile%" -show_entries format^=duration -v quiet -of compact' ) do call :SplitCalcFileTime "%%a"
Set /a TotalFiles=%TotalFiles% +1
goto :EOF
:: -----------------------------------------------------
:SplitCalcFileTime
:: Calls for loop to split seconds from miliseconds
:: -----------------------------------------------------
Set InputTime=%~1
for /f "tokens=1 delims=." %%s in ('echo %InputTime%') do call :CalcFileTime "%%s"
goto :EOF
:: -----------------------------------------------------
:CalcFileTime
:: Calculates total seconds for this run
:: -----------------------------------------------------
Set NumSeconds=%~1
Set /a TotalSeconds = %TotalSeconds% + %NumSeconds%
goto :EOF