概述
本文介绍谷歌云 Transcoder API 的基本使用,以及应用 Transcoder API , Cloud Functions , Cloud Pub/Sub 等服务搭建自动化视频转码工作流的通用方案。该方案的架构如下图所示。后面的章节会介绍一些关键步骤的实现方法和示例。
以下为配置自动化转码任务的主要步骤。
在本地配置谷歌云命令运行环境
在谷歌云对象存储服务创建输入存储桶和输出存储桶
创建转码 Job Template ,做自定义转码配置
上传待转码视频文件并提交转码任务
轮询转码状态,或者使用消息队列接收转码完成通知
因为目前谷歌云转码服务暂时还不支持控制台界面话配置,下面的步骤都是使用 REST API 完成。为了生成鉴权的 OAuth Token ,也需要执行命令的环境安装谷歌云 gcloud 命令行工具,具体参考[4]Installing Google Cloud SDK
也可以在控制台 Cloud Shell 内执行命令,该环境自带谷歌云命令行工具。
谷歌云转码服务简介
谷歌云 Transcoder API 目前可以支持如下功能。
● 不同容器格式的输出 ,包括 MPEG-4 (MP4)、基于 HTTP 的动态自适应流式传输(DASH,也称为 MPEG-DASH)和 HTTP Live Streaming (HLS)
● 以不同的比特率和分辨率输出
● 以编程方式优化视频输出,包括:
○ 剪裁视频尺寸
○ 插入重叠式图片或动画
● 配置低层级编码参数,例如比特率
● 使用综合的编辑列表重新合成现有媒体内容
● 通过数字版权管理 ( DRM ) 系统加密内容以保护内容,包括:
○ 适用于 HLS 格式的 FairPlay 流式传输
○ 适用于 MPEG-DASH 格式的 PlayReady
○ 适用于 Chromium Web 浏览器和 Android 上的 MPEG-DASH 和 HLS 的 Widevine
● 插入广告关键帧以允许视频播放器客户端插入广告
● 使用生成的视频帧精灵表创建缩略图。
● 创建作业模板以保存和重复使用自定义或复杂的配置,从而对作业进行转码
对于转码的媒体文件,支持如下输入编码格式
支持如下输出编码格式
开通 Transcoder API
可以用下面步骤在谷歌云控制台开通 Transcoder API。首先在控制台搜索栏搜索 Transcoder API,并进入 Transcoder API 管理界面。
在 Transcoder API 管理界面,如果该服务没有开通,会有一个蓝色 ENABLE 按钮。点击此按钮以开通此服务。开通服务并不会产生任何费用。
服务开通后,可以点击 MANAGE 按钮来查看服务使用状态。
创建转码模板 Job Template
根据业务的需要,参照文档[3] JobConfig reference来创建 Job Template(转码模板)。下面为将输入文件转码为多码率 H264 编码 HLS 视频流的模板样例。
附录 B. Job Template 示例(下拉文章)
该示例也可以从 Github 地址下载。
https://github.com/eugeneyu/cloud-demos/blob/master/transcode/transcode-template-multi-bitrate.json
要创建 Job Template,首先配置环境变量
其中 PROJECT_ID 是谷歌云项目的 ID,LOCATION 是使用转码服务的谷歌云区域,TEMPLATE_ID 是客户自己定义的转码模板 ID 。
然后执行下面命令来创建 Job Template 转码模板。
注意,Job Template 不能更新,只能新加,或者对现有的删除后重建。删除 Job Template 可以用下面命令。
转码配置还要注意下面几点。
● 如果使用 Fragmented MP4 (fmp4) 封装格式,可以用同一组媒体文件来提供 DASH 和 HLS 流,仅是播放列表内容不一样,这样可以节省存储,方便管理。但是要注意,fmp4 封装不能混装( multiplex )音频和视频流在一个文件里,而需要把音频单独输出成一个文件。
● 如果使用传统的 TS 封装格式来提供 HLS 流,要注意可以使用 H264 或 H265 视频编码,但是不能使用 VP9 编码。
提交转码任务
转码任务配置主要指定输入文件,输出路径,和转码模板。输入文件需要是在谷歌云存储中的媒体文件。
如果提交任务顺利,命令行会输出任务的信息,其中含有如下的任务名称。
可以用命令轮询任务的执行情况,直到任务完成。
查询任务信息可以看到类似下面的输出。
当 state 为 RUNNING 时,任务仍在进行。当其为 SUCCEEDED 时,表示任务成功完成。
创建 Pub/Sub 消息队列接收转码完成通知
可以配置转码任务将转码结果自动投递到谷歌云 Pub/Sub 消息队列,来触发后续工作流。首先创建一个 Pub/Sub 的 Topic 来接收消息。
然后在刚创建的 Topic 的详情页点击创建 Subscription ,并选择 Create subscription。
给 Subscription 命名,其它配置保留缺省值即可。这个 Subscription 可以用来消费消息。
在 Subscription 详情页,可以点击 VIEW MESSAGES 按钮,在控制台查看队列中的消息。在转码任务提交并成功完成后,队列中会添加一条新消息,通知任务完成。
消息查看界面如下图。
使用 Cloud Functions 自动触发转码任务
如果想自动对新上传的视频文件进行转码,使用文件上传触发的 Cloud Functions 是一个比较合适的选择。下面步骤介绍如何配置一个自动转码的 Cloud Functions 云函数。
首先创建一个 Cloud Functions 实例。在配置中选择触发项为对象存储的文件创建事件。
在 Service Account 配置中选择可以读写对应对象存储,并执行 Transcoder API 的服务账号,比如 GCE 缺省服务账号。
在其它配置中的环境变量配置界面,配置如下几个环境变量。这几个变量会被下面的云函数代码读取,来进行一些自定义的输入输出配置。
注意函数的触发桶( Trigger Bucket )和转码文件的输出目的桶( DEST_LOCATION )不要配置成同一个,否则会导致循环转码。
在下面的界面填写 Cloud Functions 的 Python 代码和依赖包。
其中,依赖包为
Python 代码如下。也可以从 https://github.com/eugeneyu/cloud-demos/blob/master/cloud-functions/gcs_start_transcode.py 下载。
部署完云函数后,可以往输入桶上传一个视频文件,然后在云函数详情页查看执行日志。转码任务提交完成后,可以到 Pub/Sub 界面查看转码完成通知。也可以到对象存储响应输出目录查看结果文件。也可以用浏览器或[5] Shaka 播放器测试播放。
使用 Cloud Functions 自动发布转码后视频与上一节步骤类似,可以新建一个 Cloud Functions 云函数,设置其触发源为 Pub/Sub 消息队列。根据转码任务的完成消息,可以进行将输出文件移动到发布路径,并更新媒资系统或内容数据库。如果消息队列中收到的是转码失败消息,则做相应的错误处理和通知,比如将源视频文件移动到单独的目录。对于这些处理本文不提供示例代码,但是可以参考以下移动对象存储中文件的云函数。
https://github.com/eugeneyu/cloud-demos/blob/master/cloud-functions/bucket_to_bucket.py
附录
A. 参考文档和工具
[2] GCP Transcoder API Quickstart
[4] Installing Google Cloud SDK
[5] Shaka 播放器
B. Job Template 示例
评论