前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >视频分布式转码-只需批量计算一个API

视频分布式转码-只需批量计算一个API

原创
作者头像
风之泪
修改2020-02-10 15:57:14
2.2K1
修改2020-02-10 15:57:14
举报
文章被收录于专栏:巫山跬步巫山跬步

1. 视频分布式转码

网络流量分析机构Sandvine 2018年10月的《全球互联网现象报告》中显示,在全球整体的互联网下行流量中,视频占到了近58%。现在原始视频的分辨率越来越高,但是在互联网带宽有限的情况下,大部分视频提供商都需要将原始视频转码成多种清晰度的视频,便于用户在不同的网络环境中选择不同清晰度的视频进行观看。因此,视频转码成了必不可少的技术环节。

目前视频转码系统一般的架构形式如下图所示:

转码系统架构
转码系统架构

转码系统中各个角色的功能如下:

转码中心控制节点:负责调度和分发转码任务,原始视频切片和转码后视频合并等工作。

转码机: 从中心控制节点接收转码任务,完成转码工作,高CPU消耗。

存储系统:存储源视频供转码机机型下载,以及转码后的视频供用户下载。

而为了加快转码速度,多采用分片转码,具体流程如下图所示:

分片转码原理图
分片转码原理图

若从零开始搭建这套转码系统需要开发的服务器角色多、交互多、任务管理调度复杂。一般转码机都是高CPU消耗,这就需要提高硬件配置,而在没有转码任务时,系统中的服务器实际是处于空闲状态,这也是一种很大的资源浪费。

使用腾讯云的批量计算产品,只需要调用一个API-SubmitJob 就能自动完成上述复杂的调度和交互流程。并且批量计算只在提交转码任务时才创建腾讯云服务器,在转码任务完成后自动释放云服务器,做到按量按需使用,极大地节约资源。同时批量计算结合了腾讯云的竞价实例,更是能让云服务器使用成本减少90%以上。

本文将介绍一种使用腾讯云批量计算完成分布式转码的方法。

2. 使用腾讯云批量计算转码

2.1. 批量计算简介

腾讯云批量计算-Batch Compute,动态创建服务器资源以响应提交的作业,可以免除用户配置维护云服务器的工作,按需使用。同时批量计算利用自身的调度功能,能有效地处理作业内部任务之间的先后关系,免去复杂的调度逻辑,让使用者将更多的精力集中于数据的处理和分析上。

2.2. 批量计算与分布式转码

批量计算中有三个重要的概念:

作业:用户提交批处理工作的最小单位,它由单个或多个有前后依赖关系的任务组成。可以通过非常易用的 DAG 语法,来给多个批处理任务设置依赖关系,共同组成一个作业,然后依次执行各个任务,直到所有任务完成。

任务:作业的基本组成单位,包含了实际在一台云服务器上执行的应用程序的相关信息。

任务实例: 批量计算调度和执行的最小单元,负责执行具体的计算任务。

现在我们在分布式转码这个场景上,具化批量计算这三个重要的概念。

转码作业中包含三个任务:视频分片任务,视频转码任务和视频合并任务。

而视频转码任务中又包含多个分片视频转码的任务实例。

具体的对应关系如下图所示:

批量计算通过作业、任务和任务实例这种内在的逻辑关系,就可以帮助我们在视频分片结束后,多机器并行执行转码工作,当全部分片转码结束后,执行视频合并工作。这与传统转码系统相比,就少去了中心节点服务器与转码机之间复杂的交互和调度逻辑。

2.3. 批量计算与存储系统

批量计算提供的存储映射功能,可以将腾讯云对象存储 COS 或文件存储 CFS映射到云服务器的本地文件系统,这样转码程序就可以以操作本地文件系统的方式来读写远程存储。便于转码服务器下载源视频文件和上传转码后的视频文件。这与传统转码系统相比,只需要添加存储映射配置路径,省却了搭建存储服务器的工作。另外如果使用COS存储转码后的文件,则可以作为CDN的源站,使得视频分发工作更容易。

3. 批量计算进行转码示例

3.1. 整体架构

3.2. 视频文件存储目录结构

