流媒体技术学习笔记之(一)nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器

参照网址:

【1】http://blog.csdn.net/redstarofsleep/article/details/45092147

【2】HLS介绍:http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html

上面这两个流的地址分别是:

第一个就是推送的地址:

RTMP推流地址:

rtmp://serverIp:1935/myapp/test1

第二个是HTTP地址: 

HLS推流地址:

http://serverIp:8080/hls/test2.m3u8

HTTP Live StreamingHLS)是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播:

         HTTP Live Streaming(HLS)是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播,相对于常见的流媒体直播协议,例如RTMP协议、RTSP协议、MMS协议等,HLS直播最大的不同在于,直播客户端获取到的,并不是一个完整的数据流。HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为,HLS是以点播的技术方式来实现直播。由于数据通过HTTP协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过HLS的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。

 

 

 

Nginx本身是一个非常出色的HTTP服务器,FFMPEG是非常好的音视频解决方案.这两个东西通过一个nginx的模块nginx-rtmp-module,组合在一起即可以搭建一个功能相对比较完善的流媒体服务器.

这个流媒体服务器可以支持RTMP和HLS(Live Http Stream)

从安装开始

Nginx的安装参照我之前的这个: http://blog.csdn.net/redstarofsleep/article/details/45092127

不同的是在configure的时候需要增加nginx-rtmp-module的支持,下载好nginx-rtmp-module后解压,然后nginx安装时增加这个模块(--add-module),其它都是一样的.

 

[java] view plain copy

 

 print?

  1. ./configure --prefix=/usr/local/nginx --with-pcre=/home/user/pcre/pcre-8.32 --with-zlib=/home/user/zlib/zlib-1.2.8 --with-openssl=/home/user/openssl/openssl-1.0.1i  --add-module=/home/user/nginx-rtmp-module  

FFMPEG的安装参照上一篇: http://blog.csdn.net/redstarofsleep/article/details/45092145

 

nginx配合ffmpeg做流媒体服务器的原理是: nginx通过rtmp模块提供rtmp服务, ffmpeg推送一个rtmp流到nginx, 然后客户端通过访问nginx来收看实时视频流. HLS也是差不多的原理,只是最终客户端是通过HTTP协议来访问的,但是ffmpeg推送流仍然是rtmp的.

 

安装完成后,打开Nginx的配置文件nginx.conf进行配置

首先在里面加入rtmp的配置

[java] view plain copy

 

 print?

  1. rtmp {  
  2.     server {  
  3.         listen 1935;  
  4.   
  5.         application myapp {  
  6.             live on;  
  7.         }  
  8.         application hls {  
  9.             live on;  
  10.             hls on;  
  11.             hls_path /tmp/hls;  
  12.         }  
  13.     }  
  14. }  

然后,针对hls,还需要在http里面增加一个location配置

[java] view plain copy

 

 print?

  1. location /hls {  
  2.             types {  
  3.                 application/vnd.apple.mpegurl m3u8;  
  4.                 video/mp2t ts;  
  5.             }  
  6.             root /tmp;  
  7.             add_header Cache-Control no-cache;  
  8. }  

 

这是一个最简单,最基础的配置, rtmp监听1935端口,如果是hls的话用hls on开启hls,并且为hls设置一个临时文件目录hls_path /tmp/hls; 其它更高级的配置可以参看nginx-rtmp-module的readme,里面有比较详细的介绍其它的配置,并且它还提供了一个通过JWPlayer在网页上播放的例子.

 

保存完配置文件后,启动nginx,通过netstat -ltn命令可以看到增加了一个1935端口的监听.8080是nginx默认的http监听端口.

[java] view plain copy

 

 print?

  1. # netstat -ltn  
  2. Active Internet connections (only servers)  
  3. Proto Recv-Q Send-Q Local Address           Foreign Address         State        
  4. tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN       
  5. tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN       
  6. tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN       
  7. tcp        0      0 0.0.0.0:1935            0.0.0.0:*               LISTEN       
  8. tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN       
  9. tcp6       0      0 :::22                   :::*                    LISTEN       
  10. tcp6       0      0 ::1:631                 :::*                    LISTEN    

然后用ffmpeg推流到nginx:

第一个是推到了上面配置的myapp上:

[java] view plain copy

 

 print?

  1. ffmpeg -re -i "D:\download\film\aqgy\02.mp4" -vcodec libx264 -vprofile baseline -acodec aac  
  2.  -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://server:1935/  
  3. myapp/test1  

第二个推送到hls上:

[java] view plain copy

 

 print?

  1. ffmpeg -re -i "D:\download\film\aqgy\02.mp4" -vcodec libx264 -vprofile baseline -acodec aac  
  2.  -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://ip:1935/  
  3. hls/test2  

现在我们的流媒体服务器有两个实时流了,一个是rtmp的,另一个是hls的,用流媒体播放器播放一下,流媒体播放器可以用vlc也可以用ffmpeg带的ffplay.手机也是可以播放的.

 

上面这两个流的地址分别是:

第一个就是推送的地址: rtmp://serverIp:1935/myapp/test1

第二个是HTTP地址: http://serverIp:8080/hls/test2.m3u8

 

最后贴上一段对于HLS这个比较特殊的流媒体协议的解释:

       (这段解释来自: http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html)

  HTTP Live Streaming(HLS)是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播,相对于常见的流媒体直播协议,例如RTMP协议、RTSP协议、MMS协议等,HLS直播最大的不同在于,直播客户端获取到的,并不是一个完整的数据流。HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为,HLS是以点播的技术方式来实现直播。由于数据通过HTTP协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过HLS的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。

