返回列表 发帖
回复 29# aloha20200628

支持哪些媒体文件?

TOP

回复 31# newswan

类同资源管理器各种媒体文件文件属性列表中的时长。可修改29楼代码中的*.mp4(扩展名),验证结果...

TOP

本帖最后由 qd2024 于 2024-1-29 23:04 编辑

回复 31# newswan


    常见 MP4  MOV   WMV  FLV  AVI  刚刚加了MP3文件测试成功 感谢

TOP

回复 27# aloha20200628

谢谢 MP4 测试成功
我尝试加上MP3的扩展名没有成功,
能否让代码支持更多这视频格式,包括音频mp3

TOP

回复  newswan


    这样   被拖到BAT上的文件夹A里 不包含 视频文件  A下有B C D等文件夹 B C D等文件 ...
qd2024 发表于 2024-1-29 20:02


这个题目有点意思,我也来练练手,欢迎测试。
1、增加了同时识别多种音频视频格式。
2、增加了文件个数统计。
3、需第3方FFmpeg,比系统自带识别格式更多。
4、避开08 09无效数字的bug
@echo off
setlocal enabledelayedexpansion
set folder=%~1
REM 请修改自己的实际路径
set ffpath=D:\FFmpeg\ffmpeg.exe
for /f "delims=" %%f in ('dir /b /ad "%~1"') do (
    set /a  foldermin=0
    set /a n=0
    pushd "%~1"
    REM 可添加多种格式,适用于一个文件夹内有多种格式的视频。
    for /f "delims=" %%i in ('dir /b /s /a-d "%%f" ^| findstr /i ".mp3$ .mp4$ .avi$ .mkv$ .rmvb$ .wmv$ .flac$ .flv$"') do (
        for /f "tokens=2 delims=, " %%a in ('%ffpath% -i "%%i" 2^>^&1 ^| findstr "Duration:"') do set "str=%%a"
        set str=!str:~0,-3!
        for /f "tokens=1-3 delims=:" %%x in ("!str!") do (
            set "hh=%%x"
            set "mm=%%y"
            set "ss=%%z"
            set /a minutes=1!hh!*60-6000
            set /a minutes+=1!mm!-100
            if !ss! neq 0 (set /a minutes+=1)
        )
        ::echo   !str!      !minutes!
        set /a  foldermin+=!minutes!  
        set /a n+=1
    )
    REM 执行更名,请去除 echo
    echo ren "%%~f" "%%~nf【共!n!个视频,总时长!foldermin!分钟】"
    set /a Totalmin+=!foldermin!
    set /a Totaln+=!n!
    popd
)
REM 执行更名,请去除 echo
echo ren "%~1" "%~n1【共!Totaln!个视频,总时长!Totalmin!分钟】"
pauseCOPY

TOP

回复 34# qd2024

27楼或29楼代码中的第5行》修改 *.mp4 为 *.mp? 即可包括 mp4/mp3 音视频文件
如果子目录中全是常见类型的音视频文件(mp4/mkv/avi/wmv/vob/ts/mpg/mp3/flac/wav/...),可修改为 *.* 通配符涵盖所有文件。

TOP

支持多级文件夹
@echo off
setlocal ENABLEDELAYEDEXPANSION
chcp 936
set ffPath=D:\Program Files
set folderPath=%~dp1
set folderName=%~nx1
pushd "%folderPath%"
call :C_get-Duration "%folderName%" time
popd
pause
exit/b
Usage: %0 <folder> <return:duration>
:C_get-Duration
setlocal
set folderName=%~1
pushd "%folderName%"
set/a level+=1
echo,
echo ----  %level%  %CD%  ----
set timeSubfolderAll=0
for /f "usebackq tokens=* delims=" %%a in (` 2^>nul dir /b /ad . `) do (
echo "%%a"
if not "%%a" == "" (
call :C_get-Duration "%%a" timeSubfolder
set/a timeSubfolderAll+=!timeSubfolder!
)
)
echo "--1--"
set time=0
for /f "usebackq tokens=* delims=" %%a in (` 2^>nul dir /b *.mp4 `) do (
for /f "usebackq" %%i in (`" "%ffpath%\ffprobe.exe" -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "%%a" "`) do (
set time=!time! + %%i
)
)
for /f "usebackq" %%a in (` powershell -command " [math]::Ceiling( (%time%) / 60 ) " `) do (
set time=%%a
)
echo %time%
echo "--2--"
set/a time=0
for /f "usebackq tokens=* delims=" %%a in (` 2^>nul dir /b *.mp4 `) do (
for /f "usebackq tokens=1,2 delims=." %%i in (`" "%ffpath%\ffprobe.exe" -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "%%a" "`) do (
set/a time+=%%i
)
)
set/a time/=60
set/a q=%time%%60
if %q% gtr 0 (set/a time+=1)
echo %time%
echo "--3--"
set/a time=0
for /f "usebackq tokens=* delims=" %%a in (` 2^>nul dir /b *.mp4 `) do (
for /f "usebackq tokens=2,3,4 delims=:. " %%i in (` ""%ffpath%\ffprobe.exe" "%%a" 2>&1 | findstr Duration" `) do (
set/a time+=1%%i*3600+1%%j*60+1%%k-100*3600-100*60-100
)
)
set/a time/=60
set/a q=%time%%60
if %q% gtr 0 (set/a time+=1)
echo %time%
set/a time+=%timeSubfolderAll%
popd
set/a level-=1
echo,
echo ----  %level%  %CD%  ----
echo ren "%folderName%" "%folderName%[%time%]"
echo,
(
endlocal
set %2=%time%
)
goto :eofCOPY

TOP

第二种比较合适这个需求

TOP

返回列表