使用nginx搭建音视频点播服务——基于DASH协议

本文详细介绍了如何使用DASH协议在Nginx上搭建点播服务,包括使用nginx-vod-module模块、配置多码率自适应、集成DRM加密,以及如何通过shakaplayer播放加密DASH流。


  前一段研究过HLS协议下的点播服务,与本文介绍的DASH协议下搭建所使用的nginx模块是同一个,可以参考 使用nginx搭建音视频点播服务器——基于HLS协议 1

1 DASH流媒体协议

  DASH的全称是Dynamic Adaptive Streaming Over HTTP,是一种自适应比特率流媒体技术。与苹果的HTTP Live Streaming(HLS)技术相似,通过把内容分割成小的基于HTTP的文件段序列,来进行流媒体播放。MPEG(Moving Picture Experts Group,动态图像专家组)是一个针对音视频压缩的国际标准化组织,为了寻求HLS的替代方案而推出了MPEG-DASH标准,MPEG-DASH作为一种基于HTTP的自适应码率的流媒体传输解决方案,在2012年由ISO/IEC发表,正式成为国际标准。

DASH的优点:

  1. DASH是MPEG组织定义的国际开放标准,对业界的各种技术进行规范整合,得到众多公司的支持,其中也包括拥有HLS的Apple。
  2. DASH由于其开放性,围绕其产生了一系列开源软件,有利于DASH技术的推广。
  3. DASH不指定特定的编解码器,它与编解码器无关,即内容供应商只需要提供一种视频格式,不用考虑其兼容性问题。
  4. DASH与HLS一样基于HTTP,不用考虑防火墙或者代理的问题。
  5. DASH可以很容易的支持播放中的多音轨、多视频轨、多字幕轨的切换。

目前在使用DASH协议的视频网站比较出名的有BiliBili、YouTube等。

DASH的缺点:

  1. DASH与HLS同为采用切片方式运作的流媒体,都具有一定的端对端延时(6~30s)。
  2. 目前DASH协议的市场占有不高,主要还是HLS的份额,各端对DASH的支持依赖于开源软件的集成,原生支持不够。

其实对于延迟高的问题,DASH与HLS两个协议都发展出了各自的低延迟解决方案,DASH协议有DASH-LL,HLS协议有LL-HLS2和LHLS,本文暂不讨论。

2 搭建点播服务

2.1 nginx代理

  nginx是一个代理服务器,首先需要在Linux上搭建nginx服务,具体的流程可以参考nginx的安装流程3,搭建视频点播服务器会用到nginx-vod-module模块,按照安装流程添加该模块到nginx中,搭建点播服务使用的具体环境如下:

系统版本:CentOS Linux release 7.9 2009(Core)
nginx版本:1.20.1
nginx-vod-module版本:1.29

2.2 nginx-vod-module模块

  nginx-vod-module模块是基于nginx来提供VOD(video on demand)服务的第三方模块,它支持基于DASH、HDS、HLS、MSS的点播服务搭建。

nginx-vod-module下载地址:https://github.com/kaltura/nginx-vod-module/archive/refs/tags/1.29.tar.gz

在nginx进行安装配置的过程中,需要使用--add-module=选项来添加第三方模块一起进行编译,相关的步骤可以参考模块的github网址:

nginx-vod-module的github网址:https://github.com/kaltura/nginx-vod-module

在配置nginx进行编译的时候使用的配置参数如下:

./configure --prefix=/web/webserver/nginx-vod-hls --with-http_stub_status_module --with-http_ssl_module --with-cc-opt=’-O0 -gstabs+3’ --with-debug --add-module=…/nginx-vod-module-1.29

配置、编译、安装都完成之后,即可在nginx的配置文件中使用nginx-vod-module模块提供的关键字了。

2.3 配置nginx下的DASH点播服务

  此处使用local模式,如果想要使用mapped模式,可以参考使用nginx搭建音视频点播服务——基于HLS协议4中的mapped模式介绍。这里假设部署nginx服务的机器ip地址为192.168.192.128。

2.3.1 常规配置

在nginx的配置文件中,添加对应的location配置:

location /vod_dash {
    vod dash; # 协议使用dash模式
    vod_mode local; # 访问模式指定为local模式

    vod_align_segments_to_key_frames on; # 每个切片以关键帧开头

    vod_dash_manifest_format segmenttemplate; # 在mpd清单文件中使用片段模板的格式
    vod_dash_profiles urn:mpeg:dash:profile:isoff-live:2011; # 在mpd清单文件中指定profile标记

    ## DRM相关配置
    #vod_drm_enabled on;                         # 启用DRM
    #vod_drm_clear_lead_segment_count 0;         # 设置所有切片都需要经过DRM处理
    #vod_drm_upstream_location /php_proxy/;      # 指定DRM地址
    #vod_drm_request_uri /dash_clear_key.php;    # 配置php地址

    #跨域相关配置
    add_header Access-Control-Allow-Headers '*';
    add_header Access-Control-Expose-Headers 'Server,range,Content-Length,Content-Range,Date';
    add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS';
    add_header Access-Control-Allow-Origin '*';

    alias /media;
}

