找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 24677|回复: 31

[数值计算] [已解决]请教如何实现:首bat结果作为次bat变量按关联内容,顺序运作?

[复制链接]
发表于 2025-6-4 17:46:05 | 显示全部楼层 |阅读模式
本帖最后由 娃娃 于 2025-6-8 11:55 编辑

前人栽树,后人乘凉。率尔新白,饮水思源。

对于这些代码来源,先致谢忱:

提取影片长度批处理+js混编获取影片简报.cmd为批处理之家前辈@aloha20200628,

时间换算为秒time2sec.bat、分解因数factorize_optimized.bat为@百度ai,

aivideo_screenshot_auto.bat、takeSsSequence.js同为github上前辈@nilaoda。以下一切的想法也是因缘际会于nilaoda前辈的MPV连续截图教程。



感谢有你
@Five66提供准确解决方案
@aloha20200628引介新方法
@77七引介新方法
为自己的误判向77七朋友道个歉!在77七君悉心指导下,发现原来是自己粗心大意未修改ffmpeg64所致。



第一步,运行批处理+js混编获取影片简报.cmd
  1. @set @x=1 /* &@echo off
  2. dir/s/b/a-d *.mp4 *.m2ts *.wmv *.mkv *.avi>mF.lst
  3. echo,... 在当前目录下生成 "影片简报" ...
  4. (for /f "delims=" %%F in (mF.lst) do (
  5.         for /f "delims=" %%v in ('cscript /nologo /e:jscript "%~f0" "%%~dpF" "%%~nxF" ') do (
  6.                 for /f "tokens=1-2 delims=," %%1 in ("%%~v") do (
  7.                         echo,【影片名称】:%%~nF
  8.                         echo,【影片格式】:%%~xF
  9.                         echo,【影片大小】:%%1
  10.                         echo,【影片时长】:%%2 )
  11.         )
  12. ))> result.txt
  13. start result.txt
  14. (del/q mF.lst)&exit/b */
  15. var argv = WScript.arguments;
  16. var objShell = new ActiveXObject("shell.application");
  17. var objFolder = objShell.NameSpace(argv.item(0));
  18. var objFolderItem = objFolder.ParseName(argv.item(1));
  19. var sizeF = objFolder.GetDetailsOf(objFolderItem, 1);
  20. var durationF = objFolder.GetDetailsOf(objFolderItem, 27);
  21. WScript.echo(sizeF+','+durationF);
复制代码
输出
【影片名称】:Episode 01
【影片格式】:.mkv
【影片大小】:1.31 GB
【影片时长】:00:47:56


第二步,运行time2sec.bat

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "time_str=00:47:56"
  4. :: 输入时间,直接引用第一步,批处理+js混编获取影片简报.cmd输出时间值作为变量

  5. for /f "tokens=1-3 delims=:" %%a in ("%time_str%") do (
  6.     set /a "total=%%a*3600 + %%b*60 + %%c"
  7. )

  8. echo 输入时间: %time_str% > result.txt
  9. echo 总秒数: !total! >> result.txt
  10. start result.txt
复制代码
输出
输入时间: 00:47:56
总秒数: 2876


第三步,运行factorize_optimized.bat

  1. @echo off
  2. setlocal enabledelayedexpansion

  3. :: 配置区(直接修改这里生效)
  4. set "target=2876"       :: 要分解的整数,直接引用第二步,time2sec.bat总秒数值作为变量
  5. set "sort_order=desc"    :: 排序方式:asc升序/desc降序
  6. set "output=factors_%target%.txt"

  7. :: 初始化
  8. if exist "%output%" del "%output%"
  9. set "count=0"

  10. :: 计算因数对(包含重复项)
  11. for /l %%a in (1,1,!target!) do (
  12.     set /a "mod=!target! %% %%a"
  13.     if !mod! equ 0 (
  14.         set /a "b=!target!/%%a"
  15.         set /a "a_minus_1=%%a-1"
  16.         set /a "count+=1"
  17.         set "factors[!count!]=【!a_minus_1!+1】!b!"
  18.     )
  19. )

  20. :: 输出结果
  21. echo [因数分解结果 !target!] > "%output%"
  22. echo ======================= >> "%output%"

  23. if "!sort_order!"=="asc" (
  24.     echo [升序排列] >> "%output%"
  25.     for /l %%i in (1,1,!count!) do echo !factors[%%i]! >> "%output%"
  26. ) else (
  27.     echo [降序排列] >> "%output%"
  28.     for /l %%i in (!count!,-1,1) do echo !factors[%%i]! >> "%output%"
  29. )

  30. start "" "%output%"
