前一段研究过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的优点:
- DASH是MPEG组织定义的国际开放标准,对业界的各种技术进行规范整合,得到众多公司的支持,其中也包括拥有HLS的Apple。
- DASH由于其开放性,围绕其产生了一系列开源软件,有利于DASH技术的推广。
- DASH不指定特定的编解码器,它与编解码器无关,即内容供应商只需要提供一种视频格式,不用考虑其兼容性问题。
- DASH与HLS一样基于HTTP,不用考虑防火墙或者代理的问题。
- DASH可以很容易的支持播放中的多音轨、多视频轨、多字幕轨的切换。
目前在使用DASH协议的视频网站比较出名的有BiliBili、YouTube等。
DASH的缺点:
- DASH与HLS同为采用切片方式运作的流媒体,都具有一定的端对端延时(6~30s)。
- 目前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()) {

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

被折叠的 条评论
为什么被折叠?



