Board logo

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

作者: 877    时间: 2024-5-20 18:18     标题: 图片转动态视频时根据文本时间戳去计算持续时间的批处理

  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七大佬 与各位大佬出手相助~
万分感谢大家!
作者: Five66    时间: 2024-5-20 19:01

下面这样的情况下怎么弄

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
带出温暖,永远在背后
作者: 877    时间: 2024-5-20 19:17

本帖最后由 877 于 2024-5-20 19:53 编辑

回复 2# Five66


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

有其他思路也行~
作者: 77七    时间: 2024-5-20 20:50

txt和srt 有什么对应规律?全是一行对6行?
作者: 877    时间: 2024-5-20 21:52

回复 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
带出温暖永远在背后
作者: 77七    时间: 2024-5-20 22:19

本帖最后由 77七 于 2024-5-20 22:31 编辑

回复 5# 877


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

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


第一条时间前面的都视为0吗?
作者: 77七    时间: 2024-5-20 23:24

本帖最后由 77七 于 2024-5-20 23:26 编辑

回复 8# 877


   3对 txt和srt文件,一共6个文件。只提供几个特例,写了不一定能用。时间好算,ffmpeg代码我不会改。
作者: 877    时间: 2024-5-20 23:36

回复 9# 77七


大佬好,这是3行txt文本的示例,您下载看下~
获取到这三行正确的持续时间就行~输出到目录内,具体怎样修改替换ffmpeg的我再研究研究~
谢谢您~!
    链接:https://pan.baidu.com/s/1idbduuU7xEhvoYnwAuSEkw?pwd=7777
作者: 877    时间: 2024-5-20 23:55

回复 7# 77七


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

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

然后,修改zoompan滤镜的d参数,
作者: 877    时间: 2024-5-21 00:01

回复 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
复制代码

作者: 77七    时间: 2024-5-21 01:21

回复 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
复制代码

作者: 77七    时间: 2024-5-21 01:23

回复 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
复制代码

作者: 877    时间: 2024-5-21 05:35

回复 11# 77七


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

简直太牛了!!!

非常感谢我大哥!膜拜!
作者: 877    时间: 2024-5-21 05:59

回复 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...
作者: 77七    时间: 2024-5-21 09:22

回复 14# 877

11楼代码28-30行,修改为:
  
  1. if defined e (
  2. set s=!e!
  3. ) else (
  4. set s=00:00:00,000
  5. )
复制代码

作者: 877    时间: 2024-5-21 10:07

回复 15# 77七


    谢谢大佬,真是辛苦您了~,微调后解决了~
作者: Five66    时间: 2024-5-21 18:07

回复 3# 877

这得反过来,根据srt内容去匹配查找txt文本
重复的可以找最近或者最先出现的
但是如果歌词本身包含标点或者要找到对应的连续的歌词就不知道怎么弄了,特别是txt文本每行片段多时
作者: 877    时间: 2024-5-21 18:10

回复 17# Five66


    是的,大佬说的也很对,




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2