复制代码
输出
[因数分解结果 2876]
=======================
[降序排列]
【2875+1】1
【1437+1】2
【718+1】4
【3+1】719
【1+1】1438
【0+1】2876

第四步,takeSsSequence.js
  1. function sleep(delay) {
  2.   var start = (new Date()).getTime();
  3.   while ((new Date()).getTime() - start < delay) {
  4.     continue;
  5.   }
  6. }

  7. function takeSsS() {

  8.     var N = 3;//直接引用第三步,factorize_optimized.bat因数分解结果相乘对数中数值差别最小且位于+之前较小/较大数值作为变量。 示例2876因数分解结果中,【2875+1】1 与【0+1】2876 这二组数值差别皆为2876-1=2875;【1437+1】2与【1+1】1438这二组数值差别皆为1436;【718+1】4与【3+1】719这二组数值差别皆为715。2875,1436,715这些数比较起来,为715的这二组数值差别最小。再来是【718+1】4与【3+1】719这二组位于+之前较小/较大数值比较。【718+1】4这一组中,+之前数值是718,【3+1】719这一组中,+之前数值是3,718和3比较,3较718小/718较3大。这里的因数分解结果相乘对数中数值差别最小且位于+之前较小/较大数值作为变量。 若作为选择“/”的(开关)过于困难,但求能识别并选择因数分解结果相乘对数中数值差别最小且位于+之前数值作为变量应该也就可以了。如它仅能识别并选择【718+1】4中的718或仅能识别并选择【3+1】719中的3,我们还是可以手动调整factorize_optimized.bat的升降序排列来配合它选择,达到预期我想它识别并选择因数分解结果相乘对数中数值差别最小且位于+之前较小/较大数值作为变量。
  9.     var C = 0;
  10.     var start = 0;
  11.     var end = 100;
  12.     var step = (end - start)/(N+1);
  13.     var percent = start += step;

  14.     while (C < N) {
  15.         mp.commandv("sync","seek", percent, "absolute-percent+exact");
  16.         mp.msg.info((C+1)+"/"+N);
  17.         sleep(9000);
  18.         mp.commandv("sync","screenshot","video");
  19.         percent+=step;
  20.         C++;
  21.     }
  22.     mp.commandv("quit",0);
  23. }


  24. mp.register_event("file-loaded", takeSsS)
复制代码
第四步,运行video_screenshot_auto.bat,期待能同takeSsSequence.js整合

  1. @echo off
  2. setlocal enabledelayedexpansion

  3. :: 检查MPV和JS文件是否存在
  4. if not exist "%~dp0mpv.exe" (
  5.     echo 错误:缺少mpv.exe,请确保与脚本同目录
  6.     pause
  7.     exit /b 1
  8. )
  9. if not exist "%~dp0takeSsSequence.js" (
  10.     echo 错误:缺少takeSsSequence.js脚本
  11.     pause
  12.     exit /b 1
  13. )

  14. :: 遍历视频文件并处理
  15. for %%F in (*.m2ts *.mp4 *.mkv *.avi *.mov *.flv *.webm) do (
  16.     set "video_name=%%~nF"
  17.     set "output_dir=!video_name!_screenshots"
  18.    
  19.     if not exist "!output_dir!" (
  20.         mkdir "!output_dir!" || (
  21.             echo 无法创建目录:!output_dir!
  22.             goto :error
  23.         )
  24.     )

  25.     echo 正在处理: %%F
  26.     "%~dp0mpv" --vo=gpu-next --screenshot-high-bit-depth=yes --autofit=100%%x720 ^
  27.         --screenshot-png-compression=0 --no-border --pause --no-config --no-audio --screenshot-format=png ^
  28.         --screenshot-template="!output_dir!\%%x%%f_%%wH_%%wM_%%wS" ^
  29.         --script="%~dp0takeSsSequence.js" "%%F" || (
  30.             echo 处理失败:%%F
  31.             goto :error
  32.         )
  33. )

  34. echo 所有视频处理完成!
  35. pause
  36. exit /b 0

  37. :error
  38. echo 执行过程中发生错误
  39. pause
  40. exit /b 1
