首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >腾讯云服务视频,腾讯云点播的视频上传和转码功能

腾讯云服务视频,腾讯云点播的视频上传和转码功能

原创
作者头像
用户6459747
修改于 2019-10-15 02:06:33
修改于 2019-10-15 02:06:33
16K00
代码可运行
举报
运行总次数:0
代码可运行

有些用户烦恼腾讯云储存上传大文件的各种不方便,比如不能转码(要转码得先把mp4文件从云存储上下载下来,然后通过服务器执行ffmpeg操作,最后再把切割的ts文件上传到腾讯云,过程复杂且容易出错),不能获取实时的上传进度等等,所以就发现腾讯云点播这项技术。相对来说通过腾讯云点播既能实现上传进度的获取,而且还能上传完成后自动转码,比如自动把mp4转换为m3u8格式的清单文件来进行分片加载,这样子既能大大加快加载速度,还能保护视频链接的url,所以就记录一下这种技术的使用原理。

  云点播视频上传Js端的sdk如下http://video.qcloud.com/sdk/upload.html,现在的官方sdk页面做的比较挫,希望腾讯云以后能改进,毕竟寻找一个方法还要点击“查看网页源代码”让人感觉很方。

  首先在html头部引入云点播的js,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script src="http://qzonestyle.gtimg.cn/open/qcloud/js/vod/sdk/uploaderh5.js" charset="utf-8"></script>

然后在页面写上一个button因为云点播是通过绑定一个button的方法来实现input type='file':

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<button class="btn btn-default" id="video">选择文件</button>

页面长成这个样子

 接着在js里定义一个初始化云点播上传条件的方法initUpload(),绑定后只要在页面上拉取了文件,每隔1s腾讯服务器就会给你一个回调,你可以根据回调里不同的返回码来写上自己的处理方法。另外,当你在页面选择好一个文件后,js代码会去计算其SHA值,在计算完后才能调用qcVideo.uploader.startUpload()进行上传操作,否则会报错。在上传完成后云点播会返回一个已上传文件在腾讯服务器上的唯一标识args.serverFileId,其实现代码如下:

//初始化直播上传

function initUpload()

{

//检测浏览器是否支持

var $ = qcVideo.get('$');

var Version = qcVideo.get('Version');

if( !qcVideo.uploader.supportBrowser() )

{

if(Version.IS_MOBILE)

{

alert('当前浏览器不支持上传,请升级系统版本或者下载最新的chrome浏览器');

}

else

{

alert('当前浏览器不支持上传,请升级浏览器或者下载最新的chrome浏览器');

}

return;

}

//绑定按钮及回调处理

accountDone('video',‘你的云点播secretId’,1,1,'你的转码成功后得回调url',null);

}

/**

*

* @param upBtnId 上传按钮ID

* @param secretId 云api secretId

* @param isTranscode 是否转码

* @param isWatermark 是否设置水印

* @param [transcodeNotifyUrl] 转码成功后的回调

* @param [classId] 分类ID

*/

function accountDone(upBtnId,secretId, isTranscode, isWatermark,transcodeNotifyUrl,classId)

