用Python实现腾讯云点播VOD

腾讯云点播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元起,更有千元代金券礼包免费领!]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/253566.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云视频点播-记录

1.开通视频点播 开通服务 点击立即开通 找到存储管理 启用存储地址 视频加密要设置转码并将其设置为默认 修改模板-点击编辑 上传视频测试 此时已经有了默认存储地址和默认转码配置域名加速【域名已备案】 输入域名点击提交即可配置DNS 点击眼睛并复制CNAME&#xff0c;前…

使用阿里云视频点播上传视频

目录 前言一、目的二、实现步骤1.准备操作2.主要使用模块2.1. 上传音频2.2. 添加转码设置 3.搭建视频点播环境3.1.配置Maven仓库3.2.添加jar依赖3.3.上传视频3.4.初始化点播服务3.5.根据视频ID获取视频地址3.6.根据视频ID删除阿里云中视频3.7.根据视频ID集合删除 三、问题1.阿里…

什么是视频点播(VOD)?

点击上方“LiveVideoStack”关注我们 翻译 | Alex 技术审校 | 赵军 本文来自OTTVerse&#xff0c;作者为Krishna Rao Vijayanagar。 点播 Easy Tech #012# VOD代表Video on Demand&#xff08;视频点播&#xff09;&#xff0c;这种视频流化和交付技术使人们可以随时随地在任何…

php视频点播系统,PHPvod 视频点播系统 v3.1 for php5.4.x

PHPvod是一款免费开源&#xff0c;基于PHPMysql开发的视频点播系统&#xff0c;系统拥有众多的优秀功能和特性&#xff0c;在社区成员的积极参与下&#xff0c;在易用性、扩展性和性能方面不断优化和改进&#xff0c;使得PHPvod可以在极为繁忙的服务器环境下快速稳定运行&#…

开源的在线视频点播系统,值得分享!

平时做一些商业的项目。大家都知道&#xff0c;github是程序员的天堂&#xff0c;大家要好好利用。 今天给大家推荐的这个开源项目来自于读者的投稿&#xff0c;我感觉非常不错&#xff0c;就在这里推荐给大家&#xff0c;如果你也有好的开源项目&#xff0c;我也可以帮你推荐…

uniapp - 腾讯云点播小程序插件

欢迎关注微信公众号&#xff1a;FSA全栈行动 &#x1f44b; 一、简介 微信小程序播放教育类视频要求具备有相关资质&#xff0c;但这些资质一般公司很难短时间申请下来&#xff08;甚至有的公司压根就申请不了&#xff09;&#xff0c;而【短视频播放器小程序插件】含有《信息…

免费视频直播、点播H5播放器SkeyeWebPlayer适配移动端

免费视频直播、点播H5播放器SkeyeWebPlayer适配排除&#xff0c;移动端&#xff0c;常见移动端Web页面问题及解决方案 SkeyeVSS其独创的ws-rtsp流媒体直播技术&#xff0c;兼容传统安防流媒体的同时&#xff0c;不需要安装浏览器插件&#xff0c;解决互联网接入安防监控延迟高…

JAVA在线教育视频点播学习系统毕业设计 开题报告

本文给出的java毕业设计开题报告&#xff0c;仅供参考&#xff01;&#xff08;具体模板和要求按照自己学校给的要求修改&#xff09; 选题目的和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于java的视频点播系统&#xff0c;系统整体使用了基于浏览的javaMy…

如何搭建视频点播服务

要搭建一套高效、稳定、可靠的视频点播服务&#xff0c;通常考虑视频资源的数量、视频资源的格式、用户量和并发量等方面因素&#xff0c;具体包括&#xff1a; 1)视频资源的数量和格式&#xff0c;以及增量情况&#xff1b; 2)播放终端的适配&#xff1b; 3)播放并发量、访问鉴…

直播和点播的区别

