前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >腾讯云服务视频,腾讯云点播的视频上传和转码功能

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

原创
作者头像
tengxunyun8点com活动整理
修改于 2019-04-30 09:27:07
修改于 2019-04-30 09:27:07
16.5K00
代码可运行
举报
运行总次数: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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
Mysql 多表查询详解
上篇讲到Mysql中关键字执行的顺序,只涉及了一张表;实际应用大部分情况下,查询语句都会涉及到多张表格 :
全栈程序员站长
2022/09/04
2.2K0
Mysql 多表查询详解
MySQL:查询(万字超详细版)
之后,可以通过as关键字来为查询结果中的列指定别名,as和引号可以省略,但如果别名中存在空格就不能省略引号了
2的n次方
2024/10/15
8680
MySQL:查询(万字超详细版)
MySQL基础之多表查询
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
叫我阿杰好了
2022/11/07
6640
MySQL基础之多表查询
【MySQL】多表联合查询、连接查询、子查询「建议收藏」
内连接:[inner] join:从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.
全栈程序员站长
2022/08/02
5.3K0
【MySQL】多表联合查询、连接查询、子查询「建议收藏」
MySQL 多表查询
多表查询是指基于两个和两个以上的表查询.在实际应用中,查询单个表可能不能满足你的需求.
用户9615083
2022/12/25
4.3K0
MySQL 多表查询
【MySQL】:深入解析多表查询(下)
自连接查询,顾名思义,就是自己连接自己,也就是把一张表连接查询多次。我们先来学习一下自连接的查询语法:
屿小夏
2024/04/18
2780
【MySQL】:深入解析多表查询(下)
【MySQL】函数 & 复合查询 & 内外连接
【案例】:基于我们上面 Retrieve 那建的表 exam_result,同样这里只写指令,不写结果
IsLand1314
2025/05/23
1460
【MySQL】函数 & 复合查询 & 内外连接
Mysql基础8-多表查询
    说明2:as dept_name 是给dept.name 起的别名,防止查询结果中出现两个name字段,会有歧义
Se7eN_HOU
2023/07/24
4000
Mysql基础8-多表查询
MySQL 性能优化总结
https://www.cnblogs.com/joeyJss/p/11096597.html
Lenis
2019/12/25
1.1K0
MySQL 性能优化总结
MySQL多表查询
单表查询:select * from table1; 多表查询:select *from table1,table2;
WuShF
2023/09/21
4530
MySQL多表查询
多表查询与7种JOINS的实现
前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联。
timerring
2023/02/16
1.5K0
多表查询与7种JOINS的实现
MySQL常用SQL语句:插入更新删除查询
整理一些MySQL常用SQL语句:插入、更新、删除、查询、根据指定的列对结果集进行排序等。
星哥玩云
2022/08/16
7.1K0
MySQL常用SQL语句:插入更新删除查询
MySQL查询优化
     一个好的web应用,最重要的一点是有着优秀的访问性能。数据库MySQL是web应用的组成部分,也是决定其性能的重要部分。所以提升MySQL的性能至关重要。
那一叶随风
2018/08/22
2.1K0
SQL 多表查询:数据整合与分析的强大工具
在关系型数据库中,数据通常被组织在多个表中。这种表的分离有助于减少冗余并提高数据的管理效率。然而,在实际应用中,往往需要对多个表中的数据进行整合查询,来获得更完整的信息。这时候,多表查询(Join)就显得至关重要。本文将详细介绍 SQL 中常见的多表查询类型,并通过实际示例帮助大家理解如何高效地利用这些查询方法。
平凡之路.
2025/04/24
2940
【MySQL】02_子查询与多表查询
指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。
鸡先生
2022/10/29
2.9K0
【MySQL】02_子查询与多表查询
MySQL4_联合-子查询-视图-事务-索引
文章目录 MySQL_联合-子查询-视图-事务-索引 1.联合查询 关键字:`union` 2.多表查询 多表查询的分类 内连接(inner join ... on ..) 外连接(outer join) 思考: 交叉连接(cross join) 自然连接(natural join) using函数 练习 3.子查询 in | not in some | any | all exists | not exists 子查询分组 4.视图 创建视图 查询 修改视图 查看创建视图的语句 查看视图的结构 查看所有的
以某
2023/03/07
1.1K0
Mysql常用查询语句
一查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!>,!<,=>,=<
Java架构师历程
2018/09/26
5.5K0
MySQL多表联合查询
例 2:查询 tb_course 表中的 id 字段和 tb_students_info 表中的 course_id 字段相等的内容
Alone-林
2022/08/20
10.9K0
手把手教你 SQL 多表查询
本文通过经典的学生-课程模式 S-T 数据库带大家学习 SQL 常用的多表查询 :
wsuo
2020/07/31
1.9K0
手把手教你 SQL 多表查询
【MySQL】多表查询全解-【多表关系/内外自连接/子查询/多表查询案例链接】(可cv代码&案例演示)
YY的秘密代码小屋
2024/04/03
1.9K0
【MySQL】多表查询全解-【多表关系/内外自连接/子查询/多表查询案例链接】(可cv代码&案例演示)
相关推荐
Mysql 多表查询详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档