.:. 草榴社區 » 技術討論區 » [跨平台]视频 宫格缩略预览图 生成脚本工具
本頁主題: [跨平台]视频 宫格缩略预览图 生成脚本工具字體大小 寬屏顯示 只看樓主 最新點評 熱門評論 時間順序
爱自由


級別:精靈王 ( 12 )
發帖:1216
威望:725 點
金錢:981 USD
貢獻:31448 點
註冊:2015-03-27

[跨平台]视频 宫格缩略预览图 生成脚本工具

0x0
印象中, 在某榴社区/杏某社区, 查看技术文章的时候,
经常看到一些根据视频制作的宫格缩略图, 如下图. 感觉一张图就能把整个资料一览无遗. 很强大.

 

大概查了下, 包括很多软件都是基于 ffmpeg 做的二次开发,
所以, 今天把 ffmpeg 下载下来 研究了下这个东西是如何制作的.

0x1 依赖环境
- ffmpeg
要使用这个工具,您需要在系统上安装ffmpeg
ffmpeg 是一个用于处理音频和视频文件的命令行工具。
ffmpeg 支持广泛的视频和音频格式、编解码器和容器,可以使用各种选项和过滤器进行定制,以达到特定的任务。
ffmpeg 可在 Windows、Mac 和 Linux 上使用,您可以按照官方网站上的说明进行安装。
还有许多第三方应用程序和库使用 ffmpeg 作为后端执行音频和视频处理任务。

0x2 How it works?
经过几天研究, 得出结论 , 要想实现这个宫格效果图,我们需要分三步:
- 0x0. 根据宫格数量, 将视频拆成 n 个片, 每个片截取一张图最后 合并成一张大图. 顺便将 缩略图当前的时间写入到图片中. 最后输出 大图 pic_x_y
- 0x1. 生成一张空白大图,获取视频信息(视频大小/长度/文件名) 写如到图片中, 输出 pic_info
- 0x2. 将 pic_x_y pic_info 俩张图 合并到一块
如果各位大佬有更优解,请指出 ~ 谢谢 !!

0x2.0x0
首先利用 ffprobe 计算视频总时长
複製代碼
  1. ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "one-piece.E0162.mkv
  2. 1423.700000
複製代碼

假设 我们要切成 3x4, 那么就是一共12个图 ,
1423.700000/(3x4+1) ~= 109.51
我们根据 chunk 数量 计算平均时间, 这里 + 1 是因为 切片不是从0开始的, 是从第一个片的结束时间开始的. 如果不加1, 很可能最后只能切够 11 个图
之后用 ffmpeg 按 109秒的时间循环截取图片,并且合并成 3x4 的 大图
複製代碼
ffmpeg -i "/Users/voidm/Downloads/one-piece.E0162.mkv" -frames:v 1 -update 1 -vf "select=(gte(t\,109.51))*(isnan(prev_selected_t)+gte(t-prev_selected_t\,109.51)),drawtext=text='%{pts\:hms}':fontsize=h/15:fontcolor=white:x=w/20:y=h/20, scale=636:-1,tile=3x4:padding=20:margin=50:color=gray, " -fps_mode auto "/Users/voidm/Downloads/one-piece.E0162.mkv_time_2.png"


