推流只能用rtmp協(xié)議,拉流可以使用rtmp協(xié)議和hls協(xié)議。rtmp協(xié)議是adobe公司開(kāi)發(fā)的開(kāi)放協(xié)議,hls是蘋(píng)果公司推出的直播協(xié)議。我們使用nginx的rtmp插件來(lái)搭建推流服務(wù)器
基于nginx的rtmp直播服務(wù)器
安裝加載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模塊,使他們?cè)谕荒夸浵隆?/p>
編譯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; #開(kāi)啟實(shí)時(shí)
hls on; #開(kāi)啟hls
hls_path /usr/local/etc/nginx/html/multimedia/hls; #hls的ts切片存放路徑
hls_fragment 2s; #本地切片長(zhǎng)度
hls_playlist_length 6s; #HLS播放列表長(zhǎng)度
}
}
}
使用rtmp協(xié)議并且監(jiān)聽(tīng)了9999端口,如果我們的推流地址填寫(xiě)的是rtmp://ip:9999/myapp,那么就是純粹的rmtp協(xié)議的流,如果推流地址填寫(xiě)的是rmtp://ip:9999/live,那么推流之后會(huì)在/usr/local/etc/nginx/html/multimedia/hls目錄下生成很多ts格式的視頻切片和一個(gè)m3u8格式的文件,我們想要用http協(xié)議訪問(wèn)這個(gè)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;
}
當(dāng)我們的推流地址填寫(xiě)的是rtmp://ip:9999/live/room1時(shí),使用http://ip:80/live/room1.m3u8就能把rtmp轉(zhuǎn)成hls訪問(wèn)這個(gè)直播流了。
新建文件夾
mkdir -p /usr/local/etc/nginx/html/multimedia/hls/重啟nginx
nginx -s reload
以上就完成了直播服務(wù)器的搭建。

使用video.js在h5播放rtmp
使用obs推流,推流地址可以填寫(xiě)rtmp://ip:9999/myapp或者rtmp://ip:9999/live,如果用的是rtmp://ip:9999/myapp,在h5端播放的時(shí)候會(huì)涉及到h5播放rtmp協(xié)議的問(wèn)題,h5安裝vide.js之后還要額外安裝videojs-flash插件。
video.js版本是7.8.3
安裝好之后在相關(guān)頁(yè)面引入:
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時(shí)依賴flash播放器,所以要打開(kāi)flash,這樣就解決了pc端rtmp協(xié)議直播流的問(wèn)題。
但問(wèn)題是現(xiàn)在流行的是移動(dòng)端直播,而蘋(píng)果就沒(méi)支持過(guò)flash播放器,所以目前正常方法解決不了在移動(dòng)端使用rtmp協(xié)議拉流的問(wèn)題。
移動(dòng)端使用rtmp協(xié)議拉流
因?yàn)樘O(píng)果不支持flash所以使用rtmp拉流肯定是不行的,但是可能客戶給我們的就只有rtmp協(xié)議,那么我們就可以用到上面的另外一個(gè)地址,把rtmp協(xié)議轉(zhuǎn)成hls協(xié)議。
搭建ffmpeg
rtmp轉(zhuǎn)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
這樣當(dāng)客戶給的拉流地址是rtmp://ip:9999/myapp/room1時(shí),可以用ffmpeg 轉(zhuǎn)成http://ip:9999/live/room1.m3u8實(shí)現(xiàn)全平臺(tái)播放了。
但是這樣還有個(gè)問(wèn)題,因?yàn)榭蛻艚o地址的話,用戶拉流是從客戶平臺(tái)上拉,但是如果使用自己的服務(wù)器轉(zhuǎn)了一下的話,那就變成用戶從我們自己的服務(wù)器拉流了,如果用戶比較多的話那帶寬的問(wèn)題就要考慮一下了。