开始讲之前先解决大家看到这个标题时心里的3个疑惑:
大家平常接触到的视频剪辑通常都是使用Premiere,AE等这类专业工具来完成视频剪辑。他们能完成一些复杂的效果,比如做宣传视频,广告视频等。
但有些企业在某些业务场景下是期望能批量且自动化的完成视频剪辑。
比如以下几种场景:
以上的场景中有三个特点:
对于符合以上特点的场景,是传统的视频剪辑工具或者模版化的视频处理软件无法轻松完成的。
因为视频剪辑这样的业务有几个特点:
单独购买高规格的服务器利用率很低,买便宜的服务器计算能力又跟不上。
因此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也支持单独对音频进行编辑。
因为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就可以使用了。
https://github.com/woodyyan/ffmpeg-composition
https://github.com/woodyyan/ffmpeg-splice
这里分为了两个函数,一个负责处理单个视频,一个负责把多个视频拼接成一个视频并配上背景音乐。
目前支持以下功能:
源码里展示的只是常见的一些视频剪辑场景,大家可以根据自己的业务需要,编写自己的视频剪辑逻辑。
方式一:Github Action自动部署
TENCENT_SECRET_ID
和TENCENT_SECRET_KEY
两个密钥。ID和KEY可以在腾讯云的访问控制里面获取。TENCENT_SECRET_ID
所在的账号下。方式二:云函数控制台手动部署
一个做网课的学校,需要每次在学生上完网课之后把上网课的录像制作成一段30秒的视频,作为学生的学习成果。
此案例有几个关键的信息点:
综合上述特点,用Serverless来做这样的视频剪辑带来了多个好处:
下面是这个案例的参考架构图。
通过编排、组合、复用上面列举的各种音视频剪辑的场景,就能制作出各种各样想要的效果。
然后把视频剪辑中用来控制各种效果的参数,变成调用服务时传入的参数,就能实现各种效果的定制化了。
最后再总结一下通过这种写代码的方式完成视频剪辑的使用场景:
同时,利用serverless来完成视频剪辑,同样也解决了以下几个问题:
关于Serverless使用上或者视频剪辑大家有什么问题,欢迎给我留言。