{

var $ = qcVideo.get('$'),

ErrorCode = qcVideo.get('ErrorCode'),

Log = qcVideo.get('Log'),

JSON = qcVideo.get('JSON'),

util = qcVideo.get('util'),

Code = qcVideo.get('Code'),

Version = qcVideo.get('Version');

qcVideo.uploader.init(

{

web_upload_url: 'http://vod.qcloud.com/v2/index.php',

secretId: secretId, // 云api secretId

getSignature: function (argStr, done)

{//注意:出于安全考虑, 服务端接收argStr这个参数后,需要校验其中的Action参数是否为 "MultipartUploadVodFile",用来证明该参数标识上传请求

$.ajax({

'dataType': 'json',

'url': '你的签名路径' + encodeURIComponent(argStr),

'success': function (d)

{

done(d['result']);

}

});

},

upBtnId: upBtnId, //上传按钮ID(任意页面元素ID)

isTranscode: isTranscode,//是否转码

isWatermark: isWatermark,//是否设置水印

after_sha_start_upload: false,//sha计算完成后,开始上传 (默认关闭立即上传)

sha1js_path: '/calculator_worker_sha1.js', //计算sha1的位置

disable_multi_selection: false, //禁用多选 ,默认为false

transcodeNotifyUrl: transcodeNotifyUrl,//(转码成功后的回调地址)isTranscode==true,时开启; 回调url的返回数据格式参考 http://www.qcloud.com/wiki/v2/MultipartUploadVodFile

classId: classId,

// mime_types, 默认是常用的视频和音频文件扩展名,如MP4, MKV, MP3等, video_only 默认为false,可允许音频文件上传

filters: {max_file_size: '8gb', mime_types: [], video_only: true}

}

//2: 回调

, {

/**

* 更新文件状态和进度 code:1、准备计算SHA 2、计算完SHA,准备上传 3、SHA计算中 4、即将上传 5、上传进度更新 6、上传完成

* @param args { id: 文件ID, size: 文件大小, name: 文件名称, status: 状态, percent: 进度 speed: 速度, errorCode: 错误码,serverFileId: 后端文件ID }

*/

onFileUpdate: function (args)

{

if(args.code == 1 || args.code == 3)//计算SHA中

{

//你的逻辑,比如显示文件名等信息

}

else if(args.code == 2) //计算完SHA

{

//计算完SHA值,准备开始上传,这步执行完之后才能执行qcVideo.uploader.startUpload()即上传操作

}

elseif(args.code == 5 )//上传中

{

//获取实时进度

var percent=args.percent+'%';

$(".progress-bar").css({'width':percent});

}

elseif(args.code == 6 )//上传完成

{

$(".progress-bar").css({'width':'100%'}); //取得回调的视频serverFileId,用于后面更新字段用

var file_id=args.serverFileId; console.log(params);

}

},

/** * 文件状态发生变化,暂时不用 * @param info { done: 完成数量 , fail: 失败数量 , sha: 计算SHA或者等待计算SHA中的数量 , wait: 等待上传数量 , uploading: 上传中的数量 } */

onFileStatus: function (info)

{

$('#count').text('各状态总数-->' + JSON.stringify(info));

},

/** * 上传时错误文件过滤提示,暂时不用 * @param args {code:{-1: 文件类型异常,-2: 文件名异常} , message: 错误原因 , solution: 解决方法} */

onFilterError: function (args)

{

var msg = 'message:' + args.message + (args.solution ? (';solution==' + args.solution) : ''); console.log(msg);

}

} );

}

在文件上传完成后如果选择了转码,腾讯云点播会去对文件转码,并在成功后给你设置的回调url发请求,根据回调里的$_POST['file_id']来更新DB为转码完成即可。

  js端说完了,现在来看php端,要通过后台向云点播发请求相对来说比较复杂,首先你要定义一个方法,方法可从官网上找到实例:

https://www.qcloud.com/doc/api/257/1976,简易修改后方法如下:

public function CreateRequest($HttpUrl, $HttpMethod, $COMMON_PARAMS, $secretKey, $PRIVATE_PARAMS, $isHttps)

{

$FullHttpUrl = $HttpUrl . "/v2/index.php";

/***************对请求参数 按参数名 做字典序升序排列,注意此排序区分大小写*************/

$ReqParaArray = array_merge($COMMON_PARAMS, $PRIVATE_PARAMS);

ksort($ReqParaArray);

/**********************************生成签名原文**********************************

* 将 请求方法, URI地址,及排序好的请求参数 按照下面格式 拼接在一起, 生成签名原文,此请求中的原文为

* GETcvm.api.qcloud.com/v2/index.php?Action=DescribeInstances&Nonce=345122&Region=gz

* &SecretId=AKIDz8krbsJ5yKBZQ ·1pn74WFkmLPx3gnPhESA&Timestamp=1408704141

* &instanceIds.0=qcvm12345&instanceIds.1=qcvm56789

* ****************************************************************************/

$SigTxt = $HttpMethod . $FullHttpUrl . "?";

$isFirst = true;

foreach ($ReqParaArray as $key => $value) {

if (!$isFirst) {

$SigTxt = $SigTxt . "&";

}

$isFirst = false;

/*拼接签名原文时,如果参数名称中携带_,需要替换成.*/

if (strpos($key, '_')) {

$key = str_replace('_', '.', $key);

}

$SigTxt = $SigTxt . $key . "=" . $value;

}

/*********************根据签名原文字符串 $SigTxt,生成签名 Signature******************/

$Signature = base64_encode(hash_hmac('sha1', $SigTxt, $secretKey, true));

/***************拼接请求串,对于请求参数及签名,需要进行urlencode编码********************/

$Req = "Signature=" . urlencode($Signature);

foreach ($ReqParaArray as $key => $value) {

$Req = $Req . "&" . $key . "=" . urlencode($value);

}

/*********************************发送请求********************************/

if ($HttpMethod === 'GET') {

if ($isHttps === true) {

$Req = "https://" . $FullHttpUrl . "?" . $Req;

} else {

$Req = "http://" . $FullHttpUrl . "?" . $Req;

}

$Rsp = file_get_contents($Req);

}

// var_export(json_decode($Rsp,true)) ;

return json_decode($Rsp, true);

}

