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)    收藏  举报

导航