复制代码
输出
正在处理: Episode 01.mkv
● Video  --vid=1  (hevc 1920x1080 25 fps) [default]
○ Audio  --aid=1  (aac 2ch 48000 Hz) [default]
● Subs   --sid=1  (subrip) [default]
○ Subs   --sid=2  (subrip) [default]
[takeSsSequence] 1/3
VO: [gpu-next] 1920x1080 yuv420p
Screenshot: 'Episode 01_screenshots\Episode 01.mkv_00_13_10.png'
[takeSsSequence] 2/3
Screenshot: 'Episode 01_screenshots\Episode 01.mkv_00_23_57.png'
[takeSsSequence] 3/3
Screenshot: 'Episode 01_screenshots\Episode 01.mkv_00_34_44.png'
(Paused) V: 00:34:44 / 00:47:56 (72%)
Exiting... (Quit)
所有视频处理完成!
Press any key to continue . . .


以上步骤都是手动完成,而今的想法是
第一步,运行批处理+js混编获取影片简报.cmd完成后自动进行第二步

第二步,运行time2sec.bat中
set "time_str=00:47:56"
:: 输入时间,直接引用第一步,批处理+js混编获取影片简报.cmd输出的影片时间长度值作为变量。完成后自动进行第三步

第三步,运行factorize_optimized.bat
set "target=2876"       :: 要分解的整数,直接引用第二步,time2sec.bat总秒数值作为变量。完成后自动进行第四步

第四步,takeSsSequence.js中
var N = 3;//直接引用第三步,factorize_optimized.bat因数分解结果相乘对数中数值差别最小且位于+之前较小/较大数值作为变量
运行video_screenshot_auto.bat,期待能同takeSsSequence.js整合
关于因数分解结果相乘对数中数值差别最小且位于+之前较小/较大数值

示例中
  [因数分解结果 2876]
=======================
[降序排列]
【2875+1】1
【1437+1】2
【718+1】4
【3+1】719
【1+1】1438
【0+1】2876

以下二组比较,数值差别都是719-4=715,即都算数值差别相同。以下二组和其余组别比较,
【2875+1】1 与【0+1】2876 这二组数值差别皆为2875;
【1437+1】2与【1+1】1438这二组数值差别皆为1436。
2875,1436,715,715,1436,2875,这些数比较起来,居中715这二组数值差别最小。
位于+之前较小/较大数值,数值差别最小(相同)这二组+之前数值比较,
【718+1】4这一组中,+之前数值是718,【3+1】719这一组中,+之前数值是3,
718和3比较,3较718小/718较3大。
这里的因数分解结果相乘对数中数值差别最小且位于+之前较小/较大数值作为变量。 若作为选择“/”的(开关)过于困难,但求能识别并选择因数分解结果相乘对数中数值差别最小且位于+之前数值作为变量应该也就可以了。如它仅能识别并选择【718+1】4中的718或仅能识别并选择【3+1】719中的3,我们还是可以手动调整factorize_optimized.bat的升降序排列来配合它选择,达到预期我想它识别并选择因数分解结果相乘对数中数值差别最小且位于+之前较小/较大数值作为变量。
【718+1】4
【3+1】719
故以上2组相对于其余组别,都算数值差别最小。位于+之前的数值,即截图张数。3较小718较大。

提取影片长度作为时间换算变量,换算出总秒数作为分解因数变量,分解出因数作为截图数量变量。
以上步骤都是在做从影片输出图片这一件事,请前辈们帮忙看看如何方能一气呵成,让过程衔接起来,解放双手。

以上代码虽然有在ai的协力下细部修改过,但毕竟新白,粗糙不足还请前辈们指点进一步优化。

