返回列表 发帖

[文件操作] 批处理怎样通过ffmpeg实现将目录下不同片源视频同一帧输出图片对比呢?

本帖最后由 1139054012 于 2025-3-4 23:29 编辑

前提条件目录下视频时轴可能不同,需要根据第一个输出的图片来识别后续视频是否同一帧对比


这个是时轴相同,或前面时轴相同,最后多了几分不影响,输出同一帧视频的图片成功了
预览图
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :: 设置参数
  4. set "target_time=00:10:00"  :: 指定时间点(格式:HH:MM:SS)
  5. set "output_dir=输出图片"  :: 输出目录
  6. set "tolerance=0"  :: 图片相似度容差(0-1,值越小越严格)
  7. set "scale_width=1920"  :: 输出图片宽度
  8. set "scale_height=1080"  :: 输出图片高度
  9. :: 创建输出目录
  10. if not exist "%output_dir%" mkdir "%output_dir%"
  11. :: 遍历当前目录下的所有视频文件
  12. for %%f in (*.mkv *.mp4 *.avi *.mov) do (
  13.     echo 正在处理文件: %%f
  14.     set "output_file=%output_dir%\%%~nf.png"
  15.     :: 提取指定时间点的帧并缩放
  16.     ffmpeg -i "%%f" -ss %target_time% -vframes 1 -vf scale=%scale_width%:%scale_height% -q:v 2 "!output_file!" -y
  17.     :: 检查图片是否有效
  18.     if not exist "!output_file!" (
  19.         echo 错误:无法提取帧,尝试调整时间轴...
  20.         :: 尝试调整时间轴(向前或向后 1 秒)
  21.         for /L %%i in (1,1,5) do (
  22.             set "adjusted_time=00:10:0%%i"
  23.             ffmpeg -i "%%f" -ss !adjusted_time! -vframes 1 -vf scale=%scale_width%:%scale_height% -q:v 2 "!output_file!" -y
  24.             if exist "!output_file!" (
  25.                 echo 成功提取帧,调整时间为: !adjusted_time!
  26.                 goto :next_file
  27.             )
  28.         )
  29.         echo 错误:无法提取帧,跳过文件: %%f
  30.         goto :next_file
  31.     )
  32.     :: 对比图片内容(如果存在前一个文件的图片)
  33.     if exist "prev_frame.png" (
  34.         ffmpeg -i "prev_frame.png" -i "!output_file!" -lavfi "ssim=stats_file=ssim_log.txt" -f null -
  35.         for /F "tokens=2 delims= " %%a in ('findstr "All" ssim_log.txt') do (
  36.             set "similarity=%%a"
  37.         )
  38.         echo 图片相似度: !similarity!
  39.         if !similarity! LSS %tolerance% (
  40.             echo 图片不同,尝试调整时间轴...
  41.             :: 尝试调整时间轴(向前或向后 1 秒)
  42.             for /L %%i in (1,1,5) do (
  43.                 set "adjusted_time=00:10:0%%i"
  44.                 ffmpeg -i "%%f" -ss !adjusted_time! -vframes 1 -vf scale=%scale_width%:%scale_height% -q:v 2 "!output_file!" -y
  45.                 if exist "!output_file!" (
  46.                     echo 成功提取帧,调整时间为: !adjusted_time!
  47.                     goto :next_file
  48.                 )
  49.             )
  50.             echo 错误:无法提取帧,跳过文件: %%f
  51.             goto :next_file
  52.         )
  53.     )
  54.     :: 保存当前帧为前一个帧
  55.     copy "!output_file!" "prev_frame.png" >nul
  56.     :next_file
  57.     echo ------------------------------
  58. )
  59. :: 清理临时文件
  60. del "prev_frame.png" 2>nul
  61. del "ssim_log.txt" 2>nul
  62. echo 处理完成!所有帧已保存到目录: %output_dir%
  63. pause
复制代码
换成片源时轴不同的后,第二张输出的图片并没有根据输出第一张图片输出相同的图

预览图

求助坛友怎么完美实现这个功能?
而且这段代码占用CPU也太高了,可以优化下不OTL


链接:https://pan.baidu.com/s/1nnfDyy0LqNbrAUcF9BXoXg
提取码:iaa7

回复 2# smss


  文件有些大,刚才正上传,已发链接在1楼

TOP

本帖最后由 1139054012 于 2025-3-4 22:18 编辑

回复 4# smss


    https://www.bilibili.com/video/B ... e1af06af41b8b452b58

TOP

本帖最后由 1139054012 于 2025-3-4 20:19 编辑

回复 7# smss


    对,主要根据指定时轴的第1个视频输出的图来进行后续对比,最后输出图片

TOP

回复 10# smss


    其实不是比较分辨率,是看压制的效果哪个更好
目前这段代码只能固定时间轴来输出图片,  如果时轴相同,或者只是后面时轴不同的片源也就不影响,但前面时轴不同的话,后面输出的图片就不对应了,现在想知道能否实现这个功能

TOP

本帖最后由 1139054012 于 2025-3-4 23:15 编辑

回复 12# buyiyang


    是这样的

输出失败指的是
A.mkv 10:00 第一张图输出图片成功
B.mkv 时轴不同,A.MKV的10:00,可能在10:05才是同一帧

现在两个视频都输出了
A.mkv 10:00 图
B.mkv 10:00 图

现在希望获取的图是
A.mkv 10:00 图
B.mkv10:05图


另外那种算法可以缓解CPU压力,提高搜索效率呢?

TOP

返回列表