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

使用nginx-vod-module搭建HLS点播服务与加密
本文详细介绍了如何使用nginx和nginx-vod-module搭建HLS点播服务,包括local模式和mapped模式的配置,以及多码率自适应、字幕支持和内容加密的方法。在local模式下,通过配置nginx和视频文件目录结构,实现了视频的点播和多码率自适应。在mapped模式下,通过json文件配置视频和字幕。同时,文章还展示了如何设置加密秘钥和解密秘钥,以保护内容安全。

1 音视频技术

1.1 流媒体

  在网络上传输音、视频等多媒体信息,主要有下载和流式传输两种方案。下载的方式对于体积较大的音、视频数据而言,在使用前下载整个媒体文件耗时很大;流媒体(streaming media)传输提供了一种低延时的方式来避免这个问题,流媒体技术是指将多媒体数据压缩后,经过网络分段发送,在网上即时传输音、视频数据供用户播放的一种技术。

1.2 点播与直播

  点播(VOD,video on demand)即根据用户需求播放,音视频内容一般已经存放在服务器上了,不同于先下载再播放,点播要求即点即播,各大音视频网站(喜马拉雅、优酷、爱奇艺等)提供的服务就是VOD服务。
  直播(Live)需要对音视频内容实时录制,在录制同时以“流”的形式推送到服务器,服务器在收到用户的播放请求后,会将媒体流传输到用户的播放器进行播放,并对延迟有较高的要求,各大直播平台(斗鱼、虎牙等)提供的服务就是直播服务。

1.3 HLS流媒体协议

  HLS(HTTP Live Streaming)自适应码率流媒体传输协议,来自Apple公司,该协议基于Http协议,HLS诞生之初旨在能够从iPhone中删除flash,如今已成为使用最广泛的协议。HLS的优缺点也比较明显。

HLS的优点:
  Html5能够直接支持HLS,有浏览器就能播放,不需要安装额外的app,不用考虑防火墙或者代理问题;HLS也支持最新的H.265编解码器,H.265编码的质量要比H.264高很多。
HLS的缺点:
  因为HLS基本是采用了点播切片的方式实现的直播,在直播上相对于其它协议有较高的延迟(5~8秒延迟)。

除了HLS协议之外,相关的协议还有RTP/RTCP、RTSP、RTMP、MSS、DASH、HDS、WEBRTC、RIST、SRT等……它们都有各自的优缺点。

HLS的原理:
  首先将一个完整音视频分成多个ts格式音视频文件切片,并生成m3u8索引文件,用户下载m3u8索引文件,通过m3u8文件中每段ts切片的索引地址来播放具体的ts切片,在m3u8中可以指定播放相关的参数。

1.4 CDN

  CDN(Content Delivery Network)内容分发网络,是为了改善网络服务质量而产生的,它是构建在现有网络基础之上的智能虚拟网络,通过负载均衡、内容分发、调度等完成资源就近获取的目标。
  CDN的基本原理是采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率,CDN网络的诞生大大地改善了互联网的服务质量。
  在互联网上的流媒体服务为了实现更优质的用户体验,一般都需要经过CDN节点进行内容分发。点播、直播技术的选择需要考虑大环境下主流CDN服务供应商能够提供的服务支持,各家对协议的支持也不一样(像阿里云CDN支持RTMP输入,RTMP、FLV、HLS输出),点播需要考虑输出,直播需要考虑输入与输出两端。

2 搭建点播服务(音视频同理)

2.1 nginx服务器

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

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

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.28.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_gzip_static_module --with-http_gunzip_module --with-file-aio --with-threads --with-cc-opt=“-O3” --with-http_ssl_module --with-openssl-opt=enable --with-http_mp4_module --with-stream --add-module=…/nginx-vod-module-master

配置中主要是附加了一些常规模块,打开了一些配置开关,其中:

–with-file-aio 异步io支持,强烈推荐,只在local、mapped模式下
–with-threads (nginx 1.7.11+) 支持使用线程池异步打开文件(要求在nginx.conf中配置vod_open_file_thread_pool),只在local、mapped模式下
–with-cc-opt=“-O3” 附加编译器优化,减少视频解析和帧处理的耗时

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

2.3 配置nginx点播服务

2.3.1 local模式
2.3.1.1 常规配置

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

location /vod {
    vod hls; # 协议使用hls模式
    vod_mode local; # 访问模式指定为local模式
    
    vod_align_segments_to_key_frames on; # 每个切片以关键帧开头
    vod_manifest_segment_durations_mode accurate; # 精确显示每个切片的长度
    
    # 解决浏览器跨域问题
    add_header Access-Control-Allow-Headers '*';
    add_header Access-Control-Expose-Headers 'Server,range,Content-Length,Content-Range';
    add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS';
    add_header Access-Control-Allow-Origin '*';

    alias /media; # 视频文件路径
}

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

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

/media/example0001.mp4

URL播放地址(假设nginx配置在ip为192.168.192.128的地址上):

http://192.168.192.128/vod/example0001.mp4/index.m3u8

使用相应的html5播放器或者本地播放器打开,即可观看该地址的视频点播。若使用本地播放器,推荐使用VLC media player

nginx-vod-module会根据URL动态生成对应的m3u8文件,其内容如下:

#EXTM3U
#EXT-X-TARGETDURATION:17
#EXT-X-ALLOW-CACHE:YES
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10.000,
http://192.168.192.128/vod/example0001.mp4/seg-1-v1-a1.ts
#EXTINF:10.000,
http://192.168.192.128/vod/example0001.mp4/seg-2-v1-a1.ts
#EXTINF:10.000,
http://192.168.192.128/vod/example0001.mp4/seg-3-v1-a1.ts
……
……
……
#EXTINF:7.760,
http://192.168.192.128/vod/example0001.mp4/seg-347-v1-a1.ts
#EXT-X-ENDLIST

通过对nginx进行配置可以控制m3u8文件的生成规则,以此来控制切片的大小、状态等播放相关的属性,具体可以查看nginx-vod-module模块的文档2

2.3.1.2 local模式下的多码率自适应

  使用常规配置,仅更改访问的URL播放地址即可支持多码率自适应功能,HLS根据用户当前可用带宽的大小自适应匹配对应码率的视频。

在服务器上对应的视频文件目录结构(后缀low表示同一视频的低清晰度版本):

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

URL播放地址:

http://192.168.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值