仔细浏览过论坛发帖规则,觉得还是删减下标题。正好也编辑补充下内文,调整下字号大小。不过,怎么感觉好像越描越黑了
发表于 2025-6-5 00:05:13 | 显示全部楼层
第3、4步,搞这么复杂,最后47分钟的视频就3张截图?有什么特殊意义吗?
发表于 2025-6-5 02:54:52 | 显示全部楼层
将takeSsSequence.js里面的内容换成下面的 ,然后跟video_screenshot_auto.bat放在一起
运行video_screenshot_auto.bat

  1. function YiShiFenJie(){
  2. var t=mp.get_property_number('duration');
  3. var a=0;
  4. var rt=[];
  5. for(var i=1;i<=t;i++){
  6. if(t%i==0){
  7. a=t/i;
  8. rt.push([i-1,1,a]);
  9. }}
  10. if(rt.length==2){return rt[1][0];}
  11. if(rt.length%2==0){return rt[rt.length/2-1][0];}
  12. return rt[(rt.length+1)/2-1][0];
  13. }


  14. function sleep(delay) {
  15.   var start = (new Date()).getTime();
  16.   while ((new Date()).getTime() - start < delay) {
  17.     continue;
  18.   }
  19. }

  20. function takeSsS() {

  21.     //var N = 3;//直接引用第三步,factorize_optimized.bat因数分解结果相乘对数中数值差别最小且位于+之前较小/较大数值作为变量
  22. var N=YiShiFenJie();//因式分解直接取中间区域了,因为看不懂。数值差别最小,具体是跟哪个跟哪个对比数值差别最小?较小是哪个跟哪个对比较小?较大又是哪个跟哪个对比较大?
  23.     var C = 0;
  24.     var start = 0;
  25.     var end = 100;
  26.     var step = (end - start)/(N+1);
  27.     var percent = start += step;

  28.     while (C < N) {
  29.         mp.commandv("sync","seek", percent, "absolute-percent+exact");
  30.         mp.msg.info((C+1)+"/"+N);
  31.         sleep(9000);
  32.         mp.commandv("sync","screenshot","video");
  33.         percent+=step;
  34.         C++;
  35.     }
  36.     mp.commandv("quit",0);
  37. }


  38. mp.register_event("file-loaded", takeSsS)
复制代码
 楼主| 发表于 2025-6-5 11:19:47 | 显示全部楼层
第3、4步,搞这么复杂,最后47分钟的视频就3张截图?有什么特殊意义吗?
77七 发表于 2025-6-5 00:05



   因为是帖子示例,所以选择较小值3,方便快速完成。实际需求更多是选较大值718。
 楼主| 发表于 2025-6-5 12:20:06 | 显示全部楼层
将takeSsSequence.js里面的内容换成下面的 ,然后跟video_screenshot_auto.bat放在一起
运行video_screensh ...
Five66 发表于 2025-6-5 02:54



   不好意思,代码注释未能表达清楚。var N = 3;//直接引用第三步,factorize_optimized.bat因数分解结果相乘对数中数值差别最小且位于+之前较小/较大数值作为变量
示例中
  
[因数分解结果 2876]
=======================
[降序排列]
【2875+1】1
【1437+1】2
【718+1】4
【3+1】719
【1+1】1438
【0+1】2876



