视频播放因视频过大产生卡顿

Posted IVever_KB

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了视频播放因视频过大产生卡顿相关的知识,希望对你有一定的参考价值。

本文章旨在记录解决网页播放较大视频文件这一问题中积累到的知识点。

一、前后端技术都不变的基础上,如何提升视频播放速度

后端上传视频文件走的直接是普通文件上传,提供的文件接口也是media。
前端仅使用了<video src="">,src中的链接即后端提供的url。

这时候会发生,播放视频很卡的现象,当视频大于100M会出现基本每秒的播放都要卡顿。

使用nginx的静态文件代理,url含media直接让它到nginx的指定路径下找文件,nginx的该文件夹和django的media文件夹是共享的。这么处理速度上来很多,但还是有点卡(跟老网站的直接读静态文件相比)
docker-compose.yml

version: "3"

services:
  db:
    image: postgres
    expose:
      - "5432"
    environment:
      POSTGRES_PASSWORD: '***'
      POSTGRES_USER: 'postgres'
      POSTGRES_DB: '***'
      PGDATA: '/var/lib/postgresql/data/pgdata'
    volumes:
        - ./postgres/data:/var/lib/postgresql/data/pgdata
    restart: always

  web:
    build: ./web
    expose:
      - "8000"
    volumes:
      - ./web/media:/home/**/media
      - ./web/cntechsite:/home/**/cntechsite
      - ./uwsgi:/tmp # 挂载uwsgi日志
    depends_on:
      - db
    # environment:
    #   - DEBUG=False
    tty: true #同docker run指令参数,表示分配tty设备,该可以支持终端登录
    stdin_open: true

  nginx:
    build: ./nginx
    restart: always
    ports:
      - "**:80"
    expose:
      - "80"
    volumes:
      - ./web/media:/usr/share/nginx/html/media
    depends_on:
      - web
    links:
      - web

nginx/Dockerfile

FROM nginx:latest

# 删除原有配置文件,创建静态资源文件夹和ssl证书保存文件夹
RUN rm /etc/nginx/conf.d/default.conf \\
    && mkdir -p /usr/share/nginx/html/media
# && mkdir -p /usr/share/nginx/html/static \\
# && mkdir -p /usr/share/nginx/ssl


# 设置Media文件夹用户和用户组为Linux默认www-data, 并给予可读和可执行权限,
# 否则用户上传的图片无法正确显示。
RUN chown -R www-data:www-data /usr/share/nginx/html/media \\
    && chmod -R 775 /usr/share/nginx/html/media

# 添加配置文件
ADD ./nginx.conf /etc/nginx/conf.d/

# 添加ssl证书
ADD ./**.crt /etc/nginx/certs/
ADD ./**.key /etc/nginx/certs/

# 关闭守护模式
CMD ["nginx", "-g", "daemon off;"]

nginx/nginx.conf

upstream django 
    ip_hash;
    server web:8000; # Docker-compose web服务端口


server 
    listen 80 ssl; # 监听80端口
    server_name localhost; # 可以是nginx容器所在ip地址或127.0.0.1,不能写宿主机外网ip地址

    charset utf-8;
    client_max_body_size 10240M; # 限制用户上传文件大小
    # client_body_buffer_size 100M;

    ssl_certificate     /etc/nginx/certs/ssl-33-cntechcom2020.crt;
    ssl_certificate_key /etc/nginx/certs/ssl-33-cntechcom2020.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    #location /static 


    location / 
        include /etc/nginx/uwsgi_params;
        uwsgi_pass django;
        uwsgi_read_timeout 1200;
        uwsgi_connect_timeout 600;
        uwsgi_send_timeout 1200;
        uwsgi_max_temp_file_size 10240M;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP  $remote_addr;
        # proxy_pass http://django; # 使用uwsgi通信,而不是http,所以不使用proxy_pass。
    

    location /media  
        alias /usr/share/nginx/html/media;
    



    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log warn;

    server_tokens off;

做了一下比较,老网站使用了阿里云的负载均衡。我寻思就一个服务器,用负载均衡有用吗,还是加了一下,结果真的有用。至于这个原理我就不懂。

二、对上传视频进行压缩

一中的方法感觉对小体积视频比较有效,但体积一旦变大可能就会有些危险,因为没有从本质解决问题。对上传视频进行压缩也算是一种无奈之举。

三、采用主流视频网站的解决方案

这里就涉及到大改代码了。搜了一下解决方案,直接贴链接了,因为还没打算改。
视频在线播放卡慢,如何实现视频分片加载呢?前段 vue,后台 go
网页视频加载慢
求助:关于视频播放的方案

EasyNVR 因 sqlite 数据库过大导致访问网页卡顿的优化方案

作为视频直播平台,EasyNVR在视频直播时收到网络或者摄像头影响的卡顿是非常正常的现象,但也有可能出现非网络及摄像头配置影响的卡顿。EasyNVR一个项目现场,突然出现访问网页页面非常卡顿的现象,一个页面大概需要4s以上才能够响应显示,这个网页的响应明显就与摄像头配置无关了。

在我们确定网络状况无问题之后,先查看了EasyNVR数据库,发现只有1000条左右的数据,所以可以排除数据库的原因。但是在查看数据库大小的时候,发现数据库大小有 151MB,数据库过大,导致查询数据库很慢,因此出现响应慢的问题。

Sqlite3 在运行过程中,如果频繁进行删除和更新操作,会增加文件的碎片化,导致数据库增大,因此需要对数据库进行处理。

在代码中添加新的代码如下:

// sqlite 的特性在运行一段时间后,如果频繁删除或者更新数据,会导致文件变大,消除空闲页
func VacummSqlite() {
   if gUseDb == consts.SqliteDb && database != nil {
      database.Exec("VACUUM;")
      // fmt.Println(time.Now().Format(time.StampMilli) + " 运行了一次 VACUUM ")
   }
}

在软件初始化运行和每天晚上运行一次该方法,可以将对应的数据库重新消除空闲页,反碎片化,加快查询速度。
运行完毕,该数据库减小到 140KB。

以上是关于视频播放因视频过大产生卡顿的主要内容,如果未能解决你的问题,请参考以下文章

V4L2 采用多线程采集视频 , 保存的视频播放卡顿的问题

AI智能安防监控视频播放卡顿的原因排查与分析

关于微信小程序在iOS下视频播放卡顿,无法播放问题

剪辑视频时PR播放卡顿不连贯|如何修复Premiere软件中播放太卡问题

前端播放大视频卡顿的解决(m3u8视频流)

EasyNVR通过国标级联到上级平台,因音频传输导致视频卡顿的解决方法