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

server/2024/9/23 6:24:08/

Node.js安装:
参考这个
Nodejs安装教程
安装完成之后,记得修改一下npm源:

npm config set registry https://registry.npmmirror.com

下一步,安装node-media-server

npm install node-media-server

参考这个:安装ffmpeg
下一步:创建js脚本 app.js,内容如下:

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

// 推送视频:ffmpeg -re -i 视频名称 -c copy -f flv rtmp://ip:1935/live/STREAM_NAME
// 推送摄像头:ffmpeg -f dshow -i video="USB Video Device" -vcodec libx264 -pix_fmt yuv420p -preset veryfast -f flv rtmp://88.22.10.113:9999/live
// 推送屏幕:ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://ip:1935/live/STREAM_NAME

http://www.ppmy.cn/server/120042.html

相关文章

python sql中带引号字符串(单双引号)转义处理

描述: 最近在爬取数据保存到数据库时,遇到有引号的字符串插入MySQL报错:1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 转义字符串…

地面站通过SSH连接无人机

地面站通过SSH连接无人机 1.启动SSH服务2.远程连接到无人机处理器 一般无人机机载处理器都安装了ssh服务器 1.启动SSH服务 启动SSH sudo systemctl start ssh设置为开机自启动 sudo systemctl enable ssh检查ssh服务状态 sudo systemctl status ssh查询无人机的ip ifconf…

Lucene详解介绍以及底层原理说明

文章目录 什么是Lucene?示意图Lucene 的使用场景:Lucene 的生态系统: 相关概念1. **Document(文档)**2. **Field(字段)**3. **Analyzer(分析器)**4. **Tokenizer(分词器…

kotlin的密封类

引言 密封类是一种特殊的类,它用来表示受限的类继承结构,即一个类只能有有限的几种子类,而不能有任何其他类型的子类。 这不就是JAVA的枚举么。 概念 密封类使用sealed关键字声明, 在Kotlin 1.0中,密封类的所有子…

Camunda流程引擎并发性能优化

文章目录 Camunda流程引擎一、JobExecutor1、工作流程2、主要作用 二、性能问题1、实际场景:2、性能问题描述3、总结 三、优化方案方案一:修改 Camunda JobExecutor 源码以实现租户 ID 隔离方案二:使用 max-jobs-per-acquisition 参数控制上锁…

【YashanDB知识库】数据库获取时间和服务器时间不一致

本文转自YashanDB官网,具体内容可见数据库获取时间和服务器时间不一致 【问题分类】功能使用 【关键字】服务器时间、数据库时间 【问题描述】数据库获取的时间和服务器时间不一致。 【问题原因分析】YashanDB并没有时区的概念,数据库的时间以数据库启…

中间件之RocketMQ

RocketMQ是一个开源的分布式消息队列系统,起源于阿里巴巴集团内部。最初,RocketMQ(前身为Metaq)被设计为满足阿里巴巴集团内部大规模分布式系统下的高吞吐量、低延迟和高可靠性的消息传递需求。随着其在阿里巴巴内部的广泛应用和不…

视频转音频,分享这六种转换操作

视频转音频,随着多媒体技术的发展,人们越来越频繁地需要将视频中的音频部分提取出来单独使用。无论是为了制作播客、获取音乐片段还是其他需求,视频转音频都是一项非常实用的技能。为了让你轻松应对各种场合的需求,下文将为你详细…