以下二组比较,数值差别都是719-4=715,即都算数值差别相同。以下二组和其余组别比较,
【2875+1】1 与【0+1】2876 这二组数值差别皆为2875;
【1437+1】2与【1+1】1438这二组数值差别皆为1436。
2875,1436,715,715,1436,2875,这些数比较起来,也就是楼主理解的因式分解中间区域。
位于+之前较小/较大数值,数值差别相同这二组+之前数值比较,
【718+1】4这一组中,+之前数值是718,【3+1】719这一组中,+之前数值是3,
718和3比较,3较718小/718较3大
【718+1】4
【3+1】719
发表于 2025-6-5 12:45:46 | 显示全部楼层
  1. @echo off
  2. cd /d "%~dp0"
  3. for %%i in (*.mp4) do (
  4.         (
  5.                 echo 【影片名称】:%%~ni
  6.                 echo 【影片格式】:%%~xi
  7.                 for /f "delims=." %%a in ('powershell -c "%%~zi/1024/1024"') do (
  8.                         echo 【影片大小】:%%a MB
  9.                 )
  10.                 for /f "tokens=2-4 delims=.: " %%a in ('ffmpeg -hide_banner -i  "%%i" 2^>^&1 ^|find /i "Duration: "') do (
  11.                         echo 【影片时长】:%%a:%%b:%%c
  12.                         set /a "n=(1%%a-100)*3600+(1%%b-100)*60+(1%%c-100)"
  13.                 )
  14.                 echo=
  15.         ) >> "result.txt"

  16.         set name=%%~ni
  17.         setlocal enabledelayedexpansion
  18.         for /l %%l in (1,1,!n!) do (
  19.                 set /a mod=!n! %% %%l
  20.                 if "!mod!" equ "0" (
  21.                         set /a a=%%l-1,c+=1
  22.                         set _!c!=!a!
  23.                 )
  24.         )
  25.         set /a "c=c/2+1"
  26.         for %%a in (!c!) do (
  27.                 set /a len=n/!_%%a!
  28.         )

  29.         md "screenshot_!name!"
  30.         for /l %%l in (0,!len!,!n!) do (
  31.                 set /a #a=%%l/3600+100,#b=%%l%%3600/60+100,#c=%%l%%60+100
  32.                 ffmpeg -hide_banner -ss %%l -i "!name!%%~xi" -frames:v 1 -q:v 2 "screenshot_!name!\shot_!#a:~-2!_!#b:~-2!_!#c:~-2!.jpg" -y
  33.         )
  34.         endlocal
  35. )
  36. pause
复制代码


不会js+mpv,使用了点powershell+ffmpeg简单代码,截图数量用的1楼第3步代码,倒数 第 【有效行数/2+1】 行。

评分

参与人数 1技术 +1 收起 理由
娃娃 + 1 另辟蹊径!

查看全部评分

 楼主| 发表于 2025-6-5 18:53:40 | 显示全部楼层
本帖最后由 娃娃 于 2025-6-8 12:09 编辑

不会js+mpv,使用了点powershell+ffmpeg简单代码,截图数量用的1楼第3步代码,倒数 第 【有效行数/2+1】 ...
77七 发表于 2025-6-5 12:45






超过字数限制,将来回复在这里罢。

  1. var N=esFenJie();//执行函数获取结果并设置变量,奇偶同总秒数,100%位置结束
  2. var C = 0;
  3. var start = 0;// 起始百分比,为确保截图覆盖率达100%
  4. var end = Math.floor( (100 / N) * (N + 1) );// 结束位置,返回小于或等于给定数字的最大整数
  5. var step = (end - start)/(N+1);// 每张截图跨度数=假设结束位置100/N
  6. var percent = start += step;//理想百分百,故等分影片数这里假设结束位置为100
复制代码


在@百度ai协力下,已可将原须手动计算输入的var end更改为自动计算输入


因为怕牵丝攀藤的枝蔓开去,影响发帖的目的。加上当时对截图张数与等分影片数及等分影片数所需步数的不成熟理解。是以筹思阶段不无省略。还是被揪出,有朋友提出截几张图?有什么特殊意义?几翻几覆测试,理出一点头绪。


截图张数=等分影片数-1
因数分解影片秒数肇因于此。
缘何必欲使用影片长度?
使用影片长度根据因数分解出的结果相乘对数就可以等分影片数。以示例来说,
当截图张数=等分影片数时
选择【3+1】719这一组罢,
  1. var N = 4;//可手动修改的截图数量
  2. var C = 0;
  3. var start = 0;// 起始百分比,理论上当且仅当“截图数”取因数分解得出的值时起始百分比方能取值0,此时截图覆盖率百分百
  4. var end = 125;// 结束位置
  5. var step = (end - start)/(N+1);// 每张截图跨度数=假设结束位置100比截图数
  6. var percent = start += step;//理想百分百,故等分影片数这里就假设结束位置为100(书到用时方恨少,这里表达实在有待商榷)。若影片长度似轨道,超过百分百的部分大抵脱轨了,实际测试截图也是失败的。数学比较差!不知如何准确陈述。
