00 HLS流与浏览器播放
上节我们用nginx-RTMP搭建了流媒体服务器,实现了OBS推流,在PC端使用VLC播放RTMP协议的视频流和实时流的工作。
这节我们的成员来了个新同伴,video.js。使用它可以实现浏览器播放HLS实时流,即播放.m3u8代表的ts切片视频文件。
因此也可以在手机端观看。
其实HLS协议就是把整个流分成一个个小的,基于 HTTP 的文件来下载,每次只下载一些,.m3u8文件就是基于 HLS 协议,存放视频流元数据的文件。
实际上,m3u8 文件只是存放了一些 ts 文件的配置信息和相关路径,当视频播放时,.m3u8 是动态改变的。
我们用video标签或者其他解析方式播放这个视频文件时,首先是会找到对应的 ts 文件来播放,所以一般为了加快速度,.m3u8 放在 web 服务器上,ts 文件放在 cdn 上。
客户端,即浏览器,请求.m3u8文件时,其实是解析 m3u8 的播放列表,再按序请求每一段的 url,获取 ts 数据流。
01 nginx配置
基于上节课的内容,我们丰富下nginx的hls配置。
worker_processes auto;events {worker_connections 1024;}# RTMP configurationrtmp {server {listen 1935; # Listen on standard RTMP portchunk_size 4096;# Define the Applicationapplication show {live on;# Turn on HLShls on;hls_path /mnt/hls/;# disable consuming the stream from nginx as rtmpdeny play all;hls_fragment 3;hls_max_fragment 18;hls_playlist_length 30;}# RTMP video on demand for mp4 filesapplication vod {play /mnt/mp4s;}# RTMP stream using OBSapplication stream {live on;}}}http {sendfile off;tcp_nopush on;aio on;directio 512;default_type application/octet-stream;server {listen 8081;server_name localhost;location / {root /mnt/;index index.html;try_files $uri $uri/ /index.html;}# 查看statlocation /stat {rtmp_stat all;rtmp_stat_stylesheet stat.xsl;}# stat.xsl 文件要从nginx-rtmp-module源码目录中cp到html目录下面location /stat.xsl {root /usr/local/src/nginx-rtmp-module/;}location /hls {types {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}root /mnt;# 与上面hls配置的root要对应,不然视频文件就404了add_header Cache-Control no-cache;}}server {listen 7001;server_name localhost;location / {root /mnt/web/;index index.html;try_files $uri $uri/ /index.html;}}}
02 video.js
创建index.html,内容如下,放入服务器上/mnt目录下。
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"><title>video</title><link href="//vjs.zencdn.net/7.3.0/video-js.min.css" rel="stylesheet"><script src="//vjs.zencdn.net/7.3.0/video.min.js"></script></head><body><video id="test_video" controls preload="none" width="640" height="480"class="video-js vjs-big-play-centered vjs-fluid "data-setup="{}"><source src="http://ip:8081/hls/test.m3u8" type='application/vnd.apple.mpegurl' /></video><script type="text/javascript">var myPlayer = videojs('test_video', {liveui: true});//var myPlayer = videojs('test_video'); // video 标签中的IDmyPlayer.ready(function(){myPlayer.play();});</script></body></html>
03 测试
使用obs推流,推流地址为:rtmp://ip:1935/show。与nginx配置中的rtmp下的show模块一致。
具体操作可参考本系列第一篇文章。
在obs推流后,可以看到服务器上的/mnt/hls文件夹下产生了test.m3u8文件及test-0.ts、test-1……等分段流媒体文件。
此时客户端,也即使用浏览器,访问http://ip:8081就能看到了。
目前这个方式非常简陋,还有很大的优化空间。
思路是怎么让hls分段播放流媒体文件之间能平滑切换。
目前表现的卡顿,都是在每次更换需要播放的视频如test-0.ts、test-1的时候。
文章转载自姚毛毛的博客,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




