[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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七大佬 与各位大佬出手相助~
万分感谢大家!

回复 17# Five66


    是的,大佬说的也很对,

TOP

回复 3# 877

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

TOP

回复 15# 77七


    谢谢大佬,真是辛苦您了~,微调后解决了~

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

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

回复 11# 77七


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

简直太牛了!!!

非常感谢我大哥!膜拜!

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

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

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

回复 7# 77七


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

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

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

TOP

回复 9# 77七


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

TOP

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

回复 8# 877


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

TOP

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

回复 5# 877


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

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


第一条时间前面的都视为0吗?
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

返回列表