[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

  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七大佬 与各位大佬出手相助~
万分感谢大家!

下面这样的情况下怎么弄

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
带出温暖,永远在背后

TOP

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

回复 2# Five66


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

有其他思路也行~

TOP

txt和srt 有什么对应规律?全是一行对6行?
bat小白,请多指教!谢谢!

TOP

回复 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
带出温暖永远在背后

TOP

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

回复 5# 877


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

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


第一条时间前面的都视为0吗?
bat小白,请多指教!谢谢!

TOP

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

回复 8# 877


   3对 txt和srt文件,一共6个文件。只提供几个特例,写了不一定能用。时间好算,ffmpeg代码我不会改。
bat小白,请多指教!谢谢!

TOP

回复 9# 77七


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

TOP

回复 7# 77七


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

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

然后,修改zoompan滤镜的d参数,

TOP

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

TOP

回复 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
复制代码
bat小白,请多指教!谢谢!

TOP

回复 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
复制代码
bat小白,请多指教!谢谢!

TOP

回复 11# 77七


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

简直太牛了!!!

非常感谢我大哥!膜拜!

TOP

回复 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...

TOP

回复 14# 877

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

TOP

返回列表