同时再写一个通用的调用API的方法,把API的名称以及参数传过去即可:

public function videoApi($action, $private_params)

{

/*DescribeInstances 接口的 URL地址为 cvm.api.qcloud.com,可从对应的接口说明 “1.接口描述” 章节获取该接口的地址*/

$HttpUrl = "vod.api.qcloud.com";

/*除非有特殊说明,如MultipartUploadVodFile,其它接口都支持GET及POST*/

$HttpMethod = "GET";

/*是否https协议,大部分接口都必须为https,只有少部分接口除外(如MultipartUploadVodFile)*/

$isHttps = true;

/*需要填写你的密钥,可从 https://console.qcloud.com/capi 获取 SecretId 及 $secretKey*/

$secretKey = '你的SecretKey';

/*下面这五个参数为所有接口的 公共参数;对于某些接口没有地域概念,则不用传递Region(如DescribeDeals)*/

$COMMON_PARAMS = array(

'Nonce' => rand(),

'Timestamp' => time(NULL),

'Action' => $action,

'SecretId' => '你的secretId',

'Region' => 'gz',

);

/*下面这两个参数为 DescribeInstances 接口的私有参数,用于查询特定的虚拟机列表*/

// $PRIVATE_PARAMS = array(

// 'pullset.0.fileId'=> '14651978969383094681',

// 'width'=>200,

// 'height'=>200

// );

$PRIVATE_PARAMS = $private_params;

/***********************************************************************************/

return $this->CreateRequest($HttpUrl, $HttpMethod, $COMMON_PARAMS, $secretKey, $PRIVATE_PARAMS, $isHttps);

}

具体调用如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$getParams = array('fileId' => $fileId);
$resultArray = $this->videoApi('DescribeVodPlayUrls', $getParams);

这样就通过后台发了一个请求,并把返回结果写在$resultArray里,最后再根据其返回值作自己需要的处理即可。

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

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

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

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