时间: 2024-10-28 12:33:34

流媒体技术学习笔记之(一)nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器的相关文章

流媒体技术学习笔记之(二)RTMP和HLS分发服务器nginx.conmf配置文件(解决了,只能播放RTMP流而不能够播放HLS流的原因)

user www www; worker_processes 1; error_log logs/error.log debug; #pid logs/nginx.pid; events { worker_connections 65535; } rtmp { server { listen 1935; application live { live on; record off; } application live2 { live on; record off; } # applicatio

流媒体技术学习笔记之(十三)Windows安装FFmpeg

一.下载地址: 网址:https://ffmpeg.org/ 选择Windows版本:https://ffmpeg.org/download.html#build-windows 二.解压安装: 下载并解压FFmpeg文件夹,它会生成一个类似名为"ffmpeg-20150504-git-eb9fb50-win32-static"的新文件夹:   打开你想安装的任意磁盘,例如:d盘.新建一个名为"ffmpeg"的文件夹,将第二步解压生成的文件夹中的内容全部拷贝到&qu

流媒体技术学习笔记之(十四)FFmpeg进行笔记本摄像头+麦克风实现流媒体直播服务

FFmpeg推送视频流,Nginx RTMP模块转发,VLC播放器播放,实现整个RTMP直播 查看本机电脑的设备 ffmpeg -list_devices true -f dshow -i dummy 红色标记表示视频设备和麦克风设备 看到乱码了吧!来这里查看哦   FFmpeg编码推送到RTMP服务器 ffmpeg -f dshow -i video="Lenovo EasyCamera":audio="麦克风 (Realtek High Definition Audio)

流媒体技术学习笔记之(十)HLS协议直播延时优化(35s到10S)

1.首先要了解HLS延时的机制,也就是为什么会延时,延时主要发生在什么地方. HTTP Live Streaming 并不是一个真正实时的流媒体系统,这是因为对应于媒体分段的大小和持续时间有一定潜在的时间延时.在客户端,至少在一个分段媒体文件被完全下载后才能够开始播放,而通常要求下载完两个媒体文件之后才开始播放以保证不同分段音视频之间的无缝连接.此外,在客户端开始下载之前,必须等待服务器端的编码器和流分割器至少生成一个TS文件,这也会带来潜在的时延.服务器软件将接收到的流每缓存一定时间后包装为一

流媒体技术学习笔记之(四)解决问题video.js 播放m3u8格式的文件,根据官方的文档添加videojs-contrib-hls也不行的原因解决了

源码地址:https://github.com/Tinywan/PHP_Experience 总结: 说明: 测试环境:本测试全部来自阿里云直播和OSS存储点播以及本地服务器直播和点播 播放器:VideoJs 直播: 1.阿里云直播,需要CDN设置HTTP头 2.本地直播需要设置直播访问服务器的头部信息(本地为Nginx) add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-C

流媒体技术学习笔记之(三)Nginx-Rtmp-Module统计某频道在线观看流的客户数

 获得订阅者人数,可以方便地显示观看流的客户数. 查看已经安装好的模块 /usr/local/nginx/sbin/nginx -V 安装从源编译Nginx和Nginx-RTMP所需的工具 sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev 下载Nginx和Nginx-RTMP源码 wget http://nginx.org/download/nginx-1.7.5.tar.gz wget https://g

流媒体技术学习笔记之(七)进阶教程OBS参数与清晰度流畅度的关系

  源码地址:https://github.com/Tinywan/PHP_Experience     很多主播问过OBS的参数到底什么影响画质,到底什么影响流畅度,那么本篇教程尽量用通俗的语言解释下一些重要参数到底是干什么的,自己一定要理解为主,每个主播的电脑.所在的平台.当天的网络状态(注意网络就和马路一样,每天的情况都是不一样的).平台的当天的状态.不同的游戏不一样,合适的参数都不一样.不要羡慕大主播高清流畅的画质,他们也是自己耐心(或者背后有技术团队)调整出来的. 码率 码率在OBS中

流媒体技术学习笔记之(十八)互联网草案HTTP直播流2017年5月

 原文地址:https://tools.ietf.org/html/draft-pantos-http-live-streaming-23 1.HTTP直播流介绍 HTTP实时流媒体提供了一个可靠的,成本效益的手段通过互联网提供连续和长时间的视频.它允许接收器使媒体的比特率适应当前网络条件,以保持不间断播放最好的质量.它支持插页式内容边界.它为媒体加密提供了一个灵活的框架.它可以有效地提供相同内容的多个呈现,例如:音频翻译.它提供了与大规模HTTP的兼容性缓存基础设施以支持向大量受众传递. 自2

流媒体技术学习笔记之(十七)FFmpeg 3.3《希尔伯特》-新版本的亮点

 FFmpeg 3.3"Hilbert",一个新的主要版本的一些亮点: 苹果Pixlet解码器 NewTek SpeedHQ解码器 QDMC音频解码器 PSD(Photoshop Document)解码器 FM屏幕捕获解码器 ScreenPressor解码器 XPM解码器 DNxHR解码器修复了HQX和高分辨率视频 ClearVideo解码器(部分) 16.8和24.0浮点PCM解码器 英特尔QSV加速VP8视频解码 本机Opus编码器 DNxHR 444和HQX编码 (M)JPEG编