本帖最后由 娃娃 于 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- @set @x=1 /* &@echo off
- dir/s/b/a-d *.mp4 *.m2ts *.wmv *.mkv *.avi>mF.lst
- echo,... 在当前目录下生成 "影片简报" ...
- (for /f "delims=" %%F in (mF.lst) do (
- for /f "delims=" %%v in ('cscript /nologo /e:jscript "%~f0" "%%~dpF" "%%~nxF" ') do (
- for /f "tokens=1-2 delims=," %%1 in ("%%~v") do (
- echo,【影片名称】:%%~nF
- echo,【影片格式】:%%~xF
- echo,【影片大小】:%%1
- echo,【影片时长】:%%2 )
- )
- ))> result.txt
- start result.txt
- (del/q mF.lst)&exit/b */
- var argv = WScript.arguments;
- var objShell = new ActiveXObject("shell.application");
- var objFolder = objShell.NameSpace(argv.item(0));
- var objFolderItem = objFolder.ParseName(argv.item(1));
- var sizeF = objFolder.GetDetailsOf(objFolderItem, 1);
- var durationF = objFolder.GetDetailsOf(objFolderItem, 27);
- WScript.echo(sizeF+','+durationF);
复制代码 输出
【影片名称】:Episode 01
【影片格式】:.mkv
【影片大小】:1.31 GB
【影片时长】:00:47:56
第二步,运行time2sec.bat
- @echo off
- setlocal enabledelayedexpansion
- set "time_str=00:47:56"
- :: 输入时间,直接引用第一步,批处理+js混编获取影片简报.cmd输出时间值作为变量
- for /f "tokens=1-3 delims=:" %%a in ("%time_str%") do (
- set /a "total=%%a*3600 + %%b*60 + %%c"
- )
- echo 输入时间: %time_str% > result.txt
- echo 总秒数: !total! >> result.txt
- start result.txt
复制代码 输出
第三步,运行factorize_optimized.bat
- @echo off
- setlocal enabledelayedexpansion
- :: 配置区(直接修改这里生效)
- set "target=2876" :: 要分解的整数,直接引用第二步,time2sec.bat总秒数值作为变量
- set "sort_order=desc" :: 排序方式:asc升序/desc降序
- set "output=factors_%target%.txt"
- :: 初始化
- if exist "%output%" del "%output%"
- set "count=0"
- :: 计算因数对(包含重复项)
- for /l %%a in (1,1,!target!) do (
- set /a "mod=!target! %% %%a"
- if !mod! equ 0 (
- set /a "b=!target!/%%a"
- set /a "a_minus_1=%%a-1"
- set /a "count+=1"
- set "factors[!count!]=【!a_minus_1!+1】!b!"
- )
- )
- :: 输出结果
- echo [因数分解结果 !target!] > "%output%"
- echo ======================= >> "%output%"
- if "!sort_order!"=="asc" (
- echo [升序排列] >> "%output%"
- for /l %%i in (1,1,!count!) do echo !factors[%%i]! >> "%output%"
- ) else (
- echo [降序排列] >> "%output%"
- for /l %%i in (!count!,-1,1) do echo !factors[%%i]! >> "%output%"
- )
- start "" "%output%"
复制代码 输出
[因数分解结果 2876]
=======================
[降序排列]
【2875+1】1
【1437+1】2
【718+1】4
【3+1】719
【1+1】1438
【0+1】2876
第四步,takeSsSequence.js- function sleep(delay) {
- var start = (new Date()).getTime();
- while ((new Date()).getTime() - start < delay) {
- continue;
- }
- }
- function takeSsS() {
- 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的升降序排列来配合它选择,达到预期我想它识别并选择因数分解结果相乘对数中数值差别最小且位于+之前较小/较大数值作为变量。
- var C = 0;
- var start = 0;
- var end = 100;
- var step = (end - start)/(N+1);
- var percent = start += step;
- while (C < N) {
- mp.commandv("sync","seek", percent, "absolute-percent+exact");
- mp.msg.info((C+1)+"/"+N);
- sleep(9000);
- mp.commandv("sync","screenshot","video");
- percent+=step;
- C++;
- }
- mp.commandv("quit",0);
- }
- mp.register_event("file-loaded", takeSsS)
复制代码 第四步,运行video_screenshot_auto.bat,期待能同takeSsSequence.js整合
- @echo off
- setlocal enabledelayedexpansion
- :: 检查MPV和JS文件是否存在
- if not exist "%~dp0mpv.exe" (
- echo 错误:缺少mpv.exe,请确保与脚本同目录
- pause
- exit /b 1
- )
- if not exist "%~dp0takeSsSequence.js" (
- echo 错误:缺少takeSsSequence.js脚本
- pause
- exit /b 1
- )
- :: 遍历视频文件并处理
- for %%F in (*.m2ts *.mp4 *.mkv *.avi *.mov *.flv *.webm) do (
- set "video_name=%%~nF"
- set "output_dir=!video_name!_screenshots"
-
- if not exist "!output_dir!" (
- mkdir "!output_dir!" || (
- echo 无法创建目录:!output_dir!
- goto :error
- )
- )
- echo 正在处理: %%F
- "%~dp0mpv" --vo=gpu-next --screenshot-high-bit-depth=yes --autofit=100%%x720 ^
- --screenshot-png-compression=0 --no-border --pause --no-config --no-audio --screenshot-format=png ^
- --screenshot-template="!output_dir!\%%x%%f_%%wH_%%wM_%%wS" ^
- --script="%~dp0takeSsSequence.js" "%%F" || (
- echo 处理失败:%%F
- goto :error
- )
- )
- echo 所有视频处理完成!
- pause
- exit /b 0
- :error
- echo 执行过程中发生错误
- pause
- 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的协力下细部修改过,但毕竟新白,粗糙不足还请前辈们指点进一步优化。
仔细浏览过论坛发帖规则,觉得还是删减下标题。正好也编辑补充下内文,调整下字号大小。不过,怎么感觉好像越描越黑了 |