使用 Node Media Server 和 FFmpeg 创建直播流,推送本地视频

Node.js安装:

参考这个
Nodejs安装教程

安装完成之后,记得修改一下npm源:

javascript 复制代码
npm config set registry https://registry.npmmirror.com

下一步,安装node-media-server

javascript 复制代码
npm install node-media-server

参考这个:安装ffmpeg

下一步:创建js脚本 app.js,内容如下:

javascript 复制代码
const fs = require('fs');
const path = require('path');
const spawn = require('child_process').spawn;
const async = require('async');
const NodeMediaServer = require('node-media-server');

// 创建node-media-server实例
const nmsConfig = {
    rtmp: {
        port: 9999,
        chunk_size: 60000,
        gop_cache: true,
        ping: 60,
        ping_timeout: 30
    },
    http: {
        port: 8000,
        mediaroot: './media',
        allow_origin: '*'
    }
};
const nms = new NodeMediaServer(nmsConfig);
nms.run();

// 根据指定的目录和文件类型创建要推流的文件列表
const videoDir = 'E:\Build';
const allowedExtensions = ['.mp4', '.avi', '.mov'];

const fileList = [];
fs.readdirSync(videoDir).forEach(file => {
    const fileExtension = path.extname(file);
    if (allowedExtensions.includes(fileExtension)) {
        fileList.push(path.join(videoDir, file));
    }
});

if (!fileList.length) {
    console.log('No video files found!');
    process.exit(1);
}

// 配置FFmpeg推流命令行参数
const ffmpegCommand = `ffmpeg -re -stream_loop -1 -i "$input$"  -c copy -f flv "$output$"`;
const ffmpegEscapeMap = { '$input$': '', '$output$': '' };

let index = 0;
const maxIndex = fileList.length - 1;

async.each(fileList, (videoPath, callback) => {
    // 构建FFmpeg命令行参数
    ffmpegEscapeMap['$input$'] = videoPath;
    // node-media-server IP即可,无需填写端口默认端口1935 服务端获取的RTMP流也是这个地址
    ffmpegEscapeMap['$output$'] = `rtmp://88.22.10.113:9999/live/test`;
    const output = `rtmp:88.22.10.113:9999/live/test`;
    const command = ffmpegCommand.replace(/\$\w+\$/g, m => ffmpegEscapeMap[m]);
    console.log(`Starting streaming for file: ${videoPath}...`);

    // 调用FFmpeg推流
    const ffProcess = spawn("ffmpeg"
        ,['-re','-stream_loop','-1','-i',videoPath,'-c','copy','-f','flv',output]
        , { detached: true });

    // 捕捉事件
    ffProcess.on('exit', () => {
        console.log(`Stop streaming for file: ${videoPath}.`);
        if (++index > maxIndex) {
            index = 0; // 循环推流
        }
    });
    ffProcess.on('close', code => {
        console.log(`Process ${path.parse(videoPath).name} exited with code ${code}`);
        if (++index > maxIndex) {
            index = 0; // 循环推流
        }
    });

    ffProcess.stderr.on('data', (data) => {
        console.log(`${videoPath}: ${data.toString()}`);
    });

    callback();
})
console.log(`Started pushing ${fileList.length} stream(s) to node-media-server on rtmp://88.22.10.113:9999/live/.`);

,记得修改里面的videoDir以及ip地址。

最后node app.js,至此已经推流成功。

测试:安装vlc播放器,然后播放网络流,地址:rtmp://88.22.10.113:9999/live/test,记得修改IP

javascript 复制代码
// 推送视频:xm0525$ ffmpeg -re -i 视频名称 -c copy -f flv rtmp://ip:1935/live/STREAM_NAME
// 推送摄像头:ffmpeg -f avfoundation -video_size 640x480 -framerate 30 -i 0:0 -vcodec libx264 -preset veryfast -f flv rtmp://ip:1935/live/STREAM_NAME
// 推送屏幕:ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://ip:1935/live/STREAM_NAME
相关推荐
AI服务老曹4 小时前
架构师视角:如何构建支持GB28181/RTSP的异构AI视频平台?从Docker部署到源码交付的深度实践
人工智能·docker·音视频
yantaohk5 小时前
一键下载微信视频号所有页面视频,支持批量下载、加密视频解密、自动去重
网络·微信·音视频
EasyGBS8 小时前
国标GB28181视频平台EasyGBS解决多格式视频流无缝转换难题
ffmpeg·音视频
byte轻骑兵10 小时前
【LE Audio】CAP精讲[2]: 三大角色+服务映射,CAP配置核心流程全拆解
人工智能·音视频·le audio·低功耗音频·蓝牙通话
非凡ghost13 小时前
视频下载神器:直播回放、视频链接一键抓取,还能自动监听!
java·前端·javascript·音视频
做萤石二次开发的哈哈14 小时前
萤石×广联达 | 智能视觉融合数字建造,让工地更透明、更安全
人工智能·安全·音视频·智能硬件
小短腿的代码世界1 天前
QtAV音视频播放实战深度解析:从零构建高性能跨平台播放器
qt·音视频
树下水月1 天前
关于使用ffmpeg的一些使用方法
ffmpeg
憧憬成为原神糕手1 天前
FFmpeg 音视频开发笔记(一):H.264 解码为 YUV
笔记·ffmpeg·音视频
ai产品老杨1 天前
突破品牌壁垒:基于 GB28181 与 RTSP 的异构 AI 视频平台架构深度解析(支持 Docker 与源码交付)
人工智能·架构·音视频