Python实现七牛云视频播放
这篇文章是使用Python的Web框架Django Rest Framework来提供视频相关的api接口,主要功能包括视频上传、视频转码、视频访问授权、删除视频文件、视频截图功能。
七牛云上的基本概念:
公开空间:可通过文件对象的 URL 直接访问。如果要使用七牛云存储的镜像存储功能,请设置空间的属性为公有。
私有空间:文件对象的访问则必须获得拥有者的授权才能访问。
资源:资源是七牛云存储服务中的逻辑存储单元。
AccessKey: 用于标识用户,用户将 AccessKey 放入访问请求,以便七牛云存储识别访问者的身份。
SecretKey: 是用于加密签名字符串和服务器端验证签名字符串的密钥。
如果将视频放在公开空间里,那么用户可以直接根据url下载视频,是不安全的,如果是付费视频,则必须放在私有空间里,这篇文章也是私有资源的处理。
首先需要有七牛云账号、创建空间,具体操作可参考:七牛云对象存储快速入门
接下来就是写代码。
1、七牛Python SDK安装:
pip install qiniu
或
easy_install qiniu
2、初始化:
在使用SDK 前,您需要一对有效的 AccessKey 和 SecretKey 签名授权。
可以通过如下步骤获得:
- 开通七牛开发者帐号
- 登录七牛开发者平台,查看 Access Key 和 Secret Key。
获取Access Key 和 Secret Key 后,调用如下两行代码进行初始化对接:
from qiniu import Auth
q = Auth(access_key, secret_key)
3、api编写,代码是契合本人所做的项目的,您不能够直接使用、api是大致相同的:
from qiniu import Auth, PersistentFop, urlsafe_base64_encode, BucketManager, build_batch_delete
from django.conf import settings
from rest_framework.decorators import list_route, detail_route
from tokenauth.decorators import is_login, admin_login from course.models import Chapter
from course.serializers import ChapterSerializer
from course.errors import INVALID_USER, INVALID_PARAMS, VIDEO_NOT_EXIST, OPERATION_NOT_ALLOWED, \
COURSE_ALREADY_ONLINE, COURSE_ALREADY_OFFLINE, CHAPTER_NOT_EXIST
from course.exception_handler import CustomError access_key = '你自己账号的access_key'
secret_key = '你自己账号的secret_key'
domain = '七牛云对象存储内容管理生成的外链默认域名'
bucket_name = '要上传的空间名称'
# 视频转码会用到私有队列,在七牛云资源主页多媒体处理点击立即添加
pipeline = '私有队列名称' class ChapterViewSet(ModelViewSet):
"""
章节 ViewSet
"""
queryset = Chapter.objects.all().order_by('created_time')
serializer_class = ChapterSerializer @list_route(methods=['get'])
@admin_login
def get_uptoken(self, request):
"""
获取上传token,有效期一个小时,前台拿到uptoken就可以上传视频文件
:param request:
:return:
"""
q = Auth(access_key, secret_key)
token = q.upload_token(bucket_name)
return Response({'uptoken': token}) @list_route(methods=['post'])
@admin_login
def transcode(self, request):
"""
七牛云视频转码切片m3u8,返回转码后的key。将视频流切割成可由HTTP下载的一个个小的音视频流,并生成一个M3U8播放列表,客户端只需要获取资源的M3U8播放列表即可播放音视频。
并且返回该视频的元信息url,前台可通过此url获取视频的时长等信息
:param request:
:param key:
:return:
"""
key = request.data.get('key', None)
if key is None:
raise CustomError(INVALID_PARAMS)
q = Auth(access_key, secret_key)
fops = 'avthumb/m3u8'
hls_name = 'hls' + UUIDTools.uuid1_hex() saveas_key = urlsafe_base64_encode(bucket_name + ':' + hls_name)
fops = fops + '|saveas/' + saveas_key
# 视频转码完成回调函数
notify_url = settings.QINIU_CALLBACK_URL + 'api/v1.0/course/chapters/complete_transcode/'
pfop = PersistentFop(q, bucket_name, pipeline, notify_url)
ops = []
ops.append(fops)
ret, info = pfop.execute(key, ops, 1)
if ret is None:
raise CustomError(VIDEO_NOT_EXIST) # 获取视频元信息链接
base_url = 'http://%s/%s?avinfo' % (domain, key)
avinfo_url = q.private_download_url(base_url) return Response({'success': True, 'hls_name': hls_name, 'avinfo_url': avinfo_url}) @list_route(methods=['post'])
def complete_transcode(self, request):
"""
七牛云视频转码完成回调
"""
origin_key = request.data.get('inputKey', None)
code = request.data.get('code', -1)
if code == 0:
TranscodeRecode.objects.create(created_by=0, updated_by=0, key=origin_key)
chapter = Chapter.objects.filter(origin_key=origin_key).values().first()
if chapter is not None:
Chapter.objects.filter(pk=chapter.get('id')).update(is_transcoded=True) return Response({'success': True}) @list_route(methods=['get'])
def ts_private_url(self, request):
"""
视频播放授权,将m3u8文件中的ts资源的url批量改写成私有url,以临时获取访问权限,有效期一个小时。
:param request:
:param key: m3u8文件的key
:return:
"""
key = request.GET.get('key', None)
if not key:
raise CustomError(INVALID_PARAMS)
q = Auth(access_key, secret_key)
base_url = 'https://%s/%s?pm3u8/0/expires/315360000' % (domain, key)
private_url = q.private_download_url(base_url, expires=3600)
return Response({'private_url': private_url}) @list_route(methods=['post'])
@admin_login
def delete_videos(self, request):
"""
删除七牛云上的视频文件
:param request:
:param keys: 逗号隔开的key
:return:
"""
keys = request.data.get('keys', None)
if not keys:
raise CustomError(INVALID_PARAMS)
keys = keys.split(',')
q = Auth(access_key, secret_key)
bucket = BucketManager(q)
ops = build_batch_delete(bucket_name, keys)
ret, info = bucket.batch(ops)
qiniu_response = info.text_body.replace('"', '\'') return Response({'success': True, 'qiniu_response': qiniu_response}) @list_route(methods=['post'])
@admin_login
def screenshot(self, request):
"""
七牛云视频截图
:param request:
:param key:
:param offset:
:return:
"""
key = request.data.get('key', None)
offset = int(request.data.get('offset', -1))
if key is None or offset < 0:
raise CustomError(INVALID_PARAMS) q = Auth(access_key, secret_key)
fops = 'vframe/jpg/offset/%d/w/480/h/360' % offset
jpg_name = 'jpg' + UUIDTools.uuid1_hex() saveas_key = urlsafe_base64_encode(bucket_name + ':' + jpg_name)
fops = fops + '|saveas/' + saveas_key pfop = PersistentFop(q, bucket_name, pipeline)
ops = []
ops.append(fops)
ret, info = pfop.execute(key, ops, 1)
if ret is None:
raise CustomError(VIDEO_NOT_EXIST)
base_url = 'https://%s/%s' % (domain, jpg_name)
# 可以设置token过期时间
jpg_url = q.private_download_url(base_url, expires=315360000)
print(jpg_url) return Response({'success': True, "jpg_url": jpg_url})
生成的api如下:
前端调用步骤:
- 调用get_uptoken,获取上传授权token,拿到token后使用js根据七牛云上传接口上传视频;
- 上传成功后调用transcode切片成m3u8,返回m3u8文件资源名称和视频时长等信息;
- 用户点击播放时,调用ts_private_url获取访问权限(参数是步骤2返回的m3u8资源名称);
- 若需要视频截图(如封面图),可以调用screenshot接口;若需要删除存储在七牛云上的视频,可以调用delete_videos接口。
4、上线之后可以使用七牛云的融合 CDN,加速视频的加载。
相关参考:
Python实现七牛云视频播放的更多相关文章
- Python在七牛云平台的应用(三)简单的人脸识别
前言 这是最后一篇介绍python在七牛云平台的应用了,因为-前两篇文章第一篇分享了怎么安装七牛的官方库以及怎么对自己的空间进行下载上传,删除等行动.而第二篇则分享了怎么利用七牛的API接口,由于七牛 ...
- Python在七牛云平台的应用(二)图片瘦身
(一)七牛云平台的图片瘦身功能简介:(引用自官网) 针对jpeg.png格式图片 瘦身后分辨率不变,格式不变. 肉眼画质不变. 图片体积大幅减少,节省 CDN 流量 官网给的图片压缩率很高,官网给的「 ...
- python+ueditor+七牛云存储整合
开发环境:python pyramid. 參考网址:http://developer.qiniu.com/docs/v6/sdk/python-sdk.html,http://my.oschina.n ...
- Python在七牛云平台的应用(一)
七牛云:(引用百度的介绍)七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化PaaS服务.围绕富媒体场景,七牛先后推出了对象存储,融合CDN加速,数据通用处理,内容反垃圾服务,以及直 ...
- 七牛云存储Python SDK使用教程 - 上传策略详解
文 七牛云存储Python SDK使用教程 - 上传策略详解 七牛云存储 python-sdk 七牛云存储教程 jemygraw 2015年01月04日发布 推荐 1 推荐 收藏 2 收藏,2.7k ...
- 使用七牛云存储----大家自己的图床[python]
##写博客什么的总得贴图吧,图床选来选去还是七牛吧.嗯,就是你了 [OSchaina 源码] 结合FastStone Capture 简直爽歪歪. FastStone Capture 自动保存图片到文 ...
- [python] 溜了,溜了,七牛云图片资源批量下载 && 自建图床服务器
故事背景: 七牛云最近一波测试域名操作真是把我坑死了!这简直和百度赠送你2T网盘,之后再限速一样骚操作.于是,痛定思痛自己买个云主机.自己搭图床应用! 1.七牛图片批量下载到本地 1.1 曲折尝试 当 ...
- python 读取mysql存储的文件路径下载文件,内容解析,上传七牛云,内容入es
#!/usr/bin/env python # -*- coding: utf-8 -*- import ConfigParser import json import os import re fr ...
- 七牛云的 python sdk 是如何 批量删除资源的
今天做项目的时候用到七牛云,关于对资源的操作是在后端做的,用的SDK,但是,在网上没找到详细的解析,官方文档也没有太详细的解说,所以无奈只好看下源码 这里做一下简单的记录 from qiniu imp ...
随机推荐
- service fabric docker 安装
1. 镜像拉取 docker pull microsoft/service-fabric-onebox 2. 配置docker(daemon.json) { "ipv6": tru ...
- VMware harbor && minio 搭建企业docker私有镜像以及需要注意的问题
1. docker harbor 配置 建议使用在线安装的模式(离线包太大了) 首先需要安装docker-compose .docker .mino (具体安装可以参考官网后者我的博 ...
- Ubuntu 破解密码及用户管理
Ubuntu 破解密码及用户管理 ubuntu 16.04 破解密码 useradd 实现以下要求 1.ubuntu16.04破解密码 2.创建下面的用户.组和组成员关系 名字为xipudata 的组 ...
- guaua学习,工具专题
Preconditions 1,http://www.cnblogs.com/peida/p/Guava_Preconditions.html 1 .checkArgument(boolean) : ...
- ubuntu12.04LTS安装以及卸载 QT4.8.6和QT creator2.5.2
鉴于,下载QT5.5安装,编译总是有问题,可能是配置不正确. 于是按照论坛的一些资料,就换回QT4版本,具体实施步骤如下: 在qt官网http://download.qt.io/archive/ 下的 ...
- POJ2564:Edit Step Ladders
浅谈\(Trie\):https://www.cnblogs.com/AKMer/p/10444829.html 题目传送门:http://poj.org/problem?id=2564 记\(f[i ...
- Sql Server 2012 存储过程的调试
[一]Sql Server 关于存储过程调试SQL2000是在查询分析器中的对象浏览器中选中需要调试的存储过程,右键----调试---输入参数开始调试.sqlserver2008中则完全不同,变成了必 ...
- WCF引用方式之IIS方式寄宿服务
通过IIS方式寄宿服务 之前的例子是将控制台作为WCF的寄宿方式或者是直接添加契约项目的引用,然后通过配置或者是ChannelFactory的形式进行创建服务对象,其实在大多的开发中以IIS的形式创建 ...
- Android Activity活动状态及生存周期
1.活动状态 每个活动在其生命周期中最多可能会有4中状态. (1)运行状态 当一个活动位于返回栈的栈顶时,此时活动就处于运行状态.系统不会回收处于运行状态的活动. (2)暂停状态 当一个活动不再处于栈 ...
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料汇总 (上)
转载:http://dataunion.org/8463.html?utm_source=tuicool&utm_medium=referral <Brief History of Ma ...