腾讯云点播VOD主要用于视频资源的上传和在线播放,腾讯云官方文档也有许多相关操作的介绍,但是关于Python的文档相对较少,这里我想分享一下在Python方面自己对腾讯云VOD的研究(记得看注释)。

必备知识基础:
JavaScript,Python,Django

1、上传视频到腾讯云

1.1开通腾讯云点播VOD
地址:https://console.cloud.tencent.com/vod/overview

1.2引入js
官方文档地址:https://cloud.tencent.com/document/product/266/9239
前端引入axios.js(用于向后台发送请求,如果使用ajax请求则忽略),引入vod-js-sdk-v6(用于上传视频至腾讯云)

<script src="//cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.js"></script>
<script src="//unpkg.com/vod-js-sdk-v6"></script>

1.3生成签名并上传视频
官方文档地址:https://cloud.tencent.com/document/product/266/9219(刚刚看了一下,今天才有Python生成签名的教程,白忙了)

前端js

const tcVod = new TcVod.default({//生成签名才能上传视频getSignature: getSignature // 前文中所述的获取上传签名的函数,这里必须是函数体,不能调用函数,即getSignature()});
        const uploader = tcVod.upload({mediaFile: video_file, // 媒体文件(视频或音频或图片),类型为 File});
        // 视频上传完成时uploader.on('media_upload', function(info) {// uploaderInfo.isVideoUploadSuccess = true;console.log(info);});// 视频上传进度uploader.on('media_progress', function(info) {// uploaderInfo.progress = info.percent;});// 封面上传完成时uploader.on('cover_upload', function(info) {// uploaderInfo.isCoverUploadSuccess = true;console.log(info);});// 封面上传进度uploader.on('cover_progress', function(info) {// uploaderInfo.coverProgress = info.percent;console.log(info)});//视频上传结束,返回视频详情uploader.done().then(function (doneResult) {// deal with doneResultconsole.log(doneResult);}).catch(function (err) {// deal with errorconsole.log(err);})
    // 生成签名function getSignature() {return axios.post('/CreateSignature这里是你后台生成签名的url/',JSON.stringify({"Action": "GetUgcUploadSign",})).then(function (response) {// console.log(response);response是后台返回的数据return response.data.data.signature;//后台返回的签名})}

后端
官方文档:https://cloud.tencent.com/document/product/266/9221
views.py python生成签名(官方刚刚已经更新了Python签名的文档,建议使用官方文档,当然,这个方法是可行的)

#生成签名
class CreateSignatureView(View):def post(self,request):try:#currentTimeStamp:当前时间戳,expireTime:签名有效期时间戳,random:无符号32位随机数,procedure:任务流模板名(记得先开启你的任务流,在VOD首页可以找到)Original = 'secretId={}&currentTimeStamp={}&expireTime={}&random={}&procedure={}'.format(mykey.secretId, int(time.time()),int(time.time()) + 10000,random.randint(1000, 9999999),'xxx')#通过hmac加密和base64编码生成签名,需要填你的secretKeySignatureTmp = str(base64.b64encode(hmac.new(mykey.secretKey.encode('utf-8'), Original.encode('utf-8'), sha1).digest() + Original.encode('utf-8')), 'utf-8')except Exception as e:logger.error(e)return to_json_data(errno=Code.UNKOWNERR,errmsg=error_map[Code.UNKOWNERR])return to_json_data(errno=Code.OK,data={"signature":SignatureTmp})#to_json_data是自己用JsonResponse封装的类,这里直接使用JsonResponse即可,返回前端signature

生成后的签名可以在 https://video.qcloud.com/signature/ugcdecode.html?_ga=1.186305964.442939846.1570722999 校验

上面生成签名的算法通过对比签名生成工具(https://video.qcloud.com/signature/ugcgenerate.html?_ga=1.147964338.442939846.1570722999)生成的字符和自己用base64生成的字符即可知

urls.py
如果你开启csrf,请使用csrf_exempt取消单个类的csrf,让前端POST请求通过,或者在前端带上csrf(不做介绍,请参考:http://www.liujiangblog.com/course/django/179)

from django.views.decorators.csrf import csrf_exempt
path('CreateSignature/',csrf_exempt(views.CreateSignatureView.as_view()),name='CreateSignature'),

到这里就已经完成了视频上传,剩下的前端获取视频等基础操作不做介绍

2、获取上传后视频的详情

视频刚上传时,只能获取到视频原始的地址,但是我们需要更多的参数,比如:图片封面(如果你没有上传封面),图片gif,时长等等,这就需要我们通过获取视频的回调来得到这些数据

2.1开启回调
地址:https://console.cloud.tencent.com/vod/callback
在腾讯云点播VOD首页的回调设置开通回调,这里我使用可靠回调,勾上需要的回调,比如我需要截图,就勾上 视频按时间点截图完成回调

2.2设置任务流
地址:https://cloud.tencent.com/document/product/266/33819

2.3获取Python生成taskid和查询任务详情的代码
TaskId生成地址:https://console.cloud.tencent.com/api/explorer?Product=vod&Version=2018-07-17&Action=ProcessMedia&SignVersion= (选填参数参考:https://cloud.tencent.com/document/api/266/31773#AnimatedGraphicTaskInput)

任务(视频)详情生成地址:https://console.cloud.tencent.com/api/explorer?Product=vod&Version=2018-07-17&Action=DescribeTaskDetail&SignVersion= (TaskId填生成地址生成的TaskId)(参数和返回数据参考:https://cloud.tencent.com/document/product/266/33431)

2.4获取任务详情(视频处理后的数据)
前端js

let $video_id;
//获取文件iduploader.done().then(function (doneResult) {// deal with doneResultconsole.log(doneResult);// $video_url.val(doneResult.video.url);$video_id = doneResult.fileId;//获取文件id// console.log($video_id)getVideoResponse({'video_title':video_title});}).catch(function (err) {// deal with errorconsole.log(err);})
//获取回调function getVideoResponse() {console.log($video_id);console.log(extra_data['video_title']);return axios.post('/GetVideoResponse这里是后台处理回调的url/',JSON.stringify({"fileId": $video_id,//必传参数,fileId为视频上传后返回的文件id})).then(function (response) {console.log(response);//获取图片和gif,数据来自后台$return_image_url = response.data.data.result.ProcedureTask.MediaProcessResultSet[1].CoverBySnapshotTask.Output.CoverUrl;$return_image_gif_url = response.data.data.result.ProcedureTask.MediaProcessResultSet[0].AnimatedGraphicTask.Output.Url;// console.log($return_image_url);//获取时长,数据来自后台let duration = response.data.data.result.ProcedureTask.MetaData.Duration;return response.data.data.result;})}

后端
views.py

#视频回调
class GetVideoResponseView(View):def post(self,request):#获取前端传的数据json_data = request.bodyif not json_data:return to_json_data(errno=Code.UNKOWNERR,errmsg=error_map[Code.UNKOWNERR])#自己用JsonResponse写的to_json_data,无需关心,直接使用JsonResponse返回即可try:#转为字典dict_data = json.loads(json_data.decode('utf-8'))except Exception as e:logger.error(e)return to_json_data(errno=Code.UNKOWNERR,errmsg=error_map[Code.UNKOWNERR])#获取fileIdtry:fileId = dict_data['fileId']except Exception as e:logger.error('fileId错误:{}'.format(e))return to_json_data(errno=Code.UNKOWNERR,errmsg=error_map[Code.UNKOWNERR])try:task_id = getVideoTaskId(fileId) #生成TaskIdresult = json.loads(getVideoResponse(task_id)) #回调视频详情数据except Exception as e:logger.error(e)return to_json_data(errno=Code.UNKOWNERR,errmsg=error_map[Code.UNKOWNERR])return to_json_data(errno=Code.OK,data={'result':result})

getVideoTaskId生成TaskId

from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.vod.v20180717 import vod_client, models
from utils.tenxunyun import mykey#生成TaskId
def getVideoTaskId(FileId):try:cred = credential.Credential(mykey.secretId, mykey.secretKey)httpProfile = HttpProfile()httpProfile.endpoint = "vod.tencentcloudapi.com"clientProfile = ClientProfile()clientProfile.httpProfile = httpProfileclient = vod_client.VodClient(cred, "", clientProfile)req = models.ProcessMediaRequest()params = '{"FileId":"%s","MediaProcessTask":{"AnimatedGraphicTaskSet":[{"Definition":20000,"StartTimeOffset":0,"EndTimeOffset":0}],"CoverBySnapshotTaskSet":[{"Definition":10,"PositionType":"Time","PositionValue":0}]}}'%FileIdreq.from_json_string(params)resp = client.ProcessMedia(req)print(resp.to_json_string())# print(resp.TaskId)# print(type(resp.TaskId))return resp.TaskIdexcept TencentCloudSDKException as err:print(err)return Noneif __name__ == '__main__':FileId = '52**8907****9726**7'#视频上传后返回的idgetVideoTaskId(FileId)

getVideoResponse回调数据

import time
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.vod.v20180717 import vod_client, models
from utils.tenxunyun import mykey
import jsondef getVideoResponse(TaskId):try:cred = credential.Credential(mykey.secretId, mykey.secretKey)#你的secretId、secretKeyhttpProfile = HttpProfile()httpProfile.endpoint = "vod.tencentcloudapi.com"clientProfile = ClientProfile()clientProfile.httpProfile = httpProfileclient = vod_client.VodClient(cred, "", clientProfile)req = models.DescribeTaskDetailRequest()params = '{"TaskId":"%s"}'%TaskIdreq.from_json_string(params)resp = client.DescribeTaskDetail(req)# print(resp.to_json_string())# print(resp.Status)#为了避免腾讯云未处理完而获取数据不全的情况,需要多次请求以获取全部数据,这里不使用递归,占内存而且多次返回,难以获取最底层的值while resp.Status != "FINISH":req.from_json_string(params)resp = client.DescribeTaskDetail(req)return resp.to_json_string()except TencentCloudSDKException as err:print(err)return Noneif __name__ == '__main__':from utils.tenxunyun.getTaskId import getVideoTaskIdFileId = '52**8907****9726**7'task_id = getVideoTaskId(FileId)print(task_id)result = getVideoResponse(task_id)print('*'*100)print(result)

urls.py
和上面相同,需要取消单个类的csrf

path('GetVideoResponse/',csrf_exempt(views.GetVideoResponseView.as_view()),name='GetVideoResponse'),

到这里,就可以拿到视频回调的详情数据了

如果上面的步骤有不懂的地方,可加Q群聊,812653899


[助力产业智慧升级,云服务器首年88元起,更有千元代金券礼包免费领!]

用Python实现腾讯云点播VOD相关推荐

  1. getvod.php_php腾讯云点播视频加密

    php腾讯云点播视频加密,ProcessFile(案例为laravel) 路由: //视频详情 Route::get('video/info/{id}','Api\ProcessFileControl ...

  2. web利用腾讯云点播上传视频

    web利用腾讯云点播上传视频到云服务器 第一步导入 <script src="//imgcache.qq.com/open/qcloud/js/vod/sdk/ugcUploader. ...

  3. 58-硅谷课堂4-腾讯云点播管理模块

    58-硅谷课堂4-腾讯云点播管理模块-- 笔记 笔记内容来源与尚硅谷教学视频 文章目录 58-硅谷课堂4-腾讯云点播管理模块-- 笔记 笔记中涉及资源: 一.后台管理系统-点播管理模块 ①:点播管理 ...

  4. day09-硅谷课堂-腾讯云点播管理模块(三)

    硅谷课堂第九天-点播管理模块(三) 文章目录 硅谷课堂第九天-点播管理模块(三) 一.点播管理模块-课程统计 1.课程统计需求 2.课程统计接口 2.1.创建相关代码 videoVisitor表: 2 ...

  5. 【硅谷课堂】腾讯云点播WEB上传方式代码(第二种方式)

    下载依赖 npm i vod-js-sdk-v6 前端 /vod/course/Video/Form.vue <template><!-- 添加和修改课时表单 --><e ...

  6. 腾讯云点播简介和使用流程

    目录 一,腾讯云点播简介 二,准备工作 1,点击:申请腾讯云账号 2,实名 3,购买点播存储包和流量包 三,使用腾讯云自带点播控制台管理点播视频 1,创建应用 2,使用控制台可对视频进行上传,删除,转 ...

  7. 直播课堂系统11--腾讯云点播管理模块(三)

    目录 点播管理模块-课程统计 需求 编写mapper 编写Service controller Echarts组建 前端 效果展示 整合腾讯云点播 点播管理模块-课程统计 需求 编写mapper 课程 ...

  8. 腾讯云点播视频存储(Web端视频上传)

    官方文档 前言 所谓视频上传,是指开发者或其用户将视频文件上传到点播的视频存储中,以便进行视频处理.分发等. 一.简介 腾讯云点播支持如下几种视频上传方式: 控制台上传:在点播控制台上进行操作,将本地 ...

  9. python刷新腾讯云cdn

    程序需要使用python3,使用前需获取腾讯云SecretID和SecretKey. # -*- coding:utf-8 -*- __author__ = 'wx' import hashlib i ...

最新文章

  1. centos 6.4 更新163源
  2. CF1B Spreadsheets
  3. permission denied for window type 2003
  4. python libusb多线程_一些有助于理解libusb1.0和ctypes的异步USB操作
  5. dos下实现延迟功能
  6. javascript等待异步线程完成_作为前端你了解JavaScript运行机制吗?
  7. MySQL笔记-简单配置主从库
  8. Android 系统性能优化(25)---Dalvik 与ART
  9. 极简代码(一)—— 精确率和错误率的计算
  10. 当前读和快照读的区别
  11. add git 指定类型文件夹_git add 命令
  12. 小白学 Python 数据分析(4):Pandas——数据导入
  13. ICC2里面多进程任务
  14. MacBook Pro无法开机的解法办法
  15. 卫星位置计算的c语言,C语言-详细计算GPS卫星位置.doc
  16. x200装linux驱动下载,ubuntu 安装X200声卡驱动
  17. Truffle在ganache-cli部署合约
  18. COM/DCOM开发之远程进程外组件(DCOM)
  19. slam学习笔记七----IMU传感器
  20. java调用js匿名函数参数,js中匿名函数和回调函数

热门文章

  1. linux 压缩保持属性不变,linux文件压缩
  2. mysql 的数据类型
  3. AES密钥编排Python实现
  4. warframe怒焚者结合目标_warframe哪些地图有结合目标 | 手游网游页游攻略大全
  5. Navicat导出整个数据库(可以直接迁移,不会因为外键关系而导致导入不了)
  6. Keras教程:使用Keras开始深度学习和Python(上)
  7. 算法09——patA1033 加油站问题(贪心)
  8. 『征文精选』技术翻译与术语管理技术:专业人说专业话
  9. 计算机word如何提交,如何在word添加视频?
  10. 题目:滑动解锁 蓝桥杯