技术选型
直播端:采用 ffmpeg
软件,对视频来源进行推流至服务器端或CDN
播放端:采用 Nginx
服务器解析,利用 nginx-rtmp-module
插件,对视频流进行播放,播放媒介采用 HLS
nginx-rtmp-module
插件地址:
进入 nginx
源码目录,重新编译,加入 rtmp
插件
./configure --add-module=/path/to/nginx-rtmp-module --with-http_ssl_module --with-debugmakemake install
至此,rtmp
模块就配置好了!
FFmpeg
是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。
tar jxvf ffmpeg-3.0.tar.bz2cd ffmpeg-3.0./configure --enable-shared --prefix=/usr/local/ffmpeg --disable-yasmmake (10分钟左右)make install
查看依赖库是否缺失
ldd `which /usr/local/ffmpeg/bin/ffmpeglinux-vdso.so.1 => (0x00007ffeecbf7000)libavdevice.so.57 => not foundlibavfilter.so.6 => not foundlibavformat.so.57 => not foundlibavcodec.so.57 => not foundlibswresample.so.2 => not foundlibswscale.so.4 => not foundlibavutil.so.55 => not foundlibm.so.6 => /lib64/libm.so.6 (0x000000393a800000)libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003939c00000)libc.so.6 => /lib64/libc.so.6 (0x0000003939800000)/lib64/ld-linux-x86-64.so.2 (0x0000003939000000)
将一些依赖的库地址放进去
vim /etc/ld.so.conf/usr/local/ffmpeg/lib //依赖库地址ldconfig //生效
Nginx配置
在原有的 nginx.conf
中加入如下配置
rtmp { server { listen 1935; chunk_size 4000; #HLS # For HLS to work please create a directory in tmpfs (/tmp/app here) # for the fragments. The directory contents is served via HTTP (see # http{} section in config) # # Incoming stream must be in H264/AAC. For iPhones use baseline H264 # profile (see ffmpeg example). # This example creates RTMP stream from movie ready for HLS: # # ffmpeg -loglevel verbose -re -i movie.avi -vcodec libx264 # -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1 # -f flv rtmp://localhost:1935/hls/movie # # If you need to transcode live stream use 'exec' feature. # application hls { live on; hls on; hls_path /usr/local/nginx/html/hls; //你的 nginx 的 html 目录 hls_fragment 5s; } } }
在 http
指令里,加入以下代码
server { listen 8081; location /hls { # Serve HLS fragments types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root html; expires -1; } }
重启 Nginx,让配置生效!
netstat -nlp,查看端口占用情况看看 rtmp 服务和 hls 服务的端口 1935 和 8081 是否都打开了。
开始直播了
接下来,看 rtmp
源的配置
ffmpeg -re -i sample.mp4 -vcodec copy -acodec copy -f flv rtmp://localhost/hls/mystream
根据 nginx.conf
中的 hls_path
配置,这个命令会向192.168.0.1
主机的 /usr/local/nginx/html/hls
下面写入ts
片段和m3u8
文件,参见下面
-rw-r--r-- 1 nobody nobody 1029300 03-08 18:06 mystream-70.ts-rw-r--r-- 1 nobody nobody 940564 03-08 18:06 mystream-71.ts-rw-r--r-- 1 nobody nobody 1758928 03-08 18:06 mystream-72.ts-rw-r--r-- 1 nobody nobody 912552 03-08 18:06 mystream-73.ts-rw-r--r-- 1 nobody nobody 1279340 03-08 18:07 mystream-74.ts-rw-r--r-- 1 nobody nobody 1148116 03-08 18:07 mystream-75.ts-rw-r--r-- 1 nobody nobody 960304 03-08 18:07 mystream-76.ts-rw-r--r-- 1 nobody nobody 2623728 03-08 18:07 mystream-77.ts-rw-r--r-- 1 nobody nobody 257 03-08 18:07 mystream.m3u8
这个目录下的文件会动态刷新,前面写入的 ts
片段会被后面的 ts
片段覆盖。当这个直播流播完后,所有相关的 ts
片段和 m3u8
文件都将被删除。
HLS
HTTP Live Streaming
(缩写是 HLS
)是一个由苹果公司提出的基于HTTP
的流媒体网络传输协议。是苹果公司QuickTime X
和iPhone
软件系统的一部分。它的工作原理是把整个流分成一个个小的基于HTTP
的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8) playlist
文件,用于寻找可用的媒体流。
对比:HLS
只请求基本的HTTP
报文,与实时传输协议(RTP
)不同,HLS
可以穿过任何允许HTTP
数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。
此协议详细内容请参考apple官方网站:
HLS Player
play.html
在线观看