node-ffmpeg生成直播流

本文深入探讨音视频流媒体技术,包括使用node-media-server搭建媒体流服务器,fluent-ffmpeg进行视频编码解码,实时生成直播视频并转换为m3u8格式,以及解决express跨域问题,为开发者提供全面的音视频处理指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值