一、node-media-server 媒体流服务器
//媒体流服务器
const NodeMediaServer = require('node-media-server');
const config = {
rtmp: {
port: 1940,
chunk_size: 60000,
gop_cache: true,
ping: 60,
ping_timeout: 30
},
http: {
port: 8001,
allow_origin: '*'
}
};
var nms = new NodeMediaServer(config)
//启动
nms.run();
二、fluent-ffmpeg 视频编码解码
const ffmpeg = require('fluent-ffmpeg');
//input 文件的路径
new ffmpeg().input(fs.createReadStream('D:\\node-project\\express\\myapp03\\ffluent\\1.avi'))
.inputFPS(25) //输出的帧率
.noAudio() //完全禁用音频
.size("640x?") //自动设置固定宽度和计算高度
.aspect('4:3') //设置输出帧纵横比
.format('flv') //输出格式
// 此处的 /live/camera, camera类似于一个房间的概念, 你可以设置为你想要的名字
//该地址必须跟媒体流服务器地址相同,否则可能推不上去。
.save('rtmp://172.18.2.4:1940/live/livestream99')
.on('start', function (e) {
console.log('stream is start: ' + e)
})
.on('end', function () {
console.log('ffmpeg is end6666')
console.log('ffmpeg is end')
})
.on('error', function (err) {
console.log('ffmpeg is error! ' + err)
})
三、不断写入流数据,生成直播视频(rtmp)
//生成一个可读写的流
const {Transform} = require('stream');
const upperCase = new Transform({
transform(chunk, encoding, callback) {
this.push(chunk);
callback();
}
});
//每一秒钟写入一个图片
setInterval(()=>{
upperCase ('图片')
},1000)
const ffmpeg = require('fluent-ffmpeg');
ffmpeg(upperCase)
.noAudio()
.format('flv')
.size("640x?")
.aspect('4:3')
.format('hls') //设置输出格式
.outputFPS(20)
// 此处的 /live/camera, camera类似于一个房间的概念, 你可以设置为你想要的名字,要保存的地址
.save('rtmp://172.18.2.4:1940/live/livestream')
.on('start', function (e) {
console.log('stream is start: ' + e)
})
.on('end', function () {
console.log('ffmpeg is end6666')
console.log('ffmpeg is end')
})
.on('error', function (err) {
console.log('ffmpeg is error! ' + err)
})
四、 rstp/rtmp 生成m3u8 m3u8其实就是本地存了一小段视频,能够实现h5秒开
ffmpeg('rtmp://58.200.131.2:1935/livetv/cctv3')
.addOptions([
'-c copy', //视频不会转码 原样复制出来
'-f hls' , //切片 相当于format(hls)
// '-segment_time 5', //每五秒切片一次
'-hls_time 10', //每片的长度
'-hls_list_size 6',//:设置m3u8文件播放列表保存的最多条目,设置为0会保存有所片信息,默认值为5,一般用于直播流,点播文件建议设置成0,即全部保存。
'-hls_wrap 10' ///设置多少片之后开始覆盖,如果设置为0则不会覆盖,默认值为0.
])
.on('start', function (e) {
console.log('stream is start: ' + e)
})
.on('end', function () {
console.log('ffmpeg is end6666')
console.log('ffmpeg is end')
})
.on('error', function (err) {
console.log('ffmpeg is error! ' + err)
})
.on('progress ', function (progress ) {
console.log('ffmpeg is error! ' + err)
})
//output 输出地址
.output('D:\\node-project\\express\\myapp03\\ffmpegtom3u8\\hls\\test.m3u8').run()
五、不断写入的流转m3u8
同理 创建写入流即可
六、express 关于转m3u8跨域问题
const Express = require('express');
const path = require('path');
const body_parser = require('body-parser');
const api = Express();
let options = {
setHeaders: function (res, path, stat) {
res.set('Access-Control-Allow-Origin', '*')
//静态文件同样存在跨域,所以需要设置一下 optionss
api.use(Express.static(path.join(__dirname, 'public'),options));