根据宽度x高度将视频文件移动到文件夹的批处理脚本

根据宽度x高度将视频文件移动到文件夹的批处理脚本

我目前正在尝试编写一个批处理脚本,该脚本会根据宽度和高度将某些视频文件(主要是 .mp4)移动到新的子文件夹中,从而通过减少将不需要使用 ffmpeg 调整大小的视频文件放入新文件夹的手动劳动来加快编码速度。

例如,我的流程是这样的:我有一个包含 200 个视频文件的文件夹,所有视频分辨率都在 480p 和 4K 之间,垂直和水平。如果分辨率为 1280x720/720x1280 或更小,我不需要调整它们的大小,可以使用 -vf“scale=-1:-1”对它们进行编码。如果垂直视频大于 720x1280,我使用 -vf“scale=-1:1280”和水平 -vf“scale=1280:-1”来减小视频文件的大小以存储它们。目前,我需要手动浏览所有 200 个视频文件并相应地移动它们,这很耗时。

到目前为止,我正在使用 MediaInfo CLI 来获取宽度和高度,如下所示: mediainfo --Inform="Video;%Width%x%Height%" VIDEOFILE mediainfo --Inform="Video;%Height%x%Width%" VIDEOFILE

@echo off

rem Variables
set MEDIAINFO=C:\dont_alter\MediaInfo_CLI_22.06_Windows_x64\MediaInfo.exe

rem Script
:loopscript
mkdir no_resize
for %%a in (*.mp4) do set MP4FILE=%%~na
for /f "delims=" %%b in ('mediainfo --Inform="Video;%Width%" %MP4FILE%.mp4 2^>^&1') do set "video_width=%%b"
for /f "delims=" %%c in ('mediainfo --Inform="Video;%Height%" %MP4FILE%.mp4 2^>^&1') do set "video_height=%%c"
echo %video_width% and %video_height%
pause
if %video_width% LEQ 1280 & if %video_height% LEQ 720 do (
        move /y %MP4FILE%.mp4 no_resize
        if not errrorlevel=0 goto errorhandler
        )
goto :loopscript

:errorhandler
echo An error occured...
pause

:eof

这是我目前想到的,但我不知道如何在同一个脚本中使每个循环彼此独立。

我假设每个循环需要 2 个,一个用于水平,一个用于垂直。

不确定如何实现。有谁能帮忙吗?

提前致谢!

答案1

尝试将两个 ( %%Width%% and %%Height%%") 放在同一行并使用findstr来帮助选择文件。

@echo off

cd /d "%~dp0" && 2>nul mkdir .\no_resize

set "_mdinf=C:\dont_alter\MediaInfo_CLI_22.06_Windows_x64\MediaInfo.exe"
set "_avoid=1050 1080 1366 1440 1680 1920 2160 2560 3840 4320 7760 7680 10240 10328"

for %%a in (*.mp4)do (
     %_mdinf% --Inform="Video;%%Width%% and %%Height%%" "%%~fa"
    ) | findstr /v "%_avoid%" && >nul move /y "%%~fa" .\no_resize

在此循环之后,可以使用 bat 中的附加 for 循环调整剩余文件的大小和/或进行转换,您将在相关文件夹中创建转换后的文件...

不需要 for:label/:functionerrorhandlereachpause文件(以较大者为准),您可以等到主要工作完成后再处理每个文件......

相关内容