物联网架构成长之路(42)-直播流媒体入门(RTMP篇)

1. 安装RTMP流媒体服务器
  以前其实我是利用Nginx-RTMP-module搭建过RTMP流媒体服务器,并实现了鉴权功能。参考https://www.cnblogs.com/wunaozai/p/9427730.html,看看发布时间,已经是一年多以前的事情了,感概时间过得好快啊。
  先在Nginx官网【http://nginx.org/en/download.html】下载源码包,然后在github【https://github.com/arut/nginx-rtmp-module】下载插件包。

 1 #下载
 2 wget http://nginx.org/download/nginx-1.16.1.tar.gz
 3 git clone https://github.com/arut/nginx-rtmp-module
 4 #解压
 5 tar -zxvf nginx-1.16.1.tar.gz
 6 #编译,在编译检查configure过程中如果出现缺少包的,请通过apt-get获取即可
 7 cd nginx-1.16.1
 8 ./configure --prefix=/opt/nginx --with-stream --with-http_ssl_module --with-stream_ssl_module --with-debug --add-module=../nginx-rtmp-module
 9 make
10 make install

  基本的Nginx配置,如下,配置了RTMP实时流转发和HLS实时流转发两种。更多配置参考官方文档【https://github.com/arut/nginx-rtmp-module/blob/master/README.md】

 1 rtmp {
 2     server {
 3         listen 1935;
 4         chunk_size 4096;
 5         access_log logs/rtmp_access.log;
 6         application rtmp {
 7             live on;
 8         }
 9     }
10 }

2. 测试推送RTMP流到服务器,并客户端拉取流数据
  推流:

ffmpeg -re -i 003.mov -c copy -f flv rtmp://172.16.23.202/rtmp/room

  拉流:

ffplay -i rtmp://172.16.23.202/rtmp/room


  也可以使用微信小程序【腾讯视频云】里面有推流和拉流工具
 
  拉流测试也可以使用基于Flash的js库。这种库,还是有很多的。ckplayer【www.ckplayer.com】GrindPlayer【https://github.com/kutu/GrindPlayer】videojs【https://videojs.com】这些库基本都差不多,都是支持RTMP和HLS,RTMP使用Flash来播放。
  浏览器播放RTMP直播流(使用ckplayer)【http://www.ckplayer.com/down/】

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>ckplayer</title>
 6         <style type="text/css">body{margin:0;padding:0px;font-family:"Microsoft YaHei",YaHei,"微软雅黑",SimHei,"黑体";font-size:14px}</style>
 7     </head>
 8     <body>
 9         <div id="video" style="width: 600px; height: 400px;"></div>
10         <script type="text/javascript" src="../ckplayer/ckplayer.js"></script>
11         <script type="text/javascript">
12             var videoObject = {
13                 container: ‘#video‘, //容器的ID或className
14                 variable: ‘player‘,//播放函数名称
15                 autoplay:false,
16                 live:true,
17                 video: ‘rtmp://172.16.23.202/rtmp/room‘
18             };
19             var player = new ckplayer(videoObject);
20         </script>
21     </body>
22 </html>

3. 测试推送RTMP流到服务器,服务器提供HLS直播流
  nginx.conf 配置文件

 1 http{
 2 ...
 3     server {
 4         listen 1936;
 5         location /html {
 6             root /tmp;
 7         }
 8         location /hls {
 9             types {
10                 application/vnd.apple.mpegurl m3u8;
11                 video/mp2t ts;
12             }
13             root /tmp;
14             add_header Cache-Control no_cache;
15         }
16
17         location /dash {
18             root /tmp;
19             add_header Cache-Control no-cache;
20         }
21     }
22 }
23 rtmp {
24     server {
25         listen 1935;
26         chunk_size 4096;
27         access_log logs/rtmp_access.log;
28         application rtmp {
29             live on;
30         }
31         application hls{
32             live on;
33             hls on;
34             hls_path /tmp/hls;
35 #hls_fragment 5s;
36         }
37         application dash{
38             live on;
39             dash on;
40             dash_path /tmp/dash;
41         }
42     }
43 }

  服务器缓存TS文件

  浏览器播放HLS直播流(这里使用videojs,10秒左右延时)

 1 <!DOCTYPE html>
 2 <html lang="cn">
 3     <head>
 4         <meta chartset="UTF-8">
 5         <meta http-equiv="X-UA-Compatible" content="ie=edge">
 6         <title>Test</title>
 7         <link href="https://cdn.bootcss.com/video.js/7.6.5/video-js.min.css" rel="stylesheet">
 8         <script src="https://cdn.bootcss.com/video.js/7.6.5/video.min.js"></script>
 9     </head>