批量计算使用CFS或者COS来存储视频文件方式都是一样的,只是在作业中配置的存储映射地址不同而已。本示例,使用CFS存储。

下面我们来介绍视频存储目录结构:

video/source:存放原始视频文件。

video/split:存放切片后的文件。

video/transcode:存放转码后的切片文件。

video/output:存放合并后的完整转码文件。

每个视频以视频名作为目录存放到上述各个目录中。

3.3. 转码方法介绍

转码工具使用音视频行业最常使用的ffmpeg。

3.3.1. 视频切片命令

代码语言:javascript
复制
ffmpeg -y -i /data/video/source/megaproject/megaproject.mp4 -acodec copy -vcodec copy -f segment -segment_time 120 -reset_timestamps 1 -segment_list /data/video/transcode/megaproject/filelist.txt -segment_list_type ffconcat -map 0:0 -map 0:1 /data/video/split/megaproject/%d.mp4

主要参数介绍:

-f segment :按照关键帧进行视频切片,这样可以防止视频合并后有重叠的现象发生。

-segment_time 120 :按照每段视频120秒来切片。时间可以自行设置。

-reset_timestamps 1: 每个切片的视频时间戳从0开始。

-segment_list : 存放切片视频名的列表文件。

-segment_list_type ffconcat: 指定存放切片视频名列表文件的格式,ffconat表示可以使用ffmpeg conat 解复用器来使用的文件格式。

/data/video/split/megaproject/%d.mp4 :表示切片后视频命名路径和格式,%d表示从0开始一直到N-1,表示N个切片。

3.3.2. 分片后视频转码命令

代码语言:javascript
复制
ffmpeg -y -i /data/video/split/megaproject/${BATCH_TASK_INSTANCE_INDEX}.mp4 -vcodec libx264 -acodec aac -b:a 128k -strict -2 -s 640x480 /data/video/transcode/megaproject/${BATCH_TASK_INSTANCE_INDEX}.mp4

主要参数介绍:

-vcodec libx264:视频编码格式。

-strict -2: aac :ffmpeg中aac音频为experimental,为了使用该格式,需要加上此参数。

-s 640x480: 转码后视频分辨率。

${BATCH_TASK_INSTANCE_INDEX}这个环境变量为批量计算任务实例的编号,与实例个数N相关。取值范围为[0, N-1],这正好对应ffmpeg分片出来的视频名称序号。

3.3.3. 视频合并命令

代码语言:javascript
复制
ffmpeg -y -f concat -i /data/video/transcode/megaproject/filelist.txt -c copy /data/video/output/megaproject/480P_megaproject.mp4

主要参数介绍:

-f concat: 表示合并视频

-i /data/video/transcode/megaproject/filelist.txt:表示根据filelist.txt文件中的视频来合并。

-c copy: 表示对音视频流只进行简单复制。

3.4. 构造批量计算提交作业API

使用批量计算转码,只需要使用SubmitJob API,填入作业、任务、任务实例,云服务器和挂载存储映像的参数即可。

本次示例我们将一个720P时长50分钟的视频,转码为480P的视频为例,每个转码分片为2分钟,共25个分片。转码后视频编码为libx264,音频编码为aac。

下面介绍构建的SubmitJob API的主要参数:

全部参数可以参考API文档:/document/product/599/15907

完整的API请求参数,请见附件submitjob.json。

3.4.1. 作业参数

创建一个Job:video-transcode

Job中包含为三个Task:split,transcode和join。

Task split:任务实例数TaskInstanceNum=1。

Task transcode:任务实例数TaskInstanceNum=N=25,N为视频分片的数量。

Task join:任务实例数TaskInstanceNum=1。

代码语言:javascript
复制
{
	"Job": {
		"JobName": "video-transcode",
	  "Tasks": [
			 {
					"TaskName": "split",
					"TaskInstanceNum": 1,
					"Application": {
						"Command": "/data/code/split.sh megaproject"
					}
				},
				{
					"TaskName": "transcode",
					"TaskInstanceNum": 25,
					"Application": {
						"Command": "/data/code/transcode.sh megaproject"
					}
				},
				{
					"TaskName": "join",
					"TaskInstanceNum": 1,
					"Application": {
						"Command": "/data/code/join.sh megaproject"
					}
				}
		]
	}
}

