前言
开始讲之前先解决大家看到这个标题时心里的3个疑惑:
- 视频剪辑不是用Adobe的软件就可以做了吗?
- 为什么要用Serverless?
- 如何写代码做视频剪辑?
首先说说哪些视频剪辑场景是Adobe等软件无法完成的
大家平常接触到的视频剪辑通常都是使用Premiere,AE等这类专业工具来完成视频剪辑。他们能完成一些复杂的效果,比如做宣传视频,广告视频等。
但有些企业在某些业务场景下是期望能批量且自动化的完成视频剪辑。
比如以下几种场景:
- 假设学校期望能在学生上完网课之后马上呈现所有学生学习过程中的精彩视频,配上学校的logo和宣传语等,让学生一键分享自己的成果。假设有1万个学生,需要为每个学生制作独一无二的视频,所以需要批量且自动化的完成1万个不同的视频剪辑。
- 某次营销活动中,需要为不同的用户生成不同的头像视频来吸引用户参与。每个用户的头像都是独一无二的,生成的视频也是独一无二的,用户可能成千上万,因此自动化完成是必须的条件。
- 网红运营公司期望能给所有主播生成统一的营业视频。可能有100个主播,专门找一个人剪辑100个视频好像勉强能接受,但如果每周都要剪一次不同的视频呢?所以自动化,批量和可定制化的剪辑就成了主要需求。
以上的场景中有三个特点:
- 批量
- 自动化
- 可定制
对于符合以上特点的场景,是传统的视频剪辑工具或者模版化的视频处理软件无法轻松完成的。
再来说说为什么用Serverless
因为视频剪辑这样的业务有几个特点:
- 使用时段集中。
- 计算量大。
单独购买高规格的服务器利用率很低,买便宜的服务器计算能力又跟不上。
因此Serverless按量计费的特点,以及高性能的计算能力,完美匹配了这样的需求场景。
既能达到100%的利用率,又能按量使用它的高性能计算能力。
同时,Serverless拥有多变的可编程环境,可以使用熟悉的编程语言,灵活性很高。
最后说说如何写代码做视频剪辑
本文章提到的所有视频剪辑的功能,都是用FFmpeg这个工具,所以先给大家讲讲什么是FFmpeg。
FFmpeg是一个用来做视频处理的开源工具,它有非常强大的功能,它支持视频剪辑、视频转码、视频编辑、音频处理、添加文字、视频拼接、拉流推流直播等功能。
我们通过不同的FFmpeg命令就可以编程完成不同的视频剪辑功能,组合编排起来,就可以应对各种批量自动化的场景了。
视频剪辑批量化、自动化与定制化实践
常见的视频剪辑场景主要包含以下几种:
- 视频转码
- 视频裁剪
- 视频加文字
- 视频加图片
- 视频拼接
- 视频加音频
- 视频转场
- 视频特效
- 视频加速慢速播放
接下来给大家展示一些具体的FFmpeg命令例子,如果你在本地安装了FFmpeg,也可以在本地执行这些命令。关于怎么安装FFmpeg,可以去看官网的教程。
// 将MOV视频转成mp4视频
ffmpeg -i input.mov output.mp4
// 将原视频的帧率修改为24
ffmpeg -i input.mp4 -r 24 -an output.mp4
// 将mp4视频转为可用于直播的视频流
ffmpeg -i input.mp4 -codec: copy -bsf:v h264_mp4toannexb -start_number 0 -hls_time 10 -hls_list_size 0 -f hls output.m3u8
// 将视频分别变为480x360,并把码率改400
ffmpeg -i input.mp4 -vf scale=480:360,pad=480:360:240:240:black -c:v libx264 -x264-params nal-hrd=cbr:force-cfr=1 -b:v 400000 -bufsize 400000 -minrate 400000 -maxrate 400000 output.mp4
// 给视频添加文字,比如字幕、标题等。
// `fontfile`是要使用的字体的路径,`text`是你要添加的文字,
// `fontcolor`是文字的颜色,`fontsize`是文字大小,`box`是给文字添加底框。
// `box=1`表示enable,`0`表示disable,`boxcolor`是底框的颜色,[email protected]表示黑色透明度是50%,`boxborderw`是底框距文字的宽度
// `x`和`y`是文字的位置,`x`和`y`不只支持数字,还支持各种表达式,具体可以去官网查看
ffmpeg -i input.mp4 -vf "drawtext=fontfile=/path/to/font.ttf:text='你的文字':fontcolor=white:fontsize=24:box=1:[email protected]:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2" -codec:a copy output.mp4
// 给视频添加图片,比如添加logo、头像、表情等。filter_complex表示复合的滤镜,overlay表示表示图片的x和y,enable表示图片出现的时间段,从0-20秒
ffmpeg -i input.mp4 -i avatar.JPG -filter_complex "[0:v][1:v] overlay=25:25:enable='between(t,0,20)'" -pix_fmt yuv420p -c:a copy output.mp4
// 视频拼接,list.txt里面按顺序放所有要拼接的视频的文件路径,如下。
// 注意,如果视频的分辨率不一致会导致拼接失败。
ffmpeg -f concat -safe 0 -i list.txt -c copy -movflags +faststart output.mp4
// list.txt的格式如下
file 'xx.mp4'
file 'yy.mp4'
// 视频加音频,stream_loop表示是否循环音频内容,-1表示无限循环,0表示不循环。shortest表示最短的MP3输入流结束时完成编码。
ffmpeg -y -i input.mp4 -stream_loop -1 -i audio.mp3 -map 0:v -map 1:a -c:v copy -shortest output.mp4
FFmpeg能做的事情非常多,这里就不一一讲解了。更多的玩法可以在FFmpeg官网上探索探索。
对于音频的编辑也是同样的道理,FFmpeg也支持单独对音频进行编辑。
如何运行FFmpeg命令
因为Python运行这些命令比较便捷,所以我们可以使用python来运行所有的FFmpeg命令。同时python在serverless云函数上运行性能也比较好,部署也方便。
通过Python来使用FFmpeg的视频剪辑代码在文章最后有开源链接。并且在官网上也有模版可以直接使用,覆盖了常见的音视频剪辑等操作。
这里就展示一个简单的调用代码示例。
child = subprocess.run('./ffmpeg -i input.mov output.mp4',
stdout=subprocess.PIPE,
stderr=subprocess.PIPE, close_fds=True, shell=True)
if child.returncode == 0:
print("success:", child)
else:
print("error:", child)
raise KeyError("处理视频失败, 错误: ", child)
在serverless部署
上面提到的常见的视频剪辑场景我已经实现并开源了,下载代码直接部署到serverless就可以使用了。
https://github.com/woodyyan/ffmpeg-composition
https://github.com/woodyyan/ffmpeg-splice
这里分为了两个函数,一个负责处理单个视频,一个负责把多个视频拼接成一个视频并配上背景音乐。
目前支持以下功能:
- 在视频中添加文字
- 视频分辨率转换
- 在视频中添加图片
- 视频拼接
- 添加背景音乐
源码里展示的只是常见的一些视频剪辑场景,大家可以根据自己的业务需要,编写自己的视频剪辑逻辑。
Serverless部署
方式一:Github Action自动部署
- Fork仓库。
- 在仓库的Settings-Secrets-Actions中添加
TENCENT_SECRET_ID
和TENCENT_SECRET_KEY
两个密钥。ID和KEY可以在腾讯云的访问控制里面获取。 - 添加之后,在Action中就可以发起部署了。每次修改代码推送后,也会自动触发Action部署。
- 如果需要有一些自定义的配置,请修改serverless.yml。
- 云函数最终会自动部署到
TENCENT_SECRET_ID
所在的账号下。
方式二:云函数控制台手动部署
- 下载代码。
- 在根目录把所有文件和文件夹一起打包成一个ZIP文件。
- 去云函数控制台,新建一个函数。
选择从头开始:
- 选择python语言。
- 上传ZIP文件。
- 函数内存建议选择较大的内存。
- 开启异步执行。
- 执行超时时间根据视频大小建议设置长一点,比如30秒以上。
- 配置触发器,选择API网关触发器,关闭集成响应。
- 完成部署后,就可以通过API网关的URL开始调用了。
真实案例回顾
一个做网课的学校,需要每次在学生上完网课之后把上网课的录像制作成一段30秒的视频,作为学生的学习成果。
此案例有几个关键的信息点:
- 通常一堂课有200个学生,需要同时制作200个视频。
- 需要把1小时的上课视频剪辑成30秒。
- 由于每个学生的上课屏幕有所不同,因此录制的视频都是不同的。
- 最终的成果视频还需要加上学生的名字和头像。
- 学生结束上课的时间很集中,因此制作视频时会有短时高并发。
- 每次上完课的时候才会需要制作视频,时段比较固定且集中。
综合上述特点,用Serverless来做这样的视频剪辑带来了多个好处:
- 解决了200个并发的问题,不需要自己搭建过多的服务器。
- 解决了只在发生时段使用的问题,其他时段都没有成本产生。
- 解决了需要较强计算能力快速制作视频的问题。
下面是这个案例的参考架构图。
总结
通过编排、组合、复用上面列举的各种音视频剪辑的场景,就能制作出各种各样想要的效果。
然后把视频剪辑中用来控制各种效果的参数,变成调用服务时传入的参数,就能实现各种效果的定制化了。
最后再总结一下通过这种写代码的方式完成视频剪辑的使用场景:
- 解决通过修改个别参数来批量制作视频的场景。
- 解决通过用户触发来自动化制作视频的场景。
- 解决不同场景需要不同定制化的制作视频的场景。
同时,利用serverless来完成视频剪辑,同样也解决了以下几个问题:
- 因为通常视频剪辑不是全天运行,利用serverless按量付费的特性能优化成本。
- 因为视频剪辑通常是重计算场景,利用serverless可选的高规格配置来应对这种重计算。
- 在批量制作视频的场景中通常会存在高并发,利用serverless自动弹性伸缩的特性能轻松应对高并发。
关于Serverless使用上或者视频剪辑大家有什么问题,欢迎给我留言。