我正在尝试对一大组视频 (1700) 进行排序。我想将宽度大于高度的视频与高度大于宽度的视频区分开来。
我在网上找到了下面的术语,您可以在其中搜索特定宽度的视频:
framewidth: <=640
我尝试改变这一点以使其对我有利,但提出了以下解决方案,但没有效果:
framewidth: < frameheight
有什么想法我可以使用“framewidth”和“frameheight”值对这些视频进行排序吗?
答案1
Windows 10 专业版 64 位
如何组织你的视频:
Explorer 不会按尺寸对视频进行排序。使用批处理文件进行排序,获取所有视频的宽度和高度,如果宽度大于高度,则移动到%userprofile%\Desktop\1
。如果多个目录中的视频更改dir /b
为dir /b /s
制作一个包含名称、宽度、高度、持续时间、比特率和采样率的文本文件,并按名称、日期、大小排序。
批处理文件:使用 md、cmd、for、dir、ffprobe、set、if 和 move 进行排序:
必须在具有管理权限的窗口中运行。
将扩展添加到dir /b *.mp4 *.mkv
用于测试清除目录 1 的桌面
如果路径中有空格则有效。
下载最新的适用于 Windows 64 位的 ffprobe、ffmpeg 和 ffplay,可从 ffmpeg.zeranoe.com
下载测试文件(5MB)来自 Google Drive
如何编写批处理文件
命令:
cmd /V
if not exist "%userprofile%\Desktop\1" md "%userprofile%\Desktop\1"
for /F "tokens=*" %g in ('dir /b *.mp4 *.mkv') do (
for /F %h in ('ffprobe.exe -v error -show_entries stream^=width -of default^=noprint_wrappers^=1:nokey^=1 "%g" 2^>^&1') do set zwidth=%h
for /F %h in ('ffprobe.exe -v error -show_entries stream^=height -of default^=noprint_wrappers^=1:nokey^=1 "%g" 2^>^&1') do set zheight=%h
if !zwidth! gtr !zheight! move /y "%g" "%userprofile%\Desktop\1"
)
rem
脚本:
setlocal enabledelayedexpansion
if not exist "%userprofile%\Desktop\1" md "%userprofile%\Desktop\1"
for /F "tokens=*" %%g in ('dir /b *.mp4 *.mkv') do (
for /F %%h in ('ffprobe.exe -v error -show_entries stream^=width -of default^=noprint_wrappers^=1:nokey^=1 "%%g" 2^>^&1') do set zwidth=%%h
for /F %%h in ('ffprobe.exe -v error -show_entries stream^=height -of default^=noprint_wrappers^=1:nokey^=1 "%%g" 2^>^&1') do set zheight=%%h
if !zwidth! gtr !zheight! move /y "%%g" "%userprofile%\Desktop\1"
)
rem
测试文件:
input270x480.mp4
input480x270 whitespace.mp4
input480x270.mp4
input270x480.mkv
input480x270 whitespace.mkv
input480x270.mkv
结果:
input480x270 whitespace.mkv
input480x270 whitespace.mp4
input480x270.mkv
input480x270.mp4
制作一个包含名称、宽度、高度、持续时间、比特率、采样率的文本文件,并按名称、日期、大小排序:
命令:
(
echo Sort by name
echo %date%
echo%time%
echo.)> sortbyname.txt
for /F "tokens=*" %g in ('dir /b *.mp4 *.mkv') do (
echo %g
echo Video Stream0:
ffprobe -v error -select_streams v:0 -show_entries stream^=width,height,duration,bit_rate -of default^=noprint_wrappers^=1 "%g"
echo Audio Stream0:
ffprobe -v error -select_streams a:0 -show_entries stream^=duration,bit_rate,sample_rate -of default^=noprint_wrappers^=1 "%g"
echo.
)>> sortbyname.txt
(
echo Sort new to old
echo %date%
echo%time%
echo.)> sortNewToOld.txt
for /F "tokens=*" %g in ('dir /b /o-d *.mp4 *.mkv') do (
echo %g
echo Video Stream0:
ffprobe -v error -select_streams v:0 -show_entries stream^=width,height,duration,bit_rate -of default^=noprint_wrappers^=1 "%g"
echo Audio Stream0:
ffprobe -v error -select_streams a:0 -show_entries stream^=duration,bit_rate,sample_rate -of default^=noprint_wrappers^=1 "%g"
echo.
)>> sortNewToOld.txt
(
echo Sort large to small
echo %date%
echo%time%
echo.)> sortLargeToSmall.txt
for /F "tokens=*" %g in ('dir /b /o-s *.mp4 *.mkv') do (
echo %g
echo Video Stream0:
ffprobe -v error -select_streams v:0 -show_entries stream^=width,height,duration,bit_rate -of default^=noprint_wrappers^=1 "%g"
echo Audio Stream0:
ffprobe -v error -select_streams a:0 -show_entries stream^=duration,bit_rate,sample_rate -of default^=noprint_wrappers^=1 "%g"
echo.
)>> sortLargeToSmall.txt
rem
脚本:
(
echo Sort by name
echo %date%
echo%time%
echo.)> sortbyname.txt
for /F "tokens=*" %%g in ('dir /b /a-d *.mp4 *.mkv') do (
echo %%g
echo Video Stream0:
ffprobe -v error -select_streams v:0 -show_entries stream^=width,height,duration,bit_rate -of default^=noprint_wrappers^=1 "%%g"
echo Audio Stream0:
ffprobe -v error -select_streams a:0 -show_entries stream^=duration,bit_rate,sample_rate -of default^=noprint_wrappers^=1 "%%g"
echo.
)>> sortbyname.txt
(
echo Sort new to old
echo %date%
echo%time%
echo.)> sortNewToOld.txt
for /F "tokens=*" %%g in ('dir /b /o-d *.mp4 *.mkv') do (
echo %%g
echo Video Stream0:
ffprobe -v error -select_streams v:0 -show_entries stream^=width,height,duration,bit_rate -of default^=noprint_wrappers^=1 "%%g"
echo Audio Stream0:
ffprobe -v error -select_streams a:0 -show_entries stream^=duration,bit_rate,sample_rate -of default^=noprint_wrappers^=1 "%%g"
echo.
)>> sortNewToOld.txt
(
echo Sort large to small
echo %date%
echo%time%
echo.)> sortLargeToSmall.txt
for /F "tokens=*" %%g in ('dir /b /o-s *.mp4 *.mkv') do (
echo %%g
echo Video Stream0:
ffprobe -v error -select_streams v:0 -show_entries stream^=width,height,duration,bit_rate -of default^=noprint_wrappers^=1 "%%g"
echo Audio Stream0:
ffprobe -v error -select_streams a:0 -show_entries stream^=duration,bit_rate,sample_rate -of default^=noprint_wrappers^=1 "%%g"
echo.
)>> sortLargeToSmall.txt
rem
答案2
Windows 资源管理器不是执行此类操作的合适工具。PowerShell 更合适。
您可以使用以下 PowerShell 脚本将所有宽度小于高度的图像移动到另一个文件夹:
$image = New-Object -ComObject Wia.ImageFile
foreach ($item in Get-ChildItem "C:\source\folder" | Where-Object Extension -In ".jpg", ".bmp", ".png") {
$image.LoadFile($item.fullname)
if ($image.Width -lt $image.Height) {
Move-Item -LiteralPath $item.FullName -Destination "C:\target\folder"
}
}
您可以直接从 PowerShell 或命令提示符运行此脚本:
powershell -File script.ps1 -ExecutionPolicy Unrestricted