评论
作者已关闭评论
暂无评论
推荐阅读
【Hierarchical RL】隐空间分层强化学习(HRL-LS )算法
隐空间分层强化学习,Hierarchical Reinforcement Learning with Latent Space (HRL-LS) 是一种分层强化学习(Hierarchical Reinforcement Learning, HRL)算法,旨在通过在隐空间(Latent Space)中进行策略优化,来处理高维复杂任务中的长期依赖问题。该算法提出了一种新的框架,能够同时利用分层结构和潜在变量模型,来提高在复杂环境中的学习效率。
不去幼儿园
2024/12/03
1970
【Hierarchical RL】隐空间分层强化学习(HRL-LS )算法
【Hierarchical RL】离线策略修正分层强化学习(HIRO)算法
离线策略修正分层强化学习,Hierarchical Reinforcement Learning with Off-Policy Correction (HIRO) 是一种基于分层强化学习的算法,旨在解决长时间跨度和稀疏奖励问题。HIRO 特别引入了离策略(off-policy)校正机制,允许高层策略利用低层策略的经验,而不会因为低层策略的更新而产生偏差。
不去幼儿园
2024/12/03
3100
【Hierarchical RL】离线策略修正分层强化学习(HIRO)算法
【Hierarchical RL】分层深度Q网络(Hierarchical-DQN)算法
Hierarchical-DQN (Hierarchical Deep Q-Network) 是一种分层强化学习算法,专门设计用于解决复杂的任务,通过将任务分解为层次化的子任务来学习。它结合了深度 Q 网络(DQN)和分层强化学习的思想,将复杂任务分解为多个具有不同时间尺度的子任务。Hierarchical-DQN 的设计思路和 FeUdal Networks 类似,都是通过层次结构来解决长时间跨度的任务,但 Hierarchical-DQN 的具体实现有所不同,尤其在策略的选择和值函数的更新方面。
不去幼儿园
2024/12/03
3530
【Hierarchical RL】分层深度Q网络(Hierarchical-DQN)算法
【RL Latest Tech】分层强化学习:FeUdal Networks算法
FeUdal Networks(FuN)是一种分层强化学习(Hierarchical Reinforcement Learning, HRL)算法,由Google DeepMind团队提出。该算法的灵感来源于层级控制结构,将任务分解为高层目标和低层执行细节,从而提高强化学习在复杂环境中的效率。与传统的强化学习算法不同,FeUdal Networks将学习过程分为不同的层次,每个层次的角色不同,但都为共同完成任务服务。
不去幼儿园
2024/12/03
2780
【RL Latest Tech】分层强化学习:FeUdal Networks算法
【Hierarchical RL】动态分层强化学习(DHRL)算法
动态分层强化学习,Dynamic Hierarchical Reinforcement Learning (DHRL) 是一种自适应分层强化学习算法,其目标是根据任务和环境的复杂性动态地构建、修改和利用分层策略。DHRL 不仅仅是预定义层次结构的简单执行,而是允许代理在学习过程中根据需要动态生成和调整分层策略,从而实现更好的任务分解和高效学习。
不去幼儿园
2024/12/03
2780
【Hierarchical RL】动态分层强化学习(DHRL)算法
【RL Latest Tech】分层强化学习:Option-Critic架构算法
分层强化学习(Hierarchical Reinforcement Learning, HRL)通过将复杂问题分解为更小的子问题,显著提高了强化学习算法在解决高维状态空间和长期目标任务中的效率。Option-Critic架构是分层强化学习中一种非常有影响力的方法,专门用于自动发现和优化子策略(称为“Option”)。它是在经典的Options框架基础上提出的,用来处理分层决策问题,特别是可以在没有明确的子目标定义的情况下自动学习子策略。
不去幼儿园
2024/12/03
4011
【RL Latest Tech】分层强化学习:Option-Critic架构算法
【Hierarchical RL】Options Framework(选项框架)
Options Framework(选项框架)是分层强化学习中的一种经典方法,旨在通过将动作抽象化为**选项(Options)**来简化复杂任务的学习过程。基于 Sutton 等人提出的选项框架(Options Framework),其中选项是从一个子任务执行到完成的高层决策链。高层决策什么时候调用特定选项,低层负责具体执行选项的策略。
不去幼儿园
2024/12/03
2000
【Hierarchical RL】Options Framework(选项框架)
【强化学习】Soft Actor-Critic (SAC) 算法
Soft Actor-Critic(SAC) 是一种最先进的强化学习算法,属于 Actor-Critic 方法的变体。它特别适合处理 连续动作空间,并通过引入最大熵(Maximum Entropy)强化学习的思想,解决了许多传统算法中的稳定性和探索问题。
不去幼儿园
2025/01/08
2.1K0
【强化学习】Soft Actor-Critic (SAC) 算法
【强化学习】演员评论家Actor-Critic算法(万字长文、附代码)
Actor-Critic算法是一种强化学习中的方法,结合了“演员”(Actor)和“评论家”(Critic)两个部分。下面用一个生活中的比喻来说明它的原理:
不去幼儿园
2024/12/26
1.5K0
【强化学习】演员评论家Actor-Critic算法(万字长文、附代码)
【RL Latest Tech】离线强化学习:行为规范Actor Critic (BRAC) 算法
离线强化学习(Offline Reinforcement Learning)旨在从静态数据集中学习策略,而无须与环境进行交互。传统的强化学习方法依赖大量环境交互,这在某些情况下是不切实际或昂贵的。离线强化学习通过利用已有的数据,降低了这些需求。
不去幼儿园
2024/12/03
2340
【RL Latest Tech】离线强化学习:行为规范Actor Critic (BRAC) 算法
【Hierarchical RL】不允许你不了解分层强化学习(总结篇)
下面这张图片展示了两层结构,上层为管理者(高层策略),下层为工人(低层策略)。管理者选择子目标,表现为分支路径,工人执行动作以实现子目标,动作通过箭头指向远处的最终目标。环境表现为网格世界,管理者从上方监控进度。
不去幼儿园
2024/12/03
1.8K0
【Hierarchical RL】不允许你不了解分层强化学习(总结篇)
一文读懂强化学习:RL全面解析与Pytorch实战
强化学习(Reinforcement Learning, RL)是人工智能(AI)和机器学习(ML)领域的一个重要子领域,与监督学习和无监督学习并列。它模仿了生物体通过与环境交互来学习最优行为的过程。与传统的监督学习不同,强化学习没有事先标记好的数据集来训练模型。相反,它依靠智能体(Agent)通过不断尝试、失败、适应和优化来学习如何在给定环境中实现特定目标。
TechLead
2023/10/21
3K0
一文读懂强化学习:RL全面解析与Pytorch实战
【SSL-RL】自监督强化学习:事后经验回放 (HER)算法
📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏: 【强化学习】(41)---《【RL】强化学习入门:从基础到应用》
不去幼儿园
2024/12/03
4081
【SSL-RL】自监督强化学习:事后经验回放 (HER)算法
【RL Latest Tech】分层强化学习(Hierarchical RL)
分层强化学习(Hierarchical Reinforcement Learning,HRL)是一类旨在通过引入多层次结构来提高强化学习算法效率的方法。其核心思想是将复杂的任务分解为若干子任务,通过解决这些子任务来最终完成整体目标。以下是关于分层强化学习的详细介绍:
不去幼儿园
2024/12/03
5230
【RL Latest Tech】分层强化学习(Hierarchical RL)
DDPG强化学习的PyTorch代码实现和逐步讲解
来源:Deephub Imba本文约4300字,建议阅读10分钟本文将使用pytorch对其进行完整的实现和讲解。 深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)是受Deep Q-Network启发的无模型、非策略深度强化算法,是基于使用策略梯度的Actor-Critic,本文将使用pytorch对其进行完整的实现和讲解。 DDPG的关键组成部分是 Replay Buffer Actor-Critic neural network Explorati
数据派THU
2023/04/05
9240
DDPG强化学习的PyTorch代码实现和逐步讲解
【强化学习】深度确定性策略梯度算法(DDPG)详解(附代码)
深度确定性策略梯度(Deep Deterministic Policy Gradient、DDPG)算法是一种基于深度强化学习的算法,适用于解决连续动作空间的问题,比如机器人控制中的连续运动。它结合了确定性策略和深度神经网络,是一种模型无关的强化学习算法,属于Actor-Critic框架,并且同时利用了DQN和PG(Policy Gradient)的优点。
不去幼儿园
2025/01/02
3.9K0
【强化学习】深度确定性策略梯度算法(DDPG)详解(附代码)
【强化学习】近端策略优化算法(PPO)万字详解(附代码)
近端策略优化、PPO(Proximal Policy Optimization)是一种强化学习算法,设计的目的是在复杂任务中既保证性能提升,又让算法更稳定和高效。以下用通俗易懂的方式介绍其核心概念和流程。
不去幼儿园
2025/01/02
12.5K0
【强化学习】近端策略优化算法(PPO)万字详解(附代码)
【强化学习】双延迟深度确定性策略梯度算法(TD3)详解
双延迟深度确定性策略梯度算法,TD3(Twin Delayed Deep Deterministic Policy Gradient)是强化学习中专为解决连续动作空间问题设计的一种算法。TD3算法的提出是在深度确定性策略梯度(DDPG)算法的基础上改进而来,用于解决强化学习训练中存在的一些关键挑战。
不去幼儿园
2025/01/02
2K0
【强化学习】双延迟深度确定性策略梯度算法(TD3)详解
【Hierarchical RL】半马尔可夫决策过程 (SMDP) -->分层强化学习
半马尔可夫决策过程,Semi-Markov Decision Processes (SMDP) 是一种用于分层强化学习的模型,适用于那些包含不规则时间步或长期延迟决策的任务。相比于标准的马尔可夫决策过程(Markov Decision Process, MDP),SMDP 能够处理不同时间间隔之间的决策问题,因此在强化学习中广泛应用于分层结构,尤其是需要长时间跨度或多步策略的复杂任务中。
不去幼儿园
2024/12/03
4690
【Hierarchical RL】半马尔可夫决策过程 (SMDP) -->分层强化学习
Hands on Reinforcement Learning 10 Actor-Critic Algorithm
本书之前的章节讲解了基于值函数的方法(DQN)和基于策略的方法(REINFORCE),其中基于值函数的方法只学习一个价值函数,而基于策略的方法只学习一个策略函数。那么,一个很自然的问题是,有没有什么方法既学习价值函数,又学习策略函数呢?答案就是 Actor-Critic。Actor-Critic 是囊括一系列算法的整体架构,目前很多高效的前沿算法都属于 Actor-Critic 算法,本章接下来将会介绍一种最简单的 Actor-Critic 算法。需要明确的是,Actor-Critic 算法本质上是基于策略的算法,因为这一系列算法的目标都是优化一个带参数的策略,只是会额外学习价值函数,从而帮助策略函数更好地学习。
一只野生彩色铅笔
2023/04/09
6630
Hands on Reinforcement Learning 10 Actor-Critic Algorithm
推荐阅读
相关推荐
【Hierarchical RL】隐空间分层强化学习(HRL-LS )算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档