《趣学音视频》这段“朋友圈模版视频”的扛鼎之作是如何诞生的
大家好,这里是《趣学音视频》频道,我是 ucsheep
欢迎大家点赞、评论、关注、分享
长大,一个曾经憧憬,现在却感怀的事情
以上是一个“朋友圈视频模版”的扛鼎之作,整个视频散发着浓厚的朋友圈气息。熟悉的界面内,字里行间,抖着视频创作者的激灵。而中间大海波涛汹涌的动态画面,和耳畔的海浪声将观看者从颓靡的遐想中拉回现实,让观看者意识到“自己已经不是从前的自己”的残酷现实。
“长大”意味着什么?上面的视频给出了一个内涵且搞笑的答案。你看懂视频,摇摇头,会心一笑之时,是不是也有一丝伤怀——你已经和纯真、稚嫩彻底 Bye-Bye。既然已经看到这篇文章,不妨让我告诉你:一个长大的工程师,也是时候学点音视频知识了。
在抖音上经常会刷到类似上面的“朋友圈”模版视频,搞笑的文案、搞笑的视频,辅之以神评,往往播放量惊人。经我稍加思索,认为此类视频可以使用软件进行傻瓜式、批量化地生成,将其发扬光大。如你所见,上面的视频,并不是录屏,也不是剪辑软件剪辑,而是我用程序合成的。只需提供文案和视频素材,这个程序就会生产出类似上面的视频。
今天我将会帮你学会:如何用程序自动地合成出这样的视频。本文的结尾,我也会分享完整的源码及相关程序。
1.功能分析
![](/assets/blank.gif)
观察上面的视频截图,我们对此次开发的软件功能进行提炼。即,用户输入自定义文案和视频素材;程序将用户输入的文案渲染到视频背景中对应的区域,并且为背景内角色随机抽取头像,渲染到视频背景中各个角色的头像对应位置,最终将背景和视频素材合成,生产出目标视频。
1.1 用户输入
发布者昵称
视频上方对应文案
评论者昵称
评论者对应文案
发布者回复评论者的文案
画面中心视频素材
1.2 程序流程及输出
随机为角色(1 个发布者+1 个评论者+7 个点赞者)分配头像图片
渲染角色头像、文案生成背景图片
背景图片和视频素材合成最终视频
2.技术选择
根据需求,我们的技术重心分为背景图片合成及背景图与视频素材合成两部分。
其中背景图片合成部分,涉及图片与图片和合成、图片与文字的合成两种。我们采用 Python 的 Pillow 模块来实现。
背景图与视频素材合并,我们采用 FFmpeg 的 滤镜 实现。
3.实现步骤
3.1 基础底图制作
基础底图,我们直接从朋友圈找一条视频,然后截图,使用 PS 进行处理即可。处理之后,我们得到下面的效果 :
![](/assets/blank.gif)
这张图将我们截取的图片尺寸根据竖版视频 9/16 的比例重制为 720*1280。黑色部分为需要替换的视频素材和头像。文字部分进行了擦除。
![](/assets/blank.gif)
我们将需要动态合成的区域分为 3 类:
图片类区域(图片中用阿拉伯数字标注的 1-10 黑色区域)
图片类区域信息明细 | |||
---|---|---|---|
区域 | 左上角坐标 | 宽*高 | 描述 |
1 | 19,16 | 72*72 | 发布者头像 |
2 | 77,491 | 63*63 | 点赞者1头像 |
3 | 148,491 | 63*63 | 点赞者2头像 |
4 | 216,491 | 63*63 | 点赞者3头像 |
5 | 286,491 | 63*63 | 点赞者4头像 |
6 | 355,491 | 63*63 | 点赞者5头像 |
7 | 425,491 | 63*63 | 点赞者6头像 |
8 | 497,491 | 63*63 | 点赞者7头像 |
9 | 73,593 | 63*63 | 评论者头像 |
10 | 73,686 | 63*63 | 发布者头像 |
文本类区域(图片中使用红框框起并使字母 A-G 的区域)
文本类区域 | |||||
---|---|---|---|---|---|
区域 | 左上角坐标 | 字体字号 | 文字颜色(RGBA) | 字数 | 描述 |
A | 110,20 | 简黑 29 | 84,99,142,0 | 1-5 | 发布者昵称 |
B | 108,75 | 简黑 25 | 0,0,0,0 | 1~25 | 视频文案 |
C | 144,591 | 简黑 27 | 84,99,142,0 | 1-3 | 评论者昵称 |
D | 144,628 | 简黑 27 | 0,0,0,0 | 0-20 | 评论者文案 |
E | 144,684 | 简黑 27 | 84,99,142,0 | 1-5 | 发布者昵称 |
F | 199,722 | 简黑 27 | 84,99,142,0 | 1-2 | 评论者昵称 |
G | 294,721 | 简黑 27 | 0,0,0,0 | 1-10 |
回复评论者文案 |
视频区域
视频区域 | |||
---|---|---|---|
区域 | 左上角坐标 | 宽*高 | 描述 |
视频区域 | 107,112 | 514,332 | 填充视频素材 |
3.2 背景图合成
上面我成功制作了基础底图,并获取了所有合成所需参数。接下来就进行背景图制作。
3.2.1 头像渲染
我准备了 1695 个方形的头像图片,用于合成时随机调取。存放在 res/avatar 目录下。在这里,我们每个合成任务需要用到 9 个头像图片。所以我们实现了一个一次随机获取 9 个视频的函数,如下:
def getAvatarRandom():totalList = os.listdir("res/avatar")if len(totalList) == 9:return totalListrandIndex = random.randint(0,len(totalList)-9)return totalList[randIndex:randIndex+9]
在获取头像资源后,就需要在基础底图上渲染头像图片了。使用 Pillow 进行图像的合并,只需要像下面这样:
# 载入基础底图
bg_image = Image.open('res/bg.jpg')
# 载入头像图片1
avatar1 = Image.open('res/avatar/1.jpg')
# 缩放头像图片至指定尺寸
avatar1.thumbnail((72, 72))
# 在基础底图上的指定区域渲染头像图片1
bg_image.paste(avatar1, (19, 16))
# 预览合成效果
bg_image.show(bg_image)
# 将合成效果保存为图片
bg_image.save(fileName)
举一反三,随机获取所有头像资源并在背景底图上完成渲染的代码如下:
# 载入底图bg_image = Image.open('res/bg.jpg')# 随机获取9个头像并载入aList = getAvatarRandom()avatar1 = Image.open('res/avatar/' + aList[0])avatar2 = Image.open('res/avatar/' + aList[1])avatar3 = Image.open('res/avatar/' + aList[2])avatar4 = Image.open('res/avatar/' + aList[3])avatar5 = Image.open('res/avatar/' + aList[4])avatar6 = Image.open('res/avatar/' + aList[5])avatar7 = Image.open('res/avatar/' + aList[6])avatar8 = Image.open('res/avatar/' + aList[7])avatar9 = Image.open('res/avatar/' + aList[8])# 渲染9个头像avatar1.thumbnail((72, 72))bg_image.paste(avatar1, (19, 16))avatar1.thumbnail((63, 63))bg_image.paste(avatar1, (73, 686))avatar2.thumbnail((63, 63))bg_image.paste(avatar2, (77, 491))avatar3.thumbnail((63, 63))bg_image.paste(avatar3, (148, 491))avatar4.thumbnail((63, 63))bg_image.paste(avatar4, (216, 491))avatar5.thumbnail((63, 63))bg_image.paste(avatar5, (286, 491))avatar6.thumbnail((63, 63))bg_image.paste(avatar6, (355, 491))avatar7.thumbnail((63, 63))bg_image.paste(avatar7, (425, 491))avatar8.thumbnail((63, 63))bg_image.paste(avatar8, (497, 491))avatar9.thumbnail((63, 63))bg_image.paste(avatar9, (73, 593))
最终效果如下
3.2.2 文本渲染
使用 Pillow 进行文本渲染也很简单:
# 生成一个画板
draw = ImageDraw.Draw(bg_image)
text1 = "长大就是当你听到波涛汹涌,想到的却不是大海!"
# 载入样式
font1 = ImageFont.truetype("res/simhei.ttf", size=25)
# 使用draw在画板下面上指定区域,使用指定文字样式渲染文字
draw.text(xy=(108, 75), text=text1, font=font1, fill=(0, 0, 0, 0))
举一反三,所有文本的渲染源码如下:
# 文本声明text1 = "长大就是当你听到波涛汹涌,想到的却不是大海!"text2 = "骚骚的小马"text3 = "老铁铁"text4 = "精辟啊!"text5 = "低调低调!"# 创建画板draw = ImageDraw.Draw(bg_image)# 渲染文本font1 = ImageFont.truetype("res/simhei.ttf", size=25)draw.text(xy=(108, 75), text=text1, font=font1, fill=(0, 0, 0, 0))font2 = ImageFont.truetype("res/simhei.ttf", size=29)draw.text(xy=(110, 20), text=text2, font=font2, fill=(84, 99, 142, 0))font3 = ImageFont.truetype("res/simhei.ttf", size=27)draw.text(xy=(144, 591), text=text3, font=font3, fill=(84, 99, 142, 0))draw.text(xy=(199, 722), text=text3, font=font3, fill=(84, 99, 142, 0))draw.text(xy=(144, 684), text=text2, font=font3, fill=(84, 99, 142, 0))font4 = ImageFont.truetype("res/simhei.ttf", size=27)draw.text(xy=(144, 628), text=text4, font=font4, fill=(0, 0, 0, 0))font5 = ImageFont.truetype("res/simhei.ttf", size=27)draw.text(xy=(294, 721), text=text5, font=font5, fill=(0, 0, 0, 0))# 存储最终图片bg_image.save("tmp/" + fileName)
最终效果如下:
nao~,目前就只剩下画面正中的视频区域了。
3.3 背景图与视频合成
将视频素材渲染到背景图片的指定区域,其实就是 FFmpeg 的画中画效果,使用 FFmpeg 的滤镜功能实现。
关于 FFmpeg 的使用,本系列后续会特别推出新的文章进行解读,欢迎大家关注我,持续收看。
基于这个功能的需求,我们使用的命令如下:
ffmpeg.exe
-i task_bg.png
-vf "movie=demo.mp4,scale=514x332[test]; [in][test] overlay=x=107:y=112 [out]"
output.mp4
task_bg.png 为之前合成的最终背景图
demo.mp4 为准备的视频素材
scale 对视频素材进行了缩放处理
overlay 中 x、y 指定了视频素材渲染的位置
由于 movie 参数不支持斜杠“/”和反斜杠“\”,所以当我们遇到背景图片与视频素材不在同一个目录下时会很尴尬——没有办法在命令中使用路径来指定视频素材。
对于上面的问题,一般直接切换到视频素材的目录下,调用 ffmpeg 命令即可。如下:
cd 【视频素材路径】&&【ffmpeg所在目录】\ffmpeg.exe ……
看到这里,我们终于可以通过程序合成出“朋友圈模版视频”的扛鼎之作了!
4.结语
视频,往往倾注着创作者的灵感、传授知识的目的、分享讯息的愿望。我很反感类似做搬运这种毫无价值的腐食和偷窃行为。这类腐食的投机者往往钻营,【此处省略 300 字】,所以,程序和源码我还是不直接放这里了。
言而有信,结尾给出程序和完整源码:
print("想要源码和程序嘛?关注后私信我,我会酌情给予(仅限学习目的)~")
《趣学音视频》这段“朋友圈模版视频”的扛鼎之作是如何诞生的相关推荐
- android微信朋友圈视频无法播放,微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频功能安卓不能用吗?...
微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频功能安卓不能用吗?最近微信更新,用户可以进行分享自己手机里的视频,这一举措受到很多人的喜欢.那么微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频 ...
- 01-android 微信实现本地视频发布到朋友圈功能
以下内容是小女子看了转载的 原文链接:http://blog.csdn.net/jiangwei0910410003/article/details/53045634 哈哈尊重原创! 一.前言 前一篇 ...
- 为什么会有视频号?朋友圈还不够吗?
我用微信视频号发布了10+天的内容,引来越来越多的朋友来咨询视频号,我想在这里和大家,用"只讲人话,不讲概念"的方式,分享我的看法.大家的问题我整理了一下,主要有以下几个: 话不多 ...
- vue怎么设置封面_微信朋友圈封面视频如何制作?微信朋友圈封面视频制作软件VUE功能介绍...
貌似最近挺火的,很多人都把朋友圈相册封面变成了小视频,有声音还可以动;那么微信朋友圈封面视频如何制作呢?下面请看微信朋友圈封面视频制作软件VUE功能介绍. 微信朋友圈封面视频制作软件:VUE VUE怎 ...
- php朋友圈九宫格怎么做,微信朋友圈九宫格视频怎么做 图片背景加九宫格视频随机播放的效果制作|微信九宫格视频...
在如下图所示的新建项目窗口中,可以点击步骤一处的"浏览"按钮修改项目的存放位置,如果只是要输出为视频文件,这里的项目存放位置的设置用处也不大,最后输出视频文件后不保存项目即可:在步 ...
- 微信秒剪是什么意思 微信秒剪怎么剪辑视频发微信朋友圈
微信秒剪是什么意思? 微信秒剪是微信推出的一款用来剪辑视频的软件,使用秒剪可以增加微信朋友圈视频时长,此外还可以制作用户喜欢的视频.在秒剪的介绍中,AI剪辑这个概念放在了最前面.所谓AI剪辑,是保姆级 ...
- vue如何设置视频封面_微信朋友圈封面视频怎么制作的 VUE怎么进行使用
类型:图形图像大小:32.7M语言:中文 评分:10.0 标签: 立即下载 最近不少小伙伴发现别人的微信朋友圈封面是动态视频,但是不知道怎么进行制作,因此就让小编给大家讲讲如何制作属于自己的动态视频吧 ...
- 微信朋友圈小视频显示服务器超时,微信小视频转发到朋友圈却提示发送失败怎么办?...
相信很多朋友都有这样的困扰:微信小视频发送到朋友圈后,却提示发布失败,这是为什么呢?微信小视频发布失败有什么解决方法?那么,今天宿迁波仔就和大家分享一下正确发送小视频到朋友圈的方法. 自从微信更新6. ...
- Android 挂逼 修炼之行---微信实现本地视频发布到朋友圈功能
一.前言 前一篇文章已经详细介绍了如何使用Xposed框架编写第一个微信插件:摇骰子和猜拳作弊器 本文继续来介绍如何使用Xposed框架编写第二个微信插件,可以将本地小视频发布到朋友圈的功能.在这之 ...
最新文章
- 归并排序 java实现_归并排序的java实现
- 今天带你们走进缓存的雪崩、击穿、穿透基本概念
- 第五周实践项目7 后缀表达式
- 社区发现SLPA算法
- linux下的socket在哪个头文件,linux下socket编程常用头文件
- 【论文写作】毕业论文怎么写?写作步骤是什么?
- Linux 的 history 命令显示时间
- flask-login
- 简单高效,分享几款我在使用的效率神器
- 用计算机模拟宇宙,科学家尝试利用计算机模拟整个宇宙的演化
- Spotfire 连接mysql数据库
- Python——绘制词云图
- (五)工作中,工作外
- golang chan
- 云计算淡定从容的大局观
- 三层交换 VLAN 互访配置
- 教你如何在vue-cli项目打包时避免踩雷(一)【早看早受益】
- WIN10投影的无限显示器安装失败快速助手无法正常打开
- 查询oracle版本
- 支付业务名词及释义大全