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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
Linux文件操作高频使用命令
​ less命令:和more命令类似,但是比more命令更强大。在很多时候,必须使用less,比如管道。例如:
全栈程序员站长
2022/08/14
5340
10分钟就能学会,Linux操作系统21个shell常用命令
全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪 念他,就用他的名字命名了。sh 是 UNIX 上的标准 shell,很UNIX 版本都配有 sh。sh 是第一个流行的 Shell
全栈程序员站长
2022/11/02
2.6K0
Linux 常用命令
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。
王小明_HIT
2019/08/13
6550
Linux常用命令总结
$find /etc -size +163840 -a -size -204800
Kevin_Zhang
2018/09/20
8550
Linux常用命令总结
Linux 命令总结
启动终端: ctr+alt+t 终端字体放大: ctr+shift+'+',终端字体缩小: ctr+'-' ls: 查看当前目录下的文件信息 pwd: 查看目录所在的路径 touch: 创建文件 mkdir: 创建文件夹 rmdir: 删除文件夹,提示:只能是空文件夹 rm: 默认删除的是文件,如果删除文件夹需要加上-r选项,-r:以递归的方式把文件夹下的所有文件信息删除掉 cd:切换目录 9.1 cd 目录名 : 切换到指定目录 9.2 cd .: 切换到当前目录 9.3 cd ..: 切换到上一级目录
小闫同学啊
2019/07/18
1.1K0
linux常用命令汇总
1. 快速启动终端:ctr+alt+t 2. 终端字体放大: ctr+shift+'+' 3. 终端字体缩小: ctr+'-' 4. ls: 查看当前目录下文件信息 4.1 ls BD ABC 同时查看两个目录 5. pwd: 查看目录的路径 6. touch: 创建文件 6.1 touch 1.txt 2.txt 同时创建两个文件 7. mkdir: 创建文件夹 8. rmdir: 删除空文件夹 9. rm: 默认删除的是文件,删除文件夹可以使用-r选项,-r: 以递归的方式把文件夹里面的所有文件全部
汪凡
2018/05/29
7920
【linux学习指南】Linux命令行工具大全(三):文件解压缩管理、数据处理一网打尽
该文章j将介绍Linux中的常用系统工具和命令,如用于分页显示文本的more和less、显示时间的date、管理日历的cal、文件搜索的find和grep、以及压缩/解压缩的zip/unzip和tar。文中详细解释了每个命令的语法、功能和常用选项,并提供了示例。
学习起来吧
2024/09/05
1220
【linux学习指南】Linux命令行工具大全(三):文件解压缩管理、数据处理一网打尽
【Linux终端探险】:从入门到熟练,玩转基础命令的秘密(二)
find 命令用于在指定目录下查找文件和目录。它提供了强大的搜索功能,可以根据不同的条件进行文件搜索和匹配。它可以在指定的起点目录及其子目录中递归搜索,根据文件名、大小、修改时间、权限等多种属性进行筛选。
爱喝兽奶的熊孩子
2024/06/04
1530
【Linux终端探险】:从入门到熟练,玩转基础命令的秘密(二)
Linux之常用命令
英文:manual 命令路径:/usr/bin/man 执行权限:所有用户 作用:获取命令或配置文件的帮助信息
全栈程序员站长
2022/09/01
6360
Shell 文件相关操作
tar 命令其实并不是真的解压缩的处理者,而是使用了 gzip 或者 bzip2 等其它命令来达成,但是 gzip 等命令通常只能处理单个文件,并不方便,所以一般我们都是选择使用 tar 命令间接的完成解压缩。
郭顺发
2023/07/06
2400
LINUX常用100条命令总结【一】
"~" 也表示为 home 目录 的意思,"." 则是表示目前所在的目录,".." 则表示目前目录位置的上一层目录。
好派笔记
2021/09/13
1.8K0
Linux命令复习和练习
============================================================================= Linux命令复习和练习: ----------------------------------------------------------------------------- linux命令格式: command [-options] [parameter1] [parameter2] ... 命令 选项 参数 例如: ls
黑泽君
2018/10/12
1.7K0
linux系统的命令大全
一提到Linux命令,大家会想到最常用的cd、ls、rm、vi、tar等命令。那么大家知道这些命令是哪些英文单词的缩写吗?其实每个命令,背后都有它的含义。今天威哥就跟大家聊聊命令背后的小秘密~
江一铭
2022/11/02
2K0
linux系统的命令大全
最实用的Linux命令总结
本文介绍了Linux系统上RPM包管理工具的基本使用方法,包括安装、查询、升级、卸载、校验等操作。同时,还介绍了Yum包管理工具的使用,包括安装、查询、升级、卸载、校验等操作。
企鹅号小编
2018/01/04
2.3K0
linux常用命令整理(详细)
说明:   1)个别命令使用不遵循此格式   2)当有多个选项时,可以写在一起   3)简化选项与完整选项     -a 等于 –all
嵌入式与Linux那些事
2021/05/20
8120
linux常用命令整理(详细)
CentOS最常用命令整理
作为一个使用 CentOS 作为服务器操作系统的博客站长,一定要熟悉了解 CentOS 下的常用命令,这可以有效的提升服务器运维的效率。
Xcnte
2021/12/14
7530
Linux-常用命令
这些是我在近一年半的学习和服务器维护中常用的命令汇总,包括管理员常用命令和工作常用命令。
孔西皮
2023/10/18
2880
Linux-常用命令
Linux达人必备:一文掌握全网最全文件操作命令!120+命令
程序熵
2024/03/18
3030
Linux达人必备:一文掌握全网最全文件操作命令!120+命令
【Linux】CentOS7 常用命令集合
       这两天一直在对CentOS 7.2进行初体验,各种学习命令肿么用,不过其实大多和DOS是一样的,只是命令的表达上可能有点儿不一样,毕竟这些都不是一家出来的嘛~
一朵灼灼华
2022/08/05
1K0
Linux基础命令
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
奋飛
2019/08/15
1.1K0
相关推荐
Linux文件操作高频使用命令
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档