共计 4428 个字符,预计需要花费 12 分钟才能阅读完成。
前言
开始讲之前先解决大家看到这个题目时心里的 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` 是底框的色彩,black@0.5 示意彩色透明度是 50%,`boxborderw` 是底框距文字的宽度
// `x` 和 `y` 是文字的地位,`x` 和 `y` 不只反对数字,还反对各种表达式,具体能够去官网查看
ffmpeg -i input.mp4 -vf "drawtext=fontfile=/path/to/font.ttf:text=' 你的文字 ':fontcolor=white:fontsize=24:box=1:boxcolor=black@0.5: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 应用上或者视频剪辑大家有什么问题,欢送给我留言。