先总述直播和点播的不同点&#xff1a; 一、时效性要求不同 二、内容存在形式不同 三、运作流程不同 四、常见场景 五、技术架构 很多时候&#xff0c;大家对直播和点播的区别还是很模糊&#xff0c;仅仅停留在一种感觉上&#xff0c;如果视频画面是实时的就是直播&#…

服务器点播直播系统,服务器点播直播系统

服务器点播直播系统 内容精选 换一换 当保护组的生产站点发生故障时&#xff0c;将保护组的生产站点切到当前的容灾站点&#xff0c;即另一端AZ&#xff0c;启用当前容灾站点的云硬盘以及云服务器等资源。故障切换完成之后&#xff0c;保护组的当前生产站点变成故障切换发生之前…

电影服务器点播系统,网上电影注册点播系统

内容提要&#xff1a;【编号&#xff1a;001】电影网站&#xff0c;灵活运用了JSP技术和sqlserver数据库开发&#xff0c;实现了在线电影的播放和注册用户免费体验的功能。 功能模块图如下&#xff1a; 权限模块分为&#xff1a; 管理员&#xff1a; (1) 影片管理&#xff1a;管…

使用HTTP协议在k780网站上获取天气-----天气预报

文章目录 项目介绍一、项目任务二、项目流程规划以及代码实现1.总流程2.引入库3.总体流程相关函数 三、功能函数的实现1. TCP函数2. 输入城市信息3. 查询今天天气4. 查询未来一周天气5. 查询历史天气6. 退出 总结 项目介绍 本期主要使用TCP网络编程实现天气预报的功能&#xff…

免费视频直播点播服务器系统,搭建一套完整的网络视频流媒体直播/点播服务系统需要具备哪些条件?...

原标题:搭建一套完整的网络视频流媒体直播/点播服务系统需要具备哪些条件? 随着Internet的飞速发展,网上现场直播已经从实验阶段走向了实用阶段。各式各样的社会活动都可以借助网上现场直播方式传遍全世界,如新闻发布会、体育比赛、商贸展览、企业宣传、远程会议、远程看护…

解决Vmware上的kali找不到virtualbox上的靶机的问题

解决kali找不到靶场ip问题的完整方法 1.配置靶机2.配置kali的虚拟网络3.配置kali中的eth0网络 1.配置靶机 靶机部署在Virtualbox上对其进行网络配置&#xff0c;选择连接方式为仅主机&#xff08;Host-Only&#xff09;网络。 2.配置kali的虚拟网络 在编辑中选择虚拟网络配…

IDEA 安装配置步骤详解

引言 IntelliJ IDEA 是一款功能强大的集成开发环境&#xff0c;它具有许多优势&#xff0c;适用于各种开发过程。本文将介绍 IDEA 的主要优势&#xff0c;并提供详细的安装配置步骤。 介绍 IntelliJ IDEA&#xff08;以下简称 IDEA&#xff09;之所以被广泛使用&#xff0c;…

西门子S7200方案 西门子S7200方案CPu型号LPC2136

西门子S7200方案 西门子S7200方案CPu型号LPC2136 id584474406888&

S7200源码及PCB文件,S7 224XP 226图纸

S7200源码及PCB文件,S7 224XP 226图纸 id651541838037&

西门子S7200下载线驱动

西门子S7200下载线驱动是官方提供的一款USB驱动&#xff0c;本站收集提供高速下载&#xff0c;用于解决USB接口不能正常识别&#xff0c;无法正常使用的问题&#xff0c;本动适用于&#xff1a;Windows XP / Windows 7 / Windows 8 / Windows 10 32/64位操作系统。有需要的朋友…

西门子 S7200 以太网模块连接力控组态方法

ETH-YC模块转以太网&#xff0c;型号有MPI-ETH-YC01和PPI-ETH-YC01&#xff0c;适用于西门子S7-200/S7-300/S7-400、SMART S7-200、西门子数控840D、840DSL、合信、亿维PLC的PPI/MPI/PROFIBUS转以太网。用于西门子S7-200/S7-300/S7-400程序上下载、上位监控、设备联网和数据采集…