10
11     <body>
12         <h1>Live</h1>
13         <video id="example-video" width="960" height="540" class="video-js vjs-default-skin" controls poster="001.png">
14             <!--<source src="http://ivi.bupt.edu.cn/hls/lytv.m3u8"></source>-->
15             <source src="http://172.16.23.202:1936/hls/room.m3u8"></source>
16         </video>
17
18         <script type="text/javascript">
19             var player = videojs(‘example-video‘)
20             player.play();
21         </script>
22     </body>
23 </html>

  浏览器运行界面

1   ffplay -i http://172.16.23.202:1936/hls/room.m3u8

  运行效果图

Dash流(找不到合适的播放器)

http://172.16.23.202:1936/dash/room.mpd

4. RTSP转RTMP协议
  ffmpeg 将rtsp流媒体转换成RTMP流

1 ffmpeg -i "rtsp://172.16.20.197:5454/test.rtsp" -vcodec copy -acodec copy -f flv -an "rtmp://172.16.23.202:1935/rtmp/room"
2 ffmpeg -i "rtsp://172.16.20.197:5454/test.rtsp" -vcodec copy -acodec copy -f flv -an "rtmp://172.16.23.202:1935/hls/room"

  如下图所示,FFServer先提供RTSP流。然后利用FFMpeg将RTSP流转换为RTMP流,并推送至Nginx-RTMP流媒体服务器。

  然后浏览器可以利用上面的js库,播放RTMP流,或者播放HLS流。

5. 本章小结
  最后总结一下,就是使用CKPlayer播放器,如果对时延不敏感的使用HLS,如果要求高的使用RTMP。虽然Flash慢慢被淘汰,但是在微信自带浏览器中还是有比较好的支持。而且各大厂商提供的直播流服务,基本都是以RTMP为主流。

  RTSP和RTMP简单推流拉流示意图

参考资料:

  阿里云提供的播放器: https://player.alicdn.com/aliplayer/setting/setting.html
  ffmpeg常用功能: https://www.jianshu.com/p/c141fc7881e7
  Nginx-rtmp 直播实时流搭建:https://www.cnblogs.com/wunaozai/p/9427730.html
  IPCamera RTSP格式: https://blog.csdn.net/hk121/article/details/83858480
  EasyDarwin提供PC工具:https://pan.baidu.com/s/1-7lZ3KM4wPl87OLx2tWjTQ
  很不错的一个项目:https://gitee.com/Tinywan/html5-dash-hls-rtmp
  FFmpeg 处理RTMP流媒体命令:https://blog.csdn.net/leixiaohua1020/article/details/12029543

本文地址: https://www.cnblogs.com/wunaozai/p/11772392.html

原文地址:https://www.cnblogs.com/wunaozai/p/11772392.html

时间: 2024-11-05 18:57:17

物联网架构成长之路(42)-直播流媒体入门(RTMP篇)的相关文章

物联网架构成长之路(41)-直播流媒体入门(RTSP篇)

1. 搭建RTSP服务 首先现在音视频利器 ffmpeg,这个到http://www.ffmpeg.org/download.html 这里下载压缩包即可. 文档参考:http://trac.ffmpeg.org/wiki/ffserver 二进制下载地址:https://ffbinaries.com/downloads 由于ffserver在4.0以上已经移除了,所以只能下载3.x功能,不过已经够用了.我们只是用来测试而已. 新增ffserver.conf 配置 1 RTSPPort 5454

物联网架构成长之路(16)-SpringCloud从入门到吹水