其中Command为云服务器中执行的命令,split.sh,transcode.sh,join.sh中存放的内容对应于3.3节中介绍的使用ffmpeg进行视频切片,转码和合并的命令。

作业中任务执行顺序:

使用Dependences参数表示任务之间的关系

代码语言:javascript
复制
"Dependences": [
		{
			"StartTask": "split",
			"EndTask": "transcode"
			
		},
		{
			"StartTask": "transcode",
			"EndTask": "join"
			
		}
]

3.4.2. 云服务器参数

代码语言:javascript
复制
"ComputeEnv": {
		"EnvData": {
				"InstanceType": "S2.SMALL2",
	 		 "ImageId": "img-hmxop735",
		}
}

InstanceType:”S2.SMALL2” ,表示使用云服务器机型为1核CPU,2G内存。

ImageId: “img-hmxop735”,表示云服务器操作系统镜像,具体为centos7.4 预装了ffmpeg2.8.6的操作系统。

3.4.3. 存储映射路径参数

代码语言:javascript
复制
"InputMappings": [
 {
   "SourcePath": "cifs://10.10.10.10/8lzib3st/",
   "DestinationPath": "/data/"
 }
 ]

SourcePath:cifs://10.10.10.10/8lzib3st/,表示CFS远端路径。

DestinationPath: /data/,表示本地挂载路径。

3.5. 转码结果

视频分片后多机并行转码,每个视频分片转码任务耗时3分钟左右。

批量计算分布式转码整体耗时12分钟11秒

单机转码整体耗时32分钟23秒

4. 总结

根据上述对传统转码系统的分析和批量计算的介绍,我们对比一下两者在完成分布式转码功能上的差异。

对比点

传统转码系统

批量计算

服务器硬件数量

数量固定,空闲时资源浪费

动态扩缩容,按需使用与释放。

服务器硬件配置级别与使用

多转码任务共享,配置高,价格贵

转码任务独占,配置低,价格低,使用竞价实例云服务器,更是能减少90%以上成本。

转码任务调度

自行开发程序,中心节点和转码机交互逻辑多,调度复杂。

调用一个API,批量计算作业,内部自动支持任务先后顺序的调度。

文件存储

自行开发,业务逻辑复杂

无缝对接腾讯云COS或者CFS存储。

文件分发

转码文件需上传源站后,自行分发,对接CDN分发。

转码后文件自动上传腾讯云COS后,可无缝对接腾讯云CDN分发。

批量计算为分布式转码提供了一个新的解决方案,只需要一个API调用,即可省却开发复杂转码系统的工作。不仅能提高转码速度,还可以免去维护服务器资源和转码程序的工作。

5. 参考资料

1.《全球互联网现象报告》

https://www.sandvine.com/hubfs/downloads/phenomena/2018-phenomena-report.pdf

2.ffmpeg https://www.ffmpeg.org/ffmpeg.html

3.腾讯云批量计算 /document/product/599

4.腾讯云云服务器 /document/product/213

5.腾讯云COS /document/product/436

6.腾讯云CFS /document/product/582

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 视频分布式转码
  • 2. 使用腾讯云批量计算转码
    • 2.1. 批量计算简介
      • 2.2. 批量计算与分布式转码
        • 2.3. 批量计算与存储系统
        • 3. 批量计算进行转码示例
          • 3.1. 整体架构
            • 3.2. 视频文件存储目录结构
              • 3.3. 转码方法介绍
                • 3.3.1. 视频切片命令
                • 3.3.2. 分片后视频转码命令
                • 3.3.3. 视频合并命令
              • 3.4. 构造批量计算提交作业API
                • 3.4.1. 作业参数
                • 3.4.2. 云服务器参数
                • 3.4.3. 存储映射路径参数
              • 3.5. 转码结果
              • 4. 总结
              • 5. 参考资料
              相关产品与服务
              图像处理
              图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
              http://www.vxiaotou.com