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

[文本处理] 图片转动态视频时根据文本时间戳去计算持续时间的批处理

[复制链接]
发表于 2024-5-20 18:18:16 | 显示全部楼层 |阅读模式
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. for /l %%l in (1,2,10000) do (
  5.         set /a p1=%%l,p2=%%l+1
  6.         if exist "!p2!.jpg" (
  7.                 ffmpeg -y -hwaccel_device 0 -i !p1!.jpg -i !p2!.jpg -filter_complex "[0:v]zoompan='1.5':x='if(lte(on,1),(iw-iw/zoom)/2,x)':y='if(lte(on,-1),(ih-ih/zoom)/2,y+3)':d=175[v0];[1:v]zoompan='1.5':x='if(lte(on,1),(iw-iw/zoom)/2,x)':y='if(lte(on,1),(ih/zoom)/2,y-3)':d=175[v1];[v0][v1]concat=n=2:v=1:a=0,format=yuv420p[v]" -map "[v]" -c:v h264_nvenc -gpu 0 out_!p1!.mp4
  8.         )
  9.         if exist "out_!p1!.mp4" (
  10.                 >>x.txt echo file '%~dp0out_!p1!.mp4'
  11.         )
  12. )
  13. endlocal
  14. ffmpeg -f concat -safe 0 -i x.txt -c copy output.mp4
  15. del out_*.mp4;x.txt
  16. pause
复制代码
以上代码每段动态视频的持续时间通过以下公式计算:
持续时间= 帧率(fps)/d参数值(帧)

我想对每张图片生成动态视频时的持续时间做出以下修改:
目录内有同名的txt和srt,例如:“真的爱你.txt”和“真的爱你.srt”
txt里面是多行文本,需要根据每一行的文本内容,去计算srt里面的文本内容持续时间是多少~

txt文本内容:
无法可修饰的一对手,带出温暖永远在背后。
总是啰嗦始终关注,不懂珍惜太内疚。

srt字幕内容:
1
00:00:00,366 --> 00:00:02,066
无法可修饰的一对手

2
00:00:02,116 --> 00:00:05,166
带出温暖永远在背后

3
00:00:05,216 --> 00:00:09,000
总是啰嗦始终关注

4
00:00:09,050 --> 00:00:12,400
不懂珍惜太内疚


需要计算txt第一行对应的srt时间戳,也就是第一行的持续时间是:00:00:00,000至00:00:05,166,00:00:05,166减去00:00:00,000就是第一张图片变为动态视频的持续时间为:05,166。
第二行对应的srt时间戳,00:00:05,216至00:00:12,400,00:00:12,400减去00:00:05,216等于07,184,07,184为第二张图片的持续时间!

有些复杂,大佬们是否理解~
欢迎77七大佬 与各位大佬出手相助~
万分感谢大家!
发表于 2024-5-20 19:01:42 | 显示全部楼层
下面这样的情况下怎么弄

txt文本内容:
无法可修饰,的一对手,带出温暖,永远在背后。

srt字幕内容:
1
00:00:00,366 --> 00:00:02,066
带出温暖,永远在背后

2
00:00:02,116 --> 00:00:05,166
无法可修饰,的一对手

3
00:00:05,216 --> 00:00:09,000
无法可修饰,的一对手

4
00:00:09,050 --> 00:00:12,400
带出温暖,永远在背后
 楼主| 发表于 2024-5-20 19:17:58 | 显示全部楼层
本帖最后由 877 于 2024-5-20 19:53 编辑

回复 2# Five66


大佬好,我的思路是,可以先根据txt每一行的文本,去确定srt内容的时间戳是从哪里开始到哪里结束,
然后生成出来每一张图片需要的持续时间~,例如生成一个"真的爱你time.txt",里面包含所有的持续时间~
然后生成时再按顺序调用~

有其他思路也行~
发表于 2024-5-20 20:50:54 | 显示全部楼层
txt和srt 有什么对应规律?全是一行对6行?
 楼主| 发表于 2024-5-20 21:52:50 | 显示全部楼层