1.前言 Spring Cloud 现在比较流行,版本更新也是蛮快的,网上资料也是很多.很多参考网上资料就可以学到了.这里给个 http://blog.csdn.net/forezp/article/details/70148833 2.放弃 本来还想写一篇Spring Cloud 入门环境搭建的博客, 后来想了想,还是算了,网上资料一大堆.这里就不写了. 3.吹水 下面就简单聊聊天,吹吹水算了 2018.01.18 笔记 公司网速不行,在进行Maven项目以来更新,偷偷写一些经历. 现在开始学

物联网架构成长之路(36)-Vue前端入门

1. 前言 物联网平台,需要有一个类似大屏看板的功能. 找了一圈,发现阿里已经有对应的DataV产品,但是那个价格有点贵啊.所以找了这个[http://datav.jiaminghi.com/demo/],这看起来也是挺不错的.就是需要了解一些前端Vue.说到前端,我之前好久就想入门了.断断续续看视频,写Demo,写小程序.但都处于入门阶段.而且前端变化太快了.半年没看,就各种更新了.不过还是迟早要学的. 2. 安装环境 安装IDE,这里推荐VSCode,然后安装Vetur 插件 Google

物联网架构成长之路(40)-Bladex开发框架入门

0. 前言 前一小节,讲了如何入门,这里就简单讲一下如何自定义查询和权限控制配置. 1. 配置多租户 如果要启用该表的多租户功能,需要在application.yml 这里配置. 2. 配置模糊匹配 1 @GetMapping(value="/list2") 2 public R<IPage<Wunaozai>> list2(@RequestParam Map<String, Object> wunaozai, Query query){ 3 IPa

物联网架构成长之路(56)-SpringCloudGateway+JWT实现网关鉴权

0. 前言 结合前面两篇博客,前面博客实现了Gateway网关的路由功能.此时,如果每个微服务都需要一套帐号认证体系就没有必要了.可以在网关处进行权限认证.然后转发请求到后端服务.这样后面的微服务就可以直接调用,而不需要每个都单独一套鉴权体系.参考了Oauth2和JWT,发现基于微服务,使用JWT会更方便一些,所以准备集成JWT作为微服务架构的认证方式. [https://www.cnblogs.com/wunaozai/p/12512753.html] 物联网架构成长之路(54)-基于Naco

物联网架构成长之路(0)-目录

一.基础 [http://www.cnblogs.com/wunaozai/p/8067621.html] 物联网架构成长之路(1)-前言 [http://www.cnblogs.com/wunaozai/p/8075640.html] 物联网架构成长之路(2)-脚手架工具准备 [http://www.cnblogs.com/wunaozai/p/8082332.html] 物联网架构成长之路(3)-EMQ消息服务器了解

物联网架构成长之路(24)-Docker练习之Compose容器编排

0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compose,了解一些技术细节及原理后,在入手K8s.还是不能一口吃成胖子,要多吃几口才可以.而且目前公司都是一些小项目,能用得上DockerCompose已经很不错了,还想要上K8s,估计是不现实的. 1. 安装 可以通过运行下面命令进行安装, 1 curl -L https://github.com/d

物联网架构成长之路(35)-利用Netty解析物联网自定义协议

一.前言 前面博客大部分介绍了基于EMQ中间件,通信协议使用的是MQTT,而传输的数据为纯文本数据,采用JSON格式.这种方式,大部分一看就知道是熟悉Web开发.软件开发的人喜欢用的方式.由于我也是做web软件开发的,也是比较喜欢这种方式.阿里的物联网平台,也是推荐这种方式.但是,但是做惯硬件开发,嵌入式开发就比较喜欢用裸TCP-Socket连接.采用的是二进制协议.基于此大部分应用场合为了兼容旧设备,就需要单独开发一个TCP服务器的网关.这里使用以前学过的,也是比较流行的Netty框架. 话不

物联网架构成长之路(11)-Redis缓存主从复制

1. 说明 在我的物联网平台框架框架中,会用到Redis这个中间件.作为EMQ权限认证的缓存.https://www.cnblogs.com/think-in-java/p/5123884.html 2. 编译&运行 1 wget http://download.redis.io/releases/redis-4.0.6.tar.gz 2 make && make test && make PREFIX=/home/user/workspace/redis inst