参数介绍:
select=(gte(t\,109.51))*(isnan(prev_selected_t)+gte(t-prev_selected_t\,109.51
- 109.51: 切片时间
tile=3x4:padding=20:margin=50:color=gray
- tile=3x4: 指定网格的行列数,这里是 3 行 4 列。
- padding=20: 指定每个帧之间的间距,这里是 20 像素。
- margin=50: 指定大图像的边距,这里是 50 像素。
- color=gray: 指定间距的颜色,这里是灰色。

drawtext=text='%{pts\:hms}':fontsize=h/15:fontcolor=white:x=w/20:y=h/20
- text='%{pts\:hms}': 指定要添加的文本内容,这里是显示视频时间戳的小时、分钟和秒数。
- fontsize=h/15: 指定文本字体的大小,这里是视频高度的 1/15。
- fontcolor=white: 指定文本的颜色,这里是白色。[*]x=w/20: 指定文本的水平位置,这里是视频宽度的 1/20。[*]y=h/20: 指定文本的垂直位置,这里是视频高度的 1/20。
scale=$tile_img_width:-1
scale 是输出分辨率, 用法有俩种. 放到tile前面是代表 tile 每一个切片的大小, 放到后面则是汇总图的大小.
如果在tile之后放置scale,则参数控制最终合成图像的分辨率。并且tile中的padding/margin属性可能无法正确计算。
所以我们这离要放到 tile 前面。
此时我们需要根据最终输出的大图的width , 以及 padding,margin 计算出小图的 width
公式如下:
複製代碼
tile_img_width=$(echo "($composite_img_width - ($padding * ($x-1)) - ($margin * 2)) / $x" | bc)


假设: composite_img_width =2048,margin=50,padding=20 , 则 tile_img_width = 636
scale= 636:-1
执行完后就有了下图:
 
0x2.0x1
然后我们将视频信息写入到一张单独的小图中
複製代碼
  1. info=$(ffprobe -v quiet -print_format json -show_format -show_streams "$abs_video_file")
  2. filename=$(echo "$info" | jq -r '.format.filename')
  3. size=$(echo "$info" | jq -r '.format.size')
  4. duration=$(echo "$info" | jq -r '.format.duration')
  5. width=$(echo "$info" | jq -r '.streams[0].width')
  6. height=$(echo "$info" | jq -r '.streams[0].height')
  7. cat >$text_tile <<EOF
  8. Filename: $video_name
  9. Size: $size
  10. Resolution: ${width}x${height}
  11. duration: ${duration}
  12. EOF
複製代碼


先用 ffprobe 获取视频信息, 得到一个 json串,之后 用固定的 jsonpath 获取到视频的时长/大小/分辨率..
然后将这些视频先写入到一个 txt 文件中去, 之后在调用 ffmpeg 生成一张大图, 然后把 txt 写入到大图中
複製代碼
ffmpeg -f lavfi -i color=gray:s=2048x130:d=1 -update 1 -filter:v "drawtext=textfile='/Users/voidm/Downloads/one-piece.E0162.mkv_info.txt':fontsize=24:fontcolor=white:x=50/2:y=h/4" "/Users/voidm/Downloads/one-piece.E0162.mkv_info.png"


参数介绍 :
- lavfi -i color=gray:s=2048x130:d=1: 指定一个灰色的背景,大小为 2048x130 像素
- drawtext=textfile='/Users/voidm/Downloads/one-piece.E0162.mkv_info.txt':指定要在视频中绘制的文本内容[*]fontsize=24 :指定字体大小为 24。
- fontcolor=white: 指定字体颜色为白色。
得到了下图:
 

0x2.0x2
最后 将 0x2.0x0 得到的图片 向上拉伸 130px 的位置,把 0x2.0x1 得到的图片 填充进来
複製代碼
ffmpeg -i "/Users/voidm/Downloads/one-piece.E0162.mkv_time_2.png" -i "/Users/voidm/Downloads/one-piece.E0162.mkv_info.png" -update 1 -frames:v 1 -filter_complex "[0:v]pad=iw:ih+130:0:130:color=white[top]; [top][1:v]overlay=0:0" "/Users/voidm/Downloads/one-piece.E0162.mkv_merge.png"


参数介绍:
- filter_complex: 指定要应用的复杂滤镜,可以在输入流之间进行多个滤镜操作。
- pad=iw:ih+130:0:130:color=white[top]: 使用 pad 滤镜将第一个输入流的视频流进行填充,使其高度增加 130 像素,并将填充后的视频流保存为 top。
- iw: 表示填充后的视频宽度与输入视频宽度相同。
- ih+130: 表示填充后的视频高度比输入视频高度增加了 130 像素。
- 0:130: 表示在垂直方向上向上填充 130 像素。
- color=white: 表示填充的颜色为白色。
- [top][1:v]overlay=0:0: 使用 overlay 滤镜将填充后的视频流 top 和第二个输入流中的视频流进行叠加,将第二个输入流的视频流放置在填充后的视频流的左上角。- - 0:0: 表示在水平方向和垂直方向上都不向右或向下偏移。

注意这些数字都是计算出来的,比如这里的填充 130 其实就是 信息小图的高度 , 而且 要合并的俩张图的宽度也得是一致的
最终得到成品图 :
 

0x3 一部到胃
为了方便, 我封装制作了一键shell 脚本..
複製代碼
  1. Usage:
  2. # Mac/Linux
  3. sh thumbnail_maker.sh sample/video.mp4 4 5
  4. # Windows
  5. .\thumbnail_maker.bat sample\video.mp4 3 4
複製代碼


Github:
https://github.com/marlkiller/thumbnail_maker↗.
0x3 支持的平台
- Mac OS
- Linux
- Win


注:若转载请注明来源(本贴地址)与作者信息。


[ 此貼被爱自由在2023-07-24 21:49重新編輯 ]

赞(22)
DMCA / ABUSE REPORT | TOP Posted: 07-23 14:58 發表評論
是小小


級別:騎士 ( 10 )
發帖:3565
威望:365 點
金錢:6323 USD
貢獻:0 點
註冊:2015-01-19

感谢分享
TOP Posted: 07-23 15:00 #1樓 引用 | 點評
子树


級別:精靈王 ( 12 )
發帖:24198
威望:2470 點
金錢:34340 USD
貢獻:0 點
註冊:2022-11-15

感谢分享
TOP Posted: 07-23 15:05 #2樓 引用 | 點評
夜转青丝塌


級別:光明使者 ( 14 )
發帖:10205
威望:33195 點
金錢:22279 USD
貢獻:23456 點
註冊:2020-01-26

视频缩略图的样板视频看起来不错 又李连杰没


點評

    TOP Posted: 07-23 15:13 #3樓 引用 | 點評
    黑石头


    級別:精靈王 ( 12 )
    發帖:2752
    威望:847 點
    金錢:25241 USD
    貢獻:20436 點
    註冊:2011-06-06

    技术贴,学习了
    TOP Posted: 07-23 15:16 #4樓 引用 | 點評
    岱宗


    級別:聖騎士 ( 11 )
    發帖:1568
    威望:225 點
    金錢:2802038 USD
    貢獻:31024 點
    註冊:2016-10-24

    用potplayer就可以,把所有需要生成缩略图的视频放到一个列表中,然后批量自动生成就行


    點評

      TOP Posted: 07-23 15:36 #5樓 引用 | 點評
      肥菜


      級別:天使 ( 14 )
      發帖:4823
      威望:658 點
      金錢:6426998 USD
      貢獻:2520040 點
      註冊:2015-03-16

      感谢分享
      TOP Posted: 07-23 15:50 #6樓 引用 | 點評
      深渊两腿之间


      級別:聖騎士 ( 11 )
      發帖:3922
      威望:393 點
      金錢:5897 USD
      貢獻:30001 點
      註冊:2022-03-13

      谢谢分享
      TOP Posted: 07-23 16:02 #7樓 引用 | 點評
      qqq0623


      級別:精靈王 ( 12 )
      發帖:45859
      威望:4469 點
      金錢:1977518 USD
      貢獻:1137 點
      註冊:2011-06-06

      感谢分享
      TOP Posted: 07-23 16:10 #8樓 引用 | 點評
      秦皇


      級別:光明使者 ( 14 )
      發帖:5793
      威望:19140 點
      金錢:110148 USD
      貢獻:286 點
      註冊:2022-02-02

      感谢分享
      TOP Posted: 07-23 16:30 #9樓 引用 | 點評
      折木泛舟


      級別:俠客 ( 9 )
      發帖:666
      威望:112 點
      金錢:5784 USD
      貢獻:0 點
      註冊:2022-06-15

      感谢分享
      TOP Posted: 07-23 17:27 #10樓 引用 | 點評
      白贲


      級別:聖騎士 ( 11 )
      發帖:3448
      威望:210 點
      金錢:14165 USD
      貢獻:25000 點
      註冊:2023-02-23

      感谢技术分享,萌新弱弱的问一句,某杏社区是什么神秘存在?


      點評

        TOP Posted: 07-23 17:30 #11樓 引用 | 點評
        潇洒在风尘间


        級別:聖騎士 ( 11 )
        發帖:6629
        威望:839 點
        金錢:22346 USD
        貢獻:10 點
        註冊:2023-03-15

        技术贴好啊
        TOP Posted: 07-23 17:34 #12樓 引用 | 點評
        浮生戏娇妹


        級別:聖騎士 ( 11 )
        發帖:2587
        威望:259 點
        金錢:116204 USD
        貢獻:21519 點
        註冊:2020-03-23

        技术好贴,感谢大佬整理分享!
        TOP Posted: 07-23 18:25 #13樓 引用 | 點評
        魚沙沙沙


        級別:精靈王 ( 12 )
        發帖:18761
        威望:1872 點
        金錢:2085 USD
        貢獻:50 點
        註冊:2016-03-24

        枝术帖子弄不了
        TOP Posted: 07-23 19:16 #14樓 引用 | 點評
        缘客


        級別:騎士 ( 10 )
        發帖:4491
        威望:450 點
        金錢:439374 USD
        貢獻:72 點
        註冊:2021-11-05

        感谢分享
        TOP Posted: 07-23 19:20 #15樓 引用 | 點評
        幸福的源泉


        級別:騎士 ( 10 )
        發帖:4221
        威望:423 點
        金錢:4562 USD
        貢獻:0 點
        註冊:2021-01-01

        谢谢分享
        TOP Posted: 07-23 19:46 #16樓 引用 | 點評
        榜一大哥


        級別:俠客 ( 9 )
        發帖:990
        威望:100 點
        金錢:22 USD
        貢獻:0 點
        註冊:2022-04-21

        支持一下
        TOP Posted: 07-23 20:39 #17樓 引用 | 點評
        你好骚啊


        級別:騎士 ( 10 )
        發帖:17351
        威望:320 點
        金錢:7908 USD
        貢獻:4267 點
        註冊:2019-01-23

        谢谢分享哦
        TOP Posted: 07-23 21:01 #18樓 引用 | 點評
        隔壁王二偷人


        級別:禁止發言 ( 8 )
        發帖:6710
        威望:656 點
        金錢:3762 USD
        貢獻:44078 點
        註冊:2021-12-26

        支持技术分享
        TOP Posted: 07-23 21:26 #19樓 引用 | 點評
        leavezh


        級別:俠客 ( 9 )
        發帖:1665
        威望:247 點
        金錢:10037 USD
        貢獻:0 點
        註冊:2016-09-13

        膜拜,大牛各有各的牛逼。
        TOP Posted: 07-23 21:35 #20樓 引用 | 點評
        缺氧过后的爱


        級別:騎士 ( 10 )
        發帖:4442
        威望:445 點
        金錢:4855 USD
        貢獻:0 點
        註冊:2019-10-26

        谢谢分享
        TOP Posted: 07-23 23:06 #21樓 引用 | 點評
        囧囧侠


        級別:聖騎士 ( 11 )
        發帖:3618
        威望:466 點
        金錢:14398275 USD
        貢獻:20203 點
        註冊:2011-10-11

        内容精彩
        TOP Posted: 07-24 00:03 #22樓 引用 | 點評
        飛无痕


        級別:聖騎士 ( 11 )
        發帖:2503
        威望:684 點
        金錢:4560 USD
        貢獻:7315 點
        註冊:2023-04-27

        1024
        TOP Posted: 07-24 00:23 #23樓 引用 | 點評
        我不是片神


        級別:俠客 ( 9 )
        發帖:1030
        威望:104 點
        金錢:2167 USD
        貢獻:0 點
        註冊:2023-07-12

        了解,的确如此
        TOP Posted: 07-24 12:45 #24樓 引用 | 點評
        .:. 草榴社區 » 技術討論區


        電腦版 手機版 客戶端 DMCA
        用時 0.01(s) x2, 11-03 04:24