11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

使用 GCP Transcoder API 构建自动化转码工作流

  • 2021-03-24
  • 本文字数:3590 字

    阅读完需:约 12 分钟

使用 GCP Transcoder API 构建自动化转码工作流

概述

本文介绍谷歌云 Transcoder API 的基本使用,以及应用 Transcoder API , Cloud Functions ,  Cloud Pub/Sub 等服务搭建自动化视频转码工作流的通用方案。该方案的架构如下图所示。后面的章节会介绍一些关键步骤的实现方法和示例。

 


以下为配置自动化转码任务的主要步骤。

 

  1. 在本地配置谷歌云命令运行环境

  2. 在谷歌云对象存储服务创建输入存储桶和输出存储桶

  3. 创建转码 Job Template ,做自定义转码配置

  4. 上传待转码视频文件并提交转码任务

  5. 轮询转码状态,或者使用消息队列接收转码完成通知

 

因为目前谷歌云转码服务暂时还不支持控制台界面话配置,下面的步骤都是使用 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 下载。


from google.auth import compute_engineimport google.auth.transport.requestsimport osimport requestsimport loggingfrom flask import abort
PROJECT_ID = os.environ['PROJECT_ID']PROJECT_LOCATION = os.environ['PROJECT_LOCATION']DEST_LOCATION = os.environ['DEST_LOCATION']TEMPLATE_ID = os.environ['TEMPLATE_ID']
def exit_abort(): return abort(500)

def start_transcode(event, context):
bucket_name_input = event['bucket'] object_name_input = event['name'] file_name = os.path.split(object_name_input)[1] file_name_wo_extension = os.path.splitext(file_name)[0]
cred = compute_engine.credentials.Credentials()
auth_req = google.auth.transport.requests.Request() cred.refresh(auth_req) #print(cred.token)
api_url = "https://transcoder.googleapis.com/v1beta1/projects/{}/locations/{}/jobs".format(PROJECT_ID, PROJECT_LOCATION)
headers = { "Authorization": "Bearer {}".format(cred.token), "Content-Type": "application/json" }
test = "gs://{}/{}".format(bucket_name_input, object_name_input) print("Bucket: {}, inputUri: {}\n".format(bucket_name_input, test))
data = { "inputUri": "gs://{}/{}".format(bucket_name_input, object_name_input), "outputUri": "{}/{}/".format(DEST_LOCATION, file_name_wo_extension), "templateId": "{}".format(TEMPLATE_ID) }
response = requests.post(url = api_url, headers=headers, json = data)
if not response.ok or "error" in response.text: logging.error(RuntimeError(response.text)) exit_abort()
response_json = response.json() print("New job started - Job Name: {}".format(response_json['name']))
复制代码


部署完云函数后,可以往输入桶上传一个视频文件,然后在云函数详情页查看执行日志。转码任务提交完成后,可以到 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. 参考文档和工具

[1] GCP Transcoder API 概览

[2] GCP Transcoder API Quickstart

[3] JobConfig reference

[4] Installing Google Cloud SDK

[5] Shaka 播放器


B. Job Template 示例







2021-03-24 18:10962

评论

发布
暂无评论
发现更多内容

基于Segment Routing技术构建新一代骨干网:智能、可靠、可调度(二)

UCloud技术

云计算 运维 云网络

Nacos源码编译

Fox

nacos

💯 关于 TCP 三次握手和四次挥手,满分回答在此

飞天小牛肉

面试 后端 计算机网络 TCP/IP 2月春节不断更

商务部发力数字商务:鼓励企业开展区块链等先进技术创新应用

CECBC

区块链

100+标杆案例和1个减法:华为“懂行100”给2021带来了什么?

脑极体

基于Segment Routing技术构建新一代骨干网:智能、可靠、可调度(一)

UCloud技术

云计算 网络 云网络

全面提升企业的主动防御能力,UCloud全新架构云安全中心正式公测!

UCloud技术

网络安全 恶意解析 云安全 安全漏洞

链上公开透明 链下迷雾重重 区块天眼能否拨开行业疑云

CECBC

区块链

产品经理训练营-第三周作业

羽室

5 个最值得注意的开源集中式日志管理工具

程序员石磊

Linux 日志 性能监控 日志监控

【盘点2020】连续8个月霸榜,年度最佳公有云竟然是它?

博睿数据

冰河去腾讯了?

冰河

程序员 程序人生 冰河 冰河技术

分析 BAT 互联网巨头在大数据方向布局及大数据未来发展趋势

五分钟学大数据

大数据 2月春节不断更

Seata1.4.0源码编译

Fox

seata

游戏夜读 | 游戏中的确定性

game1night

日记 2021年2月3日(周三)

Changing Lin

个人感悟 2月春节不断更

非科班Java面试快手三面,如果不是疫情,offer已经到手了

Java架构之路

Java 程序员 架构 面试 编程语言

拆散的乐高怎么装起来

李小腾

黄际洲获CCF优秀博士学位论文奖 搜索推荐技术创新成果显著

爱极客侠

区块链时代,企业如何构筑竞争力的护城河?

CECBC

区块链

5G专网是个大西瓜(二):碰撞之谜

脑极体

原子性操作类的使用

武哥聊编程

Java 多线程 原子性 28天写作

硬盘的秘密

yes

机械硬盘

SpringCloud 从入门到精通17---Sentinel降级/热点规则

Felix

学习感恩

谷鱼

Linux-Lab 入门:详细步骤分解

贾献华

Linux 嵌入式 Linux Kenel 开发板 boot

官宣 | Atlassian 针对中国市场推出适用于所有团队的本地化部署方案!

Atlassian

项目管理 DevOps 敏捷 Atlassian Jira

深入理解nodejs的HTTP处理流程

程序那些事

node.js HTTP 异步编程 程序那些事

使用 GCP Transcoder API 构建自动化转码工作流_语言 & 开发_于有志_InfoQ精选文章