借助开源项目,又好又快的实现视频文件”剧情连拍(剧情截图)”功能

简介: 借助开源项目,又好又快的实现视频文件”剧情连拍(剧情截图)”功能

 用过QQ影音(或其他类似播放器)的可能都知道,QQ影音有一个功能叫“剧情连拍”,可以对一部影片在不同时段进行截图,然后把这些截图放在一张并生成单独的图片。通过剧情图,可以一目了然的看到整部影片的画面风格,也就能大致猜出这部影片的类型,再加上字幕,甚至可以大概猜出影片的故事梗概。本人前些日子针对这个功能做了一些研究,小有成果,先上两张效果图:

  怎么样,效果还可以吧?要实现这种程序需要完成以下几种功能

  1. 实现从视频中截图的功能
  2. 分析文件格式,读取视频宽高和时长
  3. 把所有截图绘制在一张图像中

  下面一一道来:

1. 实现从视频中截图的功能

  首先第一个,也是最关键的一点,实现视频截图。对于截图这种需要解码视频的功能,我们最好借助于现有程序,著名的开源项目ffmpeg便可完成此功能,还有鼎鼎大名的开源播放器MPlayer,也提供的截图的命令接口,只需要简单的调用即可,两个程序生成的截图质量差不多,效率上却有些不同。

ffmpeg的调用命令为:

ffmpeg -i input.rmvb -y -f image2 -ss 08.010 -t 0.001 -s 352x240 output.jpg

  其中,-ss指定了截图的起始时间

  当然,这只能截取一张图片,我们要的是剧情连拍啊!不用着急,虽然没有现成的,我们可以自己来做,只要读取到影片的时长,我们就能够计算出需要在哪些时间来截图,这样,通过均匀分布截图时间,多次调用截图程序,就能生成一连串的截图,也就是剧情了。那怎么才能读取影片时长呢,来看第二步。

2. 分析文件格式,读取视频宽高和时长

  读取视频宽高和时长,需要解析视频格式。如今,媒体容器格式繁多复杂,要想准确的判断一个视频文件的格式和编码,不是件容易的事情。还好,我们有伟大的开源项目,用很多开源软件都可以读取出视频格式,这里推荐MediaInfo,因为它似乎就是为这个目的而建立的,生成的属性信息详细而准确,正是我们想要的。此外,MediaInfo还提供了一个动态链接库"MediaInfo.dll"。

  很明显,MediaInfo告诉了你,这个影片的时长(Duration),宽度(Width)和高度(Height),当然还有其他你想要或不想要的信息,够了。

3. 把所有截图绘制在一张图像中

  这个没什么好说的,只要前两步做出来了,这一步基本不是什么问题,根据视频的宽和高,以及最终结果图片的宽和高,计算出你需要对截图进行缩放的比例,然后把图像绘制在一起,生成新的图像即可。下面是用 Qt 实现这一步的代码:

1    int headerheight = 70;  // 顶上留一部分高度用了绘制logo和文件信息
 2     int interval = 4;  
3    int column_count = basecolumn_; 
4     int total_width = column_count * one_img_width + (column_count+1) * interval; 
5     int row_count = (imglist.size() + column_count-1 ) / column_count; 
6     int total_height = row_count * one_img_height + (row_count+1) * interval + headerheight; 7  8     int row_no = 0; 
9     int col_no = 0;
10     QImage totalImage(total_width, total_height, QImage::Format_ARGB32_Premultiplied);
11     totalImage.fill(qRgb(255, 255, 255));
12     QPainter imagePainter(&totalImage);
13     imagePainter.setRenderHint(QPainter::Antialiasing, true);
14     imagePainter.setPen(QPen(Qt::black, 1, Qt::SolidLine/*, Qt::RoundCap, Qt::RoundJoin*/));
15     imagePainter.setFont(QFont(tr("楷体"), 13, QFont::Bold));
16     QString titlename(tr("影片名:"));
17     titlename.append(QString::fromStdString(cinfo.title.c_str()));
18     titlename.append(tr("\t格式:"));
19     titlename.append(QString::fromStdString(cinfo.format_name));
20     imagePainter.drawText(150, 30, titlename);
21     std::ostringstream oss;
22     oss << "文件大小:" << cinfo.size / 1000000 << "MB\t视频尺寸:" 
23         << cinfo.width << "x" << cinfo.height << "\t视频时长:";
24     QString info = QString::fromStdString(oss.str());
25     info.append(TimetoStr(cinfo.duration));26     imagePainter.drawText(150, 55, info);
27
28
29     for (list<QImage>::const_iterator it = imglist.begin();
30         it != imglist.end(); ++it)
31     {
32         int img_x = col_no * one_img_width + (col_no+1) * interval;
33         int img_y = row_no * one_img_height + (row_no+1) * interval + headerheight;
34
35         imagePainter.drawImage(img_x, img_y, *it);
36
37         col_no++;
38         if ( (col_no % column_count) == 0 )
39         {
40             row_no ++;
41             col_no = 0;
42         }
43     }
44
45     imagePainter.end();46     totalImage.save(QString::fromStdString(outname));

  这样,模仿QQ影音剧情连拍的功能就实现了,然后呢,就可以在此基础上做其他的应用了。我是用Qt开发的,当然,很简单就能转换成其他的语言和类库来实现。

目录
相关文章
|
2月前
|
机器学习/深度学习 语音技术 开发工具
【独家秘籍】揭秘!如何用阿里云TTS魔法般将文字瞬间变成天籁之音,让你的作品开口说话,震撼人心!
【8月更文挑战第15天】通过阿里云语音合成服务(TTS),开发者可将文本转为自然语音,适用于有声阅读、客服等场景。首先注册并获取AccessKey ID/Secret,然后安装阿里云Python SDK。使用示例代码设置语音参数(如发音人xiaoyun、引擎wavenet),发送请求并保存生成的MP3文件。注意正确认证及异常处理,以确保应用稳定可靠。
167 0
|
2月前
|
移动开发 JavaScript 前端开发
【绝技揭秘】从零到英雄:解锁UniApp H5项目中的二维码生成与扫描秘籍,让你的应用瞬间变身扫码达人!
【8月更文挑战第20天】二维码在移动应用中无处不在。本文详述了在UniApp H5项目中实现二维码生成与扫描的方法。通过对比插件`uni-app-qrcode`和JavaScript库`qrcode-generator`生成二维码的方式,以及使用插件`@juggle/resize-observer`和HTML5的MediaDevices API进行扫描的技术方案,帮助开发者挑选最佳实践。无论是插件的便捷性还是原生JavaScript的灵活性,都能满足不同项目需求。
61 0
|
4月前
|
存储 JSON 关系型数据库
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
64 0
|
4月前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版5(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版5(附带项目源码)
31 0
|
4月前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版4(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版4(附带项目源码)
29 0
|
人工智能
【必备工具】兔哥视频助手,一键配音、字幕、配图,让你的视频秒变高大上!
通过输入文字,自动生成视频,让你的视频制作更加高效。
1309 0
|
安全 程序员 PHP
为拯救童年回忆,开发者决定采用古法编程:用Flash高清重制了一款游戏(二)
为拯救童年回忆,开发者决定采用古法编程:用Flash高清重制了一款游戏
|
XML 存储 JavaScript
为拯救童年回忆,开发者决定采用古法编程:用Flash高清重制了一款游戏(一)
为拯救童年回忆,开发者决定采用古法编程:用Flash高清重制了一款游戏
|
编解码 计算机视觉 Python
下一篇
无影云桌面