推流只能用rtmp协定,拉流能够应用rtmp协定和hls协定。rtmp协定时adobe公司开发的凋谢协定,hls是苹果公司推出的直播协定。咱们应用nginx的rtmp插件来搭建推流服务器
基于nginx的rtmp直播服务器
装置加载nginx-rtmp-module模块的nginx
- 首先下载nginx
- 到 https://github.com/arut/nginx-rtmp-module 下载rtmp模块(git clone https://github.com/arut/nginx-rtmp-module.git)
- 别离解压nginx和rtmp模块,使他们在同一目录下。
- 编译nginx
./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module.1.1.4 --with-http_ssl_module
- make && make install 装置
- 配置rtmp模块
rtmp {
server {
listen 9999;
application myapp {
live on;
}
application live {
live on; #开启实时
hls on; #开启hls
hls_path /usr/local/etc/nginx/html/multimedia/hls; #hls的ts切片寄存门路
hls_fragment 2s; #本地切片长度
hls_playlist_length 6s; #HLS播放列表长度
}
}
}
应用rtmp协定并且监听了9999端口,如果咱们的推流地址填写的是rtmp://ip:9999/myapp
,那么就是纯正的rmtp协定的流,如果推流地址填写的是rmtp://ip:9999/live
,那么推流之后会在/usr/local/etc/nginx/html/multimedia/hls
目录下生成很多ts格局的视频切片和一个m3u8格局的文件,咱们想要用http协定拜访这个m3u8文件就须要再配置http模块。
- 配置http模块
location /live {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /usr/local/etc/nginx/html/multimedia/hls/;
add_header Cache-Control no-cache;
}
当咱们的推流地址填写的是rtmp://ip:9999/live/room1
时,应用http://ip:80/live/room1.m3u8
就能把rtmp转成hls拜访这个直播流了。
- 新建文件夹
mkdir -p /usr/local/etc/nginx/html/multimedia/hls/
- 重启nginx
nginx -s reload
以上就实现了直播服务器的搭建。
应用video.js在h5播放rtmp
应用obs推流,推流地址能够填写rtmp://ip:9999/myapp
或者rtmp://ip:9999/live
,如果用的时rtmp://ip:9999/myapp
,在h5端播放的时候会波及到h5播放rtmp协定的问题,h5装置vide.js之后还要额定装置videojs-flash插件。
video.js版本是7.8.3
装置好之后在相干页面引入:
import videojs from 'video.js';
import "videojs-flash"
import 'video.js/dist/video-js.css'
而后初始化videojs即可:
player = videojs("myVideo", {
poster: baseUrl + '/file/download?file_id='+that.props.videos.foreImg,
controls: true,
preload: 'auto',
// fluid:false,
fill: true,
playsinline: true,
languages: 'en',
suppressNotSupportedError: false,
sources: that.props.videos.url,
techOrder: ['flash', 'html5']
})
在pc端播放rtmp时依赖flash播放器,所以要关上flash,这样就解决了pc端rtmp协定直播流的问题。
但问题是当初风行的时挪动端直播,而苹果就没反对过flash播放器,所以目前失常办法解决不了在挪动端应用rtmp协定拉流的问题。
挪动端应用rtmp协定拉流
因为苹果不反对flash所以应用rtmp拉流必定是不行的,然而可能客户给咱们的就只有rtmp协定,那么咱们就能够用到下面的另外一个地址,把rtmp协定转成hls协定。
搭建ffmpeg
rtmp转flv
ffmpeg -re -i rtmp://ip:9999/myapp/room1
-vcodec libx264 -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://ip:9999/live/room1
这样当客户给的拉流地址是rtmp://ip:9999/myapp/room1
时,能够用ffmpeg 转成http://ip:9999/live/room1.m3u8
实现全平台播放了。
然而这样还有个问题,因为客户给地址的话,用户拉流是从客户平台上拉,然而如果应用本人的服务器转了一下的话,那就变成用户从咱们本人的服务器拉流了,如果用户比拟多的话那带宽的问题就要考虑一下了。