回复 4# 77七

如果txt文本内容只有1行(里面包含2个符号):
无法可修饰的一对手,带出温暖永远在背后。

那么srt字幕内容会有如下2个:
1
00:00:00,366 --> 00:00:02,066
无法可修饰的一对手

2
00:00:02,116 --> 00:00:05,166
带出温暖永远在背后
发表于 2024-5-20 22:19:56 | 显示全部楼层
本帖最后由 77七 于 2024-5-20 22:31 编辑

回复 5# 877


   
请选择至少3对 txt和srt文件上传到网盘。

1
00:00:00,366 --> 00:00:02,066
无法可修饰的一对手


第一条时间前面的都视为0吗?
发表于 2024-5-20 23:24:20 | 显示全部楼层
本帖最后由 77七 于 2024-5-20 23:26 编辑

回复 8# 877


   3对 txt和srt文件,一共6个文件。只提供几个特例,写了不一定能用。时间好算,ffmpeg代码我不会改。
 楼主| 发表于 2024-5-20 23:36:46 | 显示全部楼层
回复 9# 77七


大佬好,这是3行txt文本的示例,您下载看下~
获取到这三行正确的持续时间就行~输出到目录内,具体怎样修改替换ffmpeg的我再研究研究~
谢谢您~!
    链接:https://pan.baidu.com/s/1idbduuU7xEhvoYnwAuSEkw?pwd=7777
 楼主| 发表于 2024-5-20 23:55:09 | 显示全部楼层
回复 7# 77七


    ffmpeg代码应该是需要根据计算出来的持续时间,换算~

如果帧率是30fps,那么3秒就是90帧,5秒就是150帧。

然后,修改zoompan滤镜的d参数,
 楼主| 发表于 2024-5-21 00:01:10 | 显示全部楼层
回复 7# 77七

这是第一张持续3秒,第二张持续5秒的修改。。不够精确,大佬您看下~
  1. ffmpeg -y -hwaccel_device 0 -i !p1!.jpg -i !p2!.jpg -filter_complex "[0:v]zoompan='1.5':z='1.0':d=90:x='if(lte(on,1),(iw-iw/zoom)/2,x)':y='if(lte(on,-1),(ih-ih/zoom)/2,y+3)'[v0];[1:v]zoompan='1.5':z='1.0':d=150:x='if(lte(on,1),(iw-iw/zoom)/2,x)':y='if(lte(on,1),(ih/zoom)/2,y-3)'[v1];[v0][v1]concat=n=2:v=1:a=0,format=yuv420p[v]" -map "[v]" -c:v h264_nvenc -gpu 0 out_!p1!.mp4
复制代码
发表于 2024-5-21 01:21:14 | 显示全部楼层
回复 8# 877


  
  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. for /f "delims=" %%i in ('dir /b /a-d *.srt') do (
  5.         setlocal enabledelayedexpansion
  6.         if exist "%%~ni.txt" (
  7.                 for /f "useback tokens=1-3" %%a in ("%%i") do (
  8.                         if "%%b" equ "-->" (
  9.                                 set /a _str=str*2-1,__str=str*2
  10.                                 set #!_str!=%%a
  11.                                 set #!__str!=%%c
  12.                         )
  13.                         if not defined str (
  14.                                 set str=1
  15.                         ) else (
  16.                                 set str=%%a
  17.                         )
  18.                 )
  19.                 set #1=00:00:00,000
  20.                 for /f "useback delims=" %%a in ("%%~ni.txt") do (
  21.                         set str=%%a
  22.                         for %%x in ("," "," "!" "。" "." "?" "?") do (
  23.                                 set "str=!str:%%~x= !"
  24.                         )
  25.                         for %%x in (!str!) do (
  26.                                 set /a n+=1,m+=2
  27.                                 if not defined s (
  28.                                         for /f %%y in ("#!n!") do (
  29.                                                 set s=!%%y!
  30.                                         )
  31.                                 )
  32.                                 for /f %%y in ("#!m!") do (
  33.                                         set e=!%%y!
  34.                                 )
  35.                         )
  36.                         set n=!m!
  37.                         for /f "tokens=1-4 delims=:," %%a in ("!s!") do (
  38.                                 set /a "t2mss=((1%%a%%100*60+1%%b%%100)*60+1%%c%%100)*1000+1%%d%%1000"
  39.                         )
  40.                         for /f "tokens=1-4 delims=:," %%a in ("!e!") do (
  41.                                 set /a "t2mse=((1%%a%%100*60+1%%b%%100)*60+1%%c%%100)*1000+1%%d%%1000"
  42.                         )
  43.                         set /a t=t2mse-t2mss
  44.                         for /f "delims=" %%a in ('powershell -c "!t!/1000"') do (
  45.                                 set t=%%a
  46.                         )
  47.                         >> "%%~ni.time" echo !t!
  48.                         set s=
  49.                 )
  50.         )
  51.         endlocal
  52. )
  53. pause
