./configure --add-dynamic-module=/xxx/nginx-http-flv-module-master
首先需要在编译nginx时把模块加入,下面的nginx.conf测试正常
user www-data;
worker_processes auto;
pid /run/nginx.pid;
load_module modules/ngx_http_flv_live_module.so;
events {
worker_connections 768;
# multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
server {
listen 2000;
location /flv {
flv_live on;
chunked_transfer_encoding on;
}
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{
expires 1d;
}
location /hls {
types{
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /tmp/hls;
expires -1;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
}
}
}
rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp_socket_dir /tmp;
rtmp {
out_queue 4096;
out_cork 8;
max_streams 128;
timeout 15s;
drop_idle_publisher 15s;
log_interval 5s;
log_size 1m;
server {
listen 1935;
application myapp {
live on;
gop_cache on;
}
application hls {
live on;
hls on;
hls_path /tmp/hls;#推流要推到hls ffmpeg -f video4linux2 -s 640x480 -i /dev/video0 -vcodec libx264 -f flv rtmp://127.0.0.1:11935/hls/my
}
application dash {
live on;
dash on;
dash_path /tmp/dash;
}
}
}
nginx-http-flv-module和node-media-server的核心功能应该是接收rtmp推流,然后多用户转发rtmp和http-flv。hls和dash在此基础上再多一步处理。流中继功能靠ffmpeg。比如用ffmpeg拉rtsp流推到服务器的rtmp端口。目前我认为这两种服务器不能用http推流。播放http-flv的网址参数不太容易理解,作了很多测试才弄明白。
下面是node的app.js
const NodeMediaServer = require('node-media-server');
const config = {
rtmp: {
port: 1935,
chunk_size: 60000,
gop_cache: true,
ping: 60,
ping_timeout: 30
},
http: {
port: 3000,
mediaroot: '/tmp/media',
allow_origin: '*'
},
trans: {
ffmpeg: '/usr/bin/ffmpeg',
tasks: [
{
app: 'myapp',
hls: true,
hlsFlags: '[hls_time=2:hls_list_size=3:hls_flags=delete_segments]',
hlsKeep: true, // to prevent hls file delete after end the stream
dash: true,
dashFlags: '[f=dash:window_size=3:extra_window_size=5]',
dashKeep: true // to prevent dash file delete after end the stream
}
]
}
}
var nms = new NodeMediaServer(config)
nms.run();
//ffmpeg -f video4linux2 -s 640x480 -i /dev/video0 -vcodec libx264 -map 0:v -f flv rtmp://127.0.0.1:1935/myapp/my
//ffmpeg -re -i 文件.mp4 -vcodec copy -acodec copy -f flv rtmp://ip地址/live/01
//ffmpeg -rtsp_transport tcp -i rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4 -vcodec h264 -f flv -an rtmp://nginx服务器ip地址:1985/myapp/test
const NodeMediaServer = require('node-media-server');
const config = {
rtmp: {
port: 1935,
chunk_size: 60000,
gop_cache: true,
ping: 60,
ping_timeout: 30
},
http: {
port: 3000,
mediaroot: '/tmp/media',
allow_origin: '*'
},
relay: {
ffmpeg: '/usr/bin/ffmpeg',
tasks: [
{
app: 'iptv',
mode: 'pull',
edge: 'rtmp://127.0.0.1:11935/myapp',//pull 的时候 edge: 'rtmp://127.0.0.1:11935/myapp' 并且无name 播放rtmp://127.0.0.1:1935/iptv/my
//name: 'hks' //static的时候 edge: 'rtmp://127.0.0.1:11935/myapp/my' 播放rtmp://127.0.0.1:1935/iptv/hks
},
]
}
}
var nms = new NodeMediaServer(config)
nms.run();
下面是测试用的浏览器端flv
<script src="flv.js"></script>
<video id="videoElement" controls ></video>
<script>
if (flvjs.isSupported()) {
var videoElement = document.getElementById('videoElement');
var flvPlayer = flvjs.createPlayer({
type: 'flv',
url: 'http://127.0.0.1:2000/live?port=11935&app=myapp&stream=my'//nginx
//url: 'ws://127.0.0.1:3000/myapp/my.flv'//node
//url: 'http://tvdrs.wsrtv.com.cn:8100/channellive/ch1.flv'
//url: '/flv/video.flv'
});
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load();
//flvPlayer.play();
}
</script>
hls
<script src="hls.js"></script>
<video id="videoElement" controls ></video>
<script>
var video = document.getElementById('videoElement');
var Hls = window.Hls
//var url = 'http://127.0.0.1:3000/myapp/my/index.m3u8'
//url = 'https://pulltv2.wanfudaluye.com/live/tv2.m3u8'
url = 'http://127.0.0.1:2000/hls/my.m3u8'
if (Hls.isSupported()) {
var hls = new Hls()
hls.loadSource(url)
hls.attachMedia(video)
hls.on(Hls.Events.MANIFEST_PARSED, function () {
// video.play()
})
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
video.src = url
video.addEventListener('canplay', function () {
// video.play()
})
}
</script>
dash
<script src="dash.all.min.js"></script>
<video id="videoplayer" controls ></video>
<script>
// var url = 'http://127.0.0.1:3000/myapp/my/index.mpd'
var url = 'https://cdn-shop-lc-01.akamaized.net/Content/DASH_DASH/Live/channel(ott)/master.mpd'
var player = dashjs.MediaPlayer().create();
player.initialize(document.querySelector("#videoPlayer"), url, true);
</script>