复制代码


输出
正在处理: Episode 01.mkv
● Video --vid=1 (hevc 1920x1080 25 fps) [default]
○ Audio --aid=1 (aac 2ch 48000 Hz) [default]
● Subs --sid=1 (subrip) [default]
○ Subs --sid=2 (subrip) [default]
[takeSsSequence] 1/4
VO: [gpu-next] 1920x1080 yuv420p
Screenshot: 'Episode 01_screenshots\Episode 01.mkv_00_11_59.png'
[takeSsSequence] 2/4
Screenshot: 'Episode 01_screenshots\Episode 01.mkv_00_23_58.png'
[takeSsSequence] 3/4
Screenshot: 'Episode 01_screenshots\Episode 01.mkv_00_35_57.png'
[takeSsSequence] 4/4
Screenshot: 'Episode 01_screenshots\Episode 01.mkv_00_47_56.png'
(Paused) V: 00:47:56 / 00:47:56 (100%)
Exiting... (Quit)
所有视频处理完成!
Press any key to continue . . .




现在再更改参数
  1. var N = 3;//可手动修改的截图数量
  2. var C = 0;
  3. var start = 0;// 起始百分比,理论上当且仅当“截图数”取因数分解得出的值时起始百分比方能取值0,此时截图覆盖率百分百
  4. var end = 132;// 结束位置。这里为100/3除不尽,所有取整数33得出的结果
  5. var step = (end - start)/(N+1);// 每张截图跨度数=假设结束位置100比截图数
  6. var percent = start += step;//理想百分百,故等分影片数这里就假设结束位置为100(书到用时方恨少,这里表达实在有待商榷)。若影片长度似轨道,超过百分百的部分大抵脱轨了,实际测试截图也是失败的。数学比较差!不知如何准确陈述。
复制代码


输出
正在处理: Episode 01.mkv
● Video --vid=1 (hevc 1920x1080 25 fps) [default]
○ Audio --aid=1 (aac 2ch 48000 Hz) [default]
● Subs --sid=1 (subrip) [default]
○ Subs --sid=2 (subrip) [default]
[takeSsSequence] 1/3
VO: [gpu-next] 1920x1080 yuv420p
Screenshot: 'Episode 01_screenshots\Episode 01.mkv_00_15_49.png'
[takeSsSequence] 2/3
Screenshot: 'Episode 01_screenshots\Episode 01.mkv_00_31_38.png'
[takeSsSequence] 3/3
Screenshot: 'Episode 01_screenshots\Episode 01.mkv_00_47_28.png'
(Paused) V: 00:47:28 / 00:47:56 (99%)
Exiting... (Quit)
所有视频处理完成!
Press any key to continue . . .




“截图数”所取不为因数分解得出的值,但需要于百分百位置结束
  1. var N = 3;//可手动修改的截图数量
  2. var C = 0;
  3. var start = 1;// 起始百分比,理论上当且仅当“截图数”取因数分解得出的值时起始百分比方能取值0,此时截图覆盖率百分百。当“截图数”所取不为因数分解得出的值,但需要于百分百位置结束时,此处取值为100/3的余数1。
  4. var end = 133;// 结束位置。当“截图数”所取不为因数分解得出的值,但需要于百分百位置结束时,此处取值需要加上100/3的余数1。
  5. var step = (end - start)/(N+1);// 每张截图跨度数=假设结束位置100比截图数
  6. var percent = start += step;//理想百分百,故等分影片数这里就假设结束位置为100(书到用时方恨少,这里表达实在有待商榷)。若影片长度似轨道,超过百分百的部分大抵脱轨了,实际测试截图也是失败的。数学比较差!不知如何准确陈述。
复制代码


