我使用运行 youtube-dl 的每日 cron 脚本归档了许多 Youtube 频道。然而,在检查视频以确保我的脚本正常运行时,我注意到我存档的一个频道中,有几个最新视频是以 360p 而不是 1080p60 格式下载的。我在Youtube上查看了视频,确实是360p。几天后,视频处理完成,分辨率为 1080p60。
如何列出文件夹中分辨率低于 1080p 的所有视频,以便在 Youtube 处理完成后将其删除并重新下载?
有没有办法用 ffmpeg 或其他工具来编写它?
如果有任何关于如何在将来不再出现此问题的建议,我们也将不胜感激。
答案1
正如中提到的这个答案您可以使用这样的命令来获取视频文件的尺寸:
ffprobe -v error -select_streams v:0 -show_entries stream=width -of default=nw=1:nk=1 input.mp4
这会给你输出像
1280
然后您可以决定如何处理该视频
答案2
exiftool -q -r -if '$MIMEType =~ m{^video/} and
$ImageHeight < 1080 and
print "$Directory/$FileName\0" and 0' . |
xargs -r0 echo rm -f
(假设 GNUxargs
或兼容)。
echo
将递归地删除当前目录中图像高度小于 1080 像素的所有视频(如果您删除了)。假设文件名(正确)以 UTF-8 编码(尽管请参阅-charset
其他字符集的选项)。
除了通过管道传输到 之外xargs rm
,您还可以存储在文件 ( > list
) 中,首先对该列表进行一些检查:
xargs -r0a list ls -ldrS
如果看起来不错:
xargs -r0a list rm
或者以 JSON 格式存储信息,以便您以易于阅读和解析的格式获得所有相关信息:
exiftool -q -r -j -if '$MIMEType =~ m{^video/}' \
-ImageWidth -ImageHeight -VideoFrameRate -MIMEType . > list.json
然后检查该列表,并根据一些标准删除:
PERL_UNICODE= json_xs < list.json -t none -e '
for (@{$_}) {
unlink $_->{SourceFile} if
$_->{ImageHeight} < 1080 || $_->{VideoFrameRate} < 60
}'
(请注意,我发现对于 FLV 文件,它是Videoframerate
而不是VideoFrameRate
,您可能需要注意这种不一致)。