写点什么

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

2021 年 3 月 24 日

使用 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 年 3 月 24 日 18:10262

评论

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

还搞不懂C语言中的函数指针?看完你就明白了

北游学Java

c c++ 编程语言 指针 函数

tcp/ip协议栈——epoll的内部实现原理

Linux服务器开发

TCP/IP 后端开发 epoll 网络协议栈 服务器开发

架构师训练营第 1 期 - 第十周总结

Todd-Lee

极客大学架构师训练营

跨国区块链投资 花式“割韭菜”骗光你的钱

CECBC区块链专委会

区块链

WSL2:我在原生的Win10玩转Linux系统

梁桂钊

一张图彻底理解Spring如何解决循环依赖!!

冰河

spring aop ioc 源码解析 循环依赖

Week 10 作业

黄立

架构师训练营第 10 周学习总结

netspecial

极客大学架构师训练营

清华大佬马士兵告诉你从阿里P5级一直学到P8架构师的成长路线+视频教程!

比伯

Java 编程 架构 面试 计算机

警务大数据可视化平台建设方案,公安大数据平台搭建

13530558032

《具有算法和程序的离散数学基础》PDF免费下载

计算机与AI

算法 离散数学

学习工作即游戏:游戏化生存的现实物语

脑极体

Redis面试受阻?阿里P8架构师整理出的核心笔记+实战+面试题+脑图送你

比伯

Java 编程 程序员 面试 计算机

“通证经济”实质是生产关系的变革

CECBC区块链专委会

通证经济

5G矿山,工业真金,以及智能体矿井

脑极体

精心整理MySQL基本使用(数据库的操作、数据类型、MySQL的常用命令)

ShenDu_Linux

c++ MySQL 程序员 数据类型

讲真,你知道Python咋来的吗?

华为云开发者社区

Java Python 编程语言 C语言 代码

go-zero 如何扛住流量冲击(二)

Kevin Wan

go microservice

架构师训练营第 1 期 - 第十周作业

Todd-Lee

极客大学架构师训练营

EMAS 移动 DevOps 解决方案 —— Mobile DevOps

应用研发平台EMAS

阿里云 DevOps 运维 开发 emas

我是如何在五年阿里面试官的连珠炮问下三面斩获Java岗offer,最后定级P6的呢?

Java~~~

深入浅出Spark

大数志

大数据 spark 数据科学

Python进阶——什么是上下文管理器?

Kaito

Python

数字时代,如何跟上互联网医院的建设潮?

CECBC区块链专委会

数字化医疗

Week 1 学习总结

J

极客大学架构师训练营

五周 - 总结

水浴清风

iOS 项目避坑:多个分类中方法重复实现检测

iOSer

ios 项目管理 编程语言 iOS Document

架构方法

raox

极客大学架构师训练营

我就不信2W字把源码拆的这么碎,你还不明白mybatis缓存

996小迁

Java 源码 架构 面试 mybatis

区块链跨境溯源平台搭建,助力跨境电商防伪溯源

13530558032

白皮书丨关于工业互联网,你想知道的都在这儿

华为云开发者社区

工业互联网 华为云 白皮书 ICT 智能

4月17日 HarmonyOS 开发者日·上海站

4月17日 HarmonyOS 开发者日·上海站

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