## 配置指向DRM服务器地址的location
#location /php_proxy/ {
#    proxy_pass http://192.168.192.182/; # 转发地址指向DRM服务器地址
#    proxy_set_header Host $http_host;
#}

conf文件修改后,nginx需要reload才能使配置生效。

./nginx -s reload

这里还需要特别注意的一点是由于DASH协议的原因,播放地址必须使用https进行访问才能正常播放。

在nginx上配置https服务:
配置教程在网上很多,就不冗余了,略过。

服务器上对应的视频文件目录结构:

/media/example0001.mp4

URL播放地址(https):

https://192.168.192.128/vod_dash/example0001.mp4/manifest.mpd

2.3.2 多码率自适应配置

  多码率自适应指的是在视频播放中自动判断网络状态,在网络状态好的时候播放高码率视频,网络状态差的时候播放低码率的视频,多码率自适应需要在服务器上需要有2个或者2个以上对应的不同码率的视频源。

假设在服务器上对应的视频文件目录结构:

/media/example0001.mp4
/media/example0001_low.mp4

使用nginx-vod-module模块可以自动计算视频对应的带宽并完成清单文件的生成,只需要拼接好对应的URL地址即可,多码率自适应的URL播放地址(https):

https://192.168.192.128/vod_dash/,example0001,example0001_low,.mp4.urlset/manifest.mpd

2.4 使用shakaplayer播放DASH流

  DASH流媒体的播放目前在各端并不是原生支持的,还需要播放器的支持,比较主流的有shakaplayer、Dash.js等,本文使用开源的Html5播放器shakaplayer。

2.4.1 编译安装shakaplayer

  安装shakaplayer之前需要先安装一些工具:Git v1.9+、Python v2.7 or v3.5+、Java Runtime Environment v8+、NodeJS v10+、Apache(A local web server)。

可以参考shakaplayer官网的安装说明https://shaka-player-demo.appspot.com/docs/api/tutorial-welcome.html

安装Git v1.9+:
用yum安装的git版本太低,需要从https://mirrors.edge.kernel.org/pub/software/scm/git/下载对应版本的源码编译安装。

安装Python v2.7 or v3.5+:
可以用yum安装,如果yum无法使用,也可以从https://www.python.org/downloads/source/下载对应版本的源码编译安装。

安装Java Runtime Environment v8+:
jre需要从https://java.com/en/download/manual.jsp下载对应的版本;
解压后建立软链接ln -s /.../jre1.8.0_321/bin/java /usr/bin/java即可,其中/.../jre1.8.0_321/bin/java为压缩包解压后的目录。

可以参考官网的安装说明https://java.com/en/download/help/linux_x64_install.html#install

安装NodeJS v10+:
可以使用yum安装nodejs,如果yum无法使用,也可以从https://nodejs.org/en/download/下载对应版本的源码编译安装。

nodejs的yum安装步骤:
安装centos-release-scl
    yum install centos-release-scl-rh
安装yum-config-manager命令
    yum install yum-utils
安装RHSCL
    yum-config-manager --enable rhel-server-rhscl-7-rpms
安装nodejs
    yum install rh-nodejs10
启用nodejs
    scl enable rh-nodejs10 bash

可以参考官网的安装说明https://www.softwarecollections.org/en/scls/rhscl/rh-nodejs10/

安装Web Server:
这里直接用nginx即可,运行shakaplayer需要web服务器支持,因为浏览器对来自file:///url的应用程序有限制,所以不能把shakaplayer放在本地运行。

有了上面的工具支持后,就可以安装shakaplayer了:
下载shakaplayer,地址为https://github.com/google/shaka-player/releases;
解压之后进入目录,执行python build/all.py,成功后会在dist目录下会生成shaka-player.compiled.js文件,之后在web中创建shakaplayer播放器时需要依赖该文件。

2.4.2 使用shakaplayer播放DASH流

  在html中包含上一步生成的js文件路径,加载shakaplayer,并指定URL播放地址https://192.168.192.128/vod_dash/example0001.mp4/manifest.mpd(需要使用https),具体细节如下:

<!DOCTYPE html>
<html>

<head>
    <!-- Shaka Player compiled library: -->
    <script src="/html/shaka-player-3.3.0/dist/shaka-player.compiled.js"></script>
</head>

<body>
    <video id="video" width="640" controls autoplay></video>
    <script>
        // 注意这里播放的mpd清单文件需要使用https来访问
        const manifestUri =
            'https://192.168.192.128/vod_dash/example0001.mp4/manifest.mpd';

        function initApp() {
     
     
            // Install built-in polyfills to patch browser incompatibilities.
            shaka.polyfill.installAll();

            // Check to see if the browser supports the basic APIs Shaka needs.
            if (shaka.Player.isBrowserSupported()) {
     
     
                
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值