复制代码
发表于 2024-5-21 01:23:57 | 显示全部楼层
回复 10# 877


   应该是p1 p2 对应 txt 的第一行和第二行吧?
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. for /f "useback delims=" %%a in ("真的爱你.time") do (
  5.         set /a n+=1
  6.         for /f "delims=" %%b in ('powershell -c "%%a*30"') do (
  7.                 set #!n!=%%b
  8.         )
  9. )
  10. for /l %%l in (1,2,10000) do (
  11.         set /a p1=%%l,p2=%%l+1
  12.         if exist "!p2!.jpg" (
  13.                 for /f "tokens=1-2" %%a in ("#!p1! #!p2!") do (
  14.                         set d1=!%%a!
  15.                         set d2=!%%b!
  16.                         ffmpeg -y -hwaccel_device 0 -i !p1!.jpg -i !p2!.jpg -filter_complex "[0:v]zoompan='1.5':x='if(lte(on,1),(iw-iw/zoom)/2,x)':y='if(lte(on,-1),(ih-ih/zoom)/2,y+3)':d=!d1![v0];[1:v]zoompan='1.5':x='if(lte(on,1),(iw-iw/zoom)/2,x)':y='if(lte(on,1),(ih/zoom)/2,y-3)':d=!d2![v1];[v0][v1]concat=n=2:v=1:a=0,format=yuv420p[v]" -map "[v]" -c:v h264_nvenc -gpu 0 out_!p1!.mp4
  17.                 )
  18.         )
  19.         if exist "out_!p1!.mp4" (
  20.                 >>x.txt echo file '%~dp0out_!p1!.mp4'
  21.         )
  22. )
  23. endlocal
  24. ffmpeg -f concat -safe 0 -i x.txt -c copy output.mp4
  25. del out_*.mp4;x.txt
  26. pause
复制代码
 楼主| 发表于 2024-5-21 05:35:18 | 显示全部楼层
回复 11# 77七


非常厉害77七大佬 ,测试了,这样对着呢!

简直太牛了!!!

非常感谢我大哥!膜拜!
 楼主| 发表于 2024-5-21 05:59:09 | 显示全部楼层
回复 11# 77七


大佬,计算毫秒数这里我刚刚发现,每一组时间戳结束时间与下一组的开始都有一点的延迟~

第一组计算正确!下一组的开始时间能否修改为上一组的结束时间作为开始时间呢?
例如:
1
00:00:00,366 --> 00:00:02,066
2
00:00:02,116 --> 00:00:05,166

第一组的持续时间为:02,066正确,第二组改为05,166-02,066。
现在是05,166-02,116,这是我之前没有说清楚的缘故~
02,066和02,116延迟了50...
发表于 2024-5-21 09:22:10 | 显示全部楼层
回复 14# 877

11楼代码28-30行,修改为:
  
  1.                                         if defined e (
  2.                                                 set s=!e!
  3.                                         ) else (
  4.                                                 set s=00:00:00,000
  5.                                         )
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 01:21 , Processed in 0.021904 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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