正在处理: Episode 01.mkv
● Video --vid=1 (hevc 1920x1080 25 fps) [default]
○ Audio --aid=1 (aac 2ch 48000 Hz) [default]
● Subs --sid=1 (subrip) [default]
○ Subs --sid=2 (subrip) [default]
[takeSsSequence] 1/3
VO: [gpu-next] 1920x1080 yuv420p
Screenshot: 'Episode 01_screenshots\Episode 01.mkv_00_16_18.png'
[takeSsSequence] 2/3
Screenshot: 'Episode 01_screenshots\Episode 01.mkv_00_32_07.png'
[takeSsSequence] 3/3
Screenshot: 'Episode 01_screenshots\Episode 01.mkv_00_47_56.png'
(Paused) V: 00:47:56 / 00:47:56 (100%)
Exiting... (Quit)
所有视频处理完成!
Press any key to continue . . .




挑出来
(Paused) V: 00:47:56 / 00:47:56 (100%)

(Paused) V: 00:47:28 / 00:47:56 (99%)


(Paused) V: 00:47:56 / 00:47:56 (100%)


(Paused) V: 00:34:44 / 00:47:56 (72%)


昨日便是由于这个72%没有达到预期,脑袋里一塌糊涂。

理论上无论手动“截图数”所取是否为因数分解得出的值,于百分百位置结束的截图,遗憾的是最后一张除去一团漆黑什么都没有。
当“截图数”所取为因数分解得出的值截图覆盖率无法达到100%,即起始百分比取值大于0,头(于100%位置结束)尾(于100%位置前结束处有扫描不到的遗漏。

示例是这样。

不一定非得一蹴而就,Five66朋友的方向就很好。77七朋友的张图?有什么特殊意义?促使自己重拾往日暂且撇开的疑惑,或许(自以为)理出了一丝头绪。

不行了,越想越糊涂。
 楼主| 发表于 2025-6-5 19:04:07 | 显示全部楼层
回复 6# 77七


辛苦了!   其实不太想用第三方工具,如果有连MPV,ffmpeg都不用就能完成的那最好了。
对bat产生兴趣也是缘起于找到一个不借助第三方工具,bat引导不压缩仅封装文件夹为zip档后自动删除原文件夹的方法。
 楼主| 发表于 2025-6-5 19:21:19 | 显示全部楼层
回复 3# Five66


   var t=mp.get_property_number('duration');
   槛外人太笨了吗?没能弄成。duration外,哪里输入因式分解的时间呢?捂脸
发表于 2025-6-5 20:06:09 | 显示全部楼层
回复 7# 娃娃

   mpv player 的图形引擎就是 ffmpeg,正常运行 mpv 应该就默认系统已经安装了 ffmpeg。
   而 ffmpeg 可以获取视频文件的时长数据,也可以用指定时间位置截图,还可以根据指定时长间隔完成一组截图,其效率要远高于单张逐次截图,还可以调整截图的质量等级等等...
   获取时长和完成截图是本帖的两个操作要点,但我好奇的是楼主为何要用一种所谓的 '分解整数因子极值' 的方法来安排一组截图位置?其与直接的等分法相比有何奥妙所在
发表于 2025-6-5 20:24:09 | 显示全部楼层
回复 9# 娃娃


     var t=mp.get_property_number('duration');  就是用mpv获取视频总秒数 ,相当于直接执行了第一步跟第二步
后面的

  1. for(var i=1;i<=t;i++){
  2. if(t%i==0){
  3. a=t/i;
  4. rt.push([i-1,1,a]);
  5. }}
复制代码
就是因式分解 ,相当于执行第三步
接着再后面的3行

  1. if(rt.length==2){return rt[1][0];}
  2. if(rt.length%2==0){return rt[rt.length/2-1][0];}
  3. return rt[(rt.length+1)/2-1][0];
复制代码
就是返回结果 ,分别对应
因式分解结果只有2组时返回结果
因式分解结果大于2组并且为偶数时返回结果(只取较小部分)
因式分解结果只有1组或大于2组并且为奇数时返回结果(1秒视频只有1组 ,可能会出错)
3楼代码第26行那句var N=YiShiFenJie();就是执行函数获取返回结果并设置变量N
因为因式分解是按顺序进行的 ,中间部分最均匀 ,差值也最小 ,没问题的话自己改下3楼代码10-12行那些返回语句就能变更效果

评分

参与人数 1技术 +1 收起 理由
娃娃 + 1 费心了。

查看全部评分

 楼主| 发表于 2025-6-5 20:52:33 | 显示全部楼层
回复  娃娃

   mpv player 的图形引擎就是 ffmpeg,正常运行 mpv 应该就默认系统已经安装了 ffmpeg。
...
aloha20200628 发表于 2025-6-5 20:06


昨日那个浏览器看图回复完才觉得ID有点眼熟,叨惠二个脚本。
谢谢科普!实在是自己所知有限。mpv就用来截图。
奥妙?应该无有吧!更多应该是坐井观天,用mpv截图的时候,就想到等分影片数。
对!获取时长和完成截图是要点。用的是mpv便携版,也可以用指定时间位置截图,根据指定时长间隔(直接的等分法?)完成一组截图,调整截图的质量等级等等...均可吗?君其小白之仲父(师父)乎?若有更好方法,当然最好啦。能不能指导下如何操作,开贴或哪里有现成的教程?

   
 楼主| 发表于 2025-6-5 21:03:57 | 显示全部楼层
回复  娃娃


     var t=mp.get_property_number('duration');  就是用mpv获取视频总秒数 ,相当于直接 ...
Five66 发表于 2025-6-5 20:24



  
正在处理: Episode 01.mkv
● Video  --vid=1  (hevc 1920x1080 25 fps) [default]
○ Audio  --aid=1  (aac 2ch 48000 Hz) [default]
● Subs   --sid=1  (subrip) [default]
○ Subs   --sid=2  (subrip) [default]
[takeSsSequence] TypeError: cannot convert undefined to object
[takeSsSequence]        at YiShiFenJie (\mpv-x86_64-20250601-git-730062b\takeSsSequence.js:11)
[takeSsSequence]        at takeSsS (\mpv-x86_64-20250601-git-730062b\takeSsSequence.js:26)
[takeSsSequence]        at dispatch_event (@/defaults.js:52)
[takeSsSequence]        at mp_event_loop (@/defaults.js:798)
[takeSsSequence]        at run_script (native)
[takeSsSequence] Could not load js script \mpv-x86_64-20250601-git-730062b\takeSsSequence.js
VO: [gpu-next] 1920x1080 yuv420p
(Paused) V: 00:00:00 / 00:47:56 (0%)
这是将内容复制全部替换原内容保存执行后的提示,是哪里的问题呢?
发表于 2025-6-5 22:19:19 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-6-6 13:08 编辑

回复 12# 娃娃

用 ffmpeg.exe 为例简要说明如下(可从本坛第三方下载 ffmpeg.exe http://bcn.bathome.net/s/tool/index.html?key=ffmpeg 落地即用,存于批处脚本和视频文件同目录)...

一。用 ffmpeg.exe 获取当前目录下 test.mp4 文件总时长(秒数)

  1. @echo off &for /f "tokens=1-4 delims=:. " %%a in ('ffmpeg.exe -i "test.mp4" 2^>^&1^|find "Duration:" ') do set/a "ts=%%b*3600+%%c*60+%%d"
  2. echo,视频总时长 = %ts% 秒 &pause&exit/b
复制代码
二。根据等分法用 ffmpeg.exe 截取当前目录下 test.mp4 的一组 *.jpg 图片,图片命名格式如 outF001.jpg, outF002.jpg, ... 时长间隔预设为 10 秒,换算为以下命令行参数 fps=0.1 (即 10 秒数值的倒数 fps=1/10),参数 -q:v 1 表明截图质量=1级,数值越大越差,截图起始点默认为 00:00:00,更多命令行参数设置可网搜相应关键词...

  1. ffmpeg.exe -i "test.mp4" -vf fps=0.1 -q:v 1 "outF%03d.jpg"
复制代码
或采用非小数值参数的格式如下

  1. ffmpeg.exe -i "test.mp4" -vf fps=1/10 -q:v 1 "outF%03d.jpg"
复制代码

评分

参与人数 1技术 +1 收起 理由
娃娃 + 1 引导新方法。

查看全部评分

发表于 2025-6-5 22:58:51 | 显示全部楼层
回复 7# 娃娃

无论是47分钟,4秒一张,还是47分钟共3张,我觉得都比较极端,都是不合适的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 08:29 , Processed in 0.029823 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表