django-nginx视频播放笔记
综合网上各路大佬的记录,整理一下基于django控制权限,nginx代理返回视频的思路,这样既能方便的对用户-视频的权限进行校验,又不会因播放视频给django带来过多压力
这里只讲步骤,不讲技术(因为搞不懂)
环境:ubuntu18.04,nginx1.14,django2.2,需要软件:ffmpeg
我的django项目目录(video单词拼错了>o_o<):
django_vedio/
├── app01 //应用目录
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py // 权限控制相关代码写在views视图函数文件中
├── db.sqlite3
├── manage.py
├── templates
│ └── index.html
├── vedio // 视频存放目录,一个视频一个文件夹
│ └── azurlane // 一个视频目录,下面包含video.key,videkey.info,m3u8和ts文件
│ ├── azurlane.mp4
│ ├── index0.ts
│ ├── index10.ts
│ ├── index1.ts
│ ├── index2.ts
│ ├── index3.ts
│ ├── index4.ts
│ ├── index5.ts
│ ├── index6.ts
│ ├── index7.ts
│ ├── index8.ts
│ ├── index9.ts
│ ├── index.m3u8
│ ├── video.key
│ └── videokey.info
└── vedio_test
├── __init__.py
├── settings.py // 配置文件
├── urls.py
└── wsgi.py
一、使用ffmpeg对mp4格式视频分片,既可以加密也可以不加密
1.需要手动创建video.key文件,存放加密密钥以及videokey.info文件
video.key文件:openssl rand 16 > video.key(没有openssl可以自行安装)
生成一个初始向量(iv)字符串:openssl rand -hex 16(需要记录下来)
videokey.info文件内容:
http://{ip地址/域名}:{端口号}/{video.key文件请求路径} (文件第一行内容是video.key文件的网络路径)
video.key (第二行为存放密钥的文件名,即video.key)
iv值 (第三行为上面步骤生成的初始向量字符串)
上述两个文件及视频存放于同一目录下
2.使用ffmpeg生成m3u8列表文件和ts视频分片文件
确保ffmpeg可以正常使用后,在MP4视频所在目录:ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -hls_time 10 -hls_list_size 0 -hls_key_info_file videokey.info -hls_base_url http://test.com/ index.m3u8
部分参数说明:-i指定输入mp4视频名,-hls_time每个ts分片视频时间长度,单位为秒,例如上面命令为10秒,-hls_key_info_file指定videokey.info文件(若不加密可不添加此参数),-hls_base_url指定ts文件的网络请求base_url,最后文件会把base_url和ts名进行拼接,最后是m3u8列表文件名
index.m3u8和ts文件会生成在当前目录,如上述结构图所示
二、配置nginx
nginx在此处用于返回video.key文件和ts文件(当然为了进一步确保安全,video.key也可以使用和请求m3u8一样的方式,通过django来做权限校验)
nginx中的相关配置如下:
location / {
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS, DELETE';
add_header 'Access-Control-Allow-Headers' 'reqid, nid, host, x-real-ip, x-forwarded-ip, event-type, event-id, accept, content-type';
root ***change me***/django_vedio/vedio/; //存放视频文件的本地路径
}
总之要让m3u8列表中的ts请求能通过nginx访问得到
三、编写django视图函数
# 请求m3u8
class M3u8View(APIView):
def get(self, request):
"""在这儿进行相关权限校验"""
file_data = open('index.m3u8文件绝对路径', 'rb') # 需要区分不同视频的m3u8文件,可以通过路由参数来区分
response = HttpResponse(file_data)
response['Content-Type'] = 'application/x-mpegURL' # 设置content-type
return response
四、前端代码
前端会用到video.js库,可以从外部cdn导入
我的代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://vjs.zencdn.net/7.2.3/video-js.css" rel="stylesheet">
<link href="https://cdn.bootcss.com/video.js/6.3.3/video-js.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/video.js/6.3.3/video.min.js"></script>
<script src="https://cdn.bootcss.com/videojs-contrib-hls/5.11.0/videojs-contrib-hls.js"></script>
</head>
<body>
<video id="example-video" width=960 height=540 class="video-js vjs-default-skin" controls>
<source id="video_source" src="index.m3u8网络路径" type="application/x-mpegURL">
<!--<source id="video_source" src="" type="application/x-mpegURL">-->
</video>
<script type="text/javascript">
var player = videojs('example-video');
player.play();
</script>
</body>
</html>
总结:
基本就是上述步骤了,其实如果没有加密需求的话可以直接使用django校验权限,nginx返回视频的方式,就不需要用到ffmpeg了,关于这个可以自行了解X-Accel-Redirect响应头
主要是保证三种文件能被正常访问,m3u8,video.key和ts文件;除此之外,还很有可能遇到跨域问题,这个只能自行解决
后面有错的话再改。。。
posted on 2021-03-17 18:14 hostage-killer 阅读(714) 评论(0) 收藏 举报
浙公网安备 33010602011771号