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

[文件操作] 求助关于ffmpeg利用视频和poster生成缩略浏览Gif的写法.(超认真提问)

先感谢能能帮助我的大佬,我真的看了好久...头发都薅掉毛了都搞不定.
诉求:
文件中很多B站视频和电影,希望能通过收集和搜刮的文件,生成一个富信息的GIF,用于各种地方做索引.需求是,任意视频长度(10分钟-2小时)能自动分成8段,每段10帧的GIF,并且文件夹下的Cover文件作为GIF的前5帧显示.
心路历程:
本来希望在ffmpeg里找到直接调用的方法,但是找了一天发现只能-ss -to 指定固定时间,用抽帧比如隔20帧抽20帧的方法遇到电影又不好用,希望能8段10帧固定在80帧GIF下,那么大小能控制在20M以内,毕竟GIF挺大的,参考了http://bbs.bathome.net/thread-50807-1-1.html,http://bbs.bathome.net/viewthrea ... t=ffmpeg&page=2两个大佬给出的方案,研究了发现自己搞不定,所以发帖求救...
目前情况
目前研究自己是分了两个部分的,
  1. ffmpeg -r 8 -i file.jpg -i file.MP4 -vf "scale=400:-1" -an file.gif
复制代码
这个是希望视频和封面直接生成带封面的GIF.....翻车...
  1. ffmpeg -i file2.mp4 -c copy -map 0:0 -map 0:1 -segment_time 30 -f segment file%03d.MP4
复制代码
这个是希望把视频分6段...输出只能输出成30S一段...一堆文件,然后查询了上面两个大佬发的贴子,发现需要Bat函数的方式来做乘除....
以上.....解决是没解决,但是自己Notion做了几页的笔记了....顾求教大佬....感谢
附上日常文件结构..
发现没的发截图...直接路径了
  1. M:\Movie\19270206 Metropolis 大都会\大都会.1927.mp4
  2. M:\Movie\19270206 Metropolis 大都会\fanart.jpg
  3. M:\Movie\19270206 Metropolis 大都会\poster.jpg
  4. M:\Movie\19270206 Metropolis 大都会\大都会.1927.srt
  5. M:\Movie\19270206 Metropolis 大都会\大都会.1927.英语.srt
  6. M:\Movie\19270206 Metropolis 大都会\大都会.1927-mediainfo.xml
  7. M:\Movie\19270206 Metropolis 大都会\大都会.pbf
  8. M:\Movie\19270206 Metropolis 大都会\大都会.1927.nfo
复制代码
  1. V:\Know\差评君\2021-08-14 曾经人人都爱用的下载器,为何如今几乎无人问津?【差评君】\曾经人人都爱用的下载器,为何如今几乎无人问津?【差评君】.mp4
  2. V:\Know\差评君\2021-08-14 曾经人人都爱用的下载器,为何如今几乎无人问津?【差评君】\曾经人人都爱用的下载器,为何如今几乎无人问津?【差评君】.ass
  3. V:\Know\差评君\2021-08-14 曾经人人都爱用的下载器,为何如今几乎无人问津?【差评君】\Cover.jpg
复制代码

补充详细点需求,比如2H的电影,平均抽取8段10帧连贯的画面组合成一个GIF,然后首帧加入个持续1S的poster.jpg,这样一个GIF大概80帧8m左右,能包含整个视频的去预览信息.

TOP

  1. SET FSO = CREATEOBJECT("SCRIPTING.FILESYSTEMOBJECT")
  2. SET WSH329 = CREATEOBJECT("WSCRIPT.SHELL")
  3. FUNCTION NUMSTR(X) ' X > 0
  4. IF X < 1 THEN
  5. NUMSTR = 0 & X
  6. ELSE
  7. NUMSTR = X
  8. END IF
  9. END FUNCTION
  10. SUB TAKE(FN, T, CNT, Y, JPGFN, TMPNAM62)
  11. ' ffmpeg -ss 1 -t 0.002 -i QQ视频20221105205711.mp4 SAMPLES\sample.jpg -vframes 1  -an  -f image2
  12. FOR I = 1 TO CNT
  13. SET TS = FSO.OPENTEXTFILE(TMPNAM62, 8, TRUE)
  14. JPGFN2 = JPGFN & I & ".JPG"
  15. TS.WRITELINE("file '" & JPGFN2 & "'")
  16. TS.CLOSE
  17. ' CMD = "CMD /C ffmpeg -y -ss " & T & " -t " & NUMSTR(Y) * I & " -i """ & FN & """ """ & JPGFN & I & ".JPG"" -vframes 1  -an  -f image2"
  18. CMD = "CMD /C ffmpeg -y " & " -ss " & NUMSTR(T + Y * I) & " -i """ & FN & """ """ & JPGFN2 & """ -vframes 1  -an  -f image2"
  19. WSCRIPT.ECHO(CMD)
  20. WSH329.RUN CMD, 10, TRUE
  21. NEXT
  22. END SUB
  23. FUNCTION GET_DURATION(FN, TMPNAM62)
  24. ' ffmpeg -i QQ视频20221105205711.mp4 2>&1 | findstr Duration
  25. '  Duration: 00:00:13.23, start: 0.000000, bitrate: 1492 kb/s
  26. CMD = "CMD /C ffmpeg -i """ & FN & """ 2>&1 | findstr Duration > """ & TMPNAM62 & """"
  27. WSCRIPT.ECHO(CMD)
  28. WSH329.RUN CMD, 10, TRUE
  29. SET TS = FSO.OPENTEXTFILE(TMPNAM62, 1, FALSE, TRISTATETRUE)
  30. LN = TS.READLINE
  31. TS.CLOSE
  32. FSO.DELETEFILE TMPNAM62
  33. SET REGEX = NEW REGEXP
  34. REGEX.PATTERN = "(\d\d):(\d\d):(\d\d)"
  35. SET MATCHES = REGEX.EXECUTE(LN)
  36. T = CINT(MATCHES(0).SUBMATCHES(0))
  37. T = T * 60 + CINT(MATCHES(0).SUBMATCHES(1))
  38. T = T * 60 + CINT(MATCHES(0).SUBMATCHES(2))
  39. GET_DURATION = T
  40. END FUNCTION
  41. SUB MAIN4(FN, CNT, Y, JPGFD, TMPNAM62, GIFOUT)
  42. IF NOT FSO.FOLDEREXISTS(JPGFD) THEN
  43. FSO.CREATEFOLDER(JPGFD)
  44. END IF
  45. DURATION = GET_DURATION(FN, TMPNAM62)
  46. FOR I = 0 TO 7
  47. WSCRIPT.ECHO(I)
  48. TAKE FN, DURATION/8 *I, CNT, Y, JPGFD & "\SAMPLE-" & I & "-", TMPNAM62
  49. NEXT
  50. CMD = "ffmpeg -r 10 -f concat -safe 0 -i PRINT12912213.TMP.TXT " & GIFOUT
  51. WSCRIPT.ECHO(CMD)
  52. WSH329.RUN CMD, 10, TRUE
  53. END SUB
  54. MAIN4 WSCRIPT.ARGUMENTS(0), 10, 1, "SAMPLES21031", "PRINT12912213.TMP.TXT", WSCRIPT.ARGUMENTS(1)
复制代码
使用方法:保存为PRINTS.VBS文件,在命令行输入以下命令执行:
  1. CSCRIPT PRINTS.VBS "C:\Users\ADMIN\Videos\知识点精讲-毛概.FLV OUT.GIF
复制代码
后面两个参数是视频和GIF名称,根据实际修改。

TOP

返回列表