首页 > 编程语言 >利用node+express+node-media-server 实现直播功能

利用node+express+node-media-server 实现直播功能

时间:2022-11-02 17:36:19浏览次数:72  
标签:node ffmpeg media app express flv ip 推送

github.com: https://github.com/whiskyma/node-media-server

参考文献:

1、 https://www.huiyani.com/archives/4703/

2、https://blog.csdn.net/CSDNzhaojiale/article/details/118571451

一、熟悉我们先了解一下直播的具体流程

 

 

通过上图我们可以大致的看到。直播一共分为三个步骤

视频/图像采集
流媒体服务器(做推流和拉流的中转服务器)
拉流/播放
二、具体操作

流媒体服务器搭建
这里我们用的是nodejs+node-media-server来做我们的视频中间件。

你只需要建立一个文件夹,然后在这个文件夹做如下操作:

一、npm i node-media-server下载流媒体服务器包

二、创建一个app.js文件并输入以下内容

三、最后node app.js

服务成功启动之后,也可以在127.0.0.1:8000/admin访问流媒体服务的后台系统。

/**
 *  node .bin/www 启动更改为热启动:nodemon ./bin/www  启动命令:npm start
 **/

const createError = require('http-errors'),
        express = require('express'),
           path = require('path'),
   cookieParser = require('cookie-parser'),
         logger = require('morgan'),
            app = express();
            NodeMediaServer = require('node-media-server');
 
const config = {
    // 接受推过来的流
    rtmp: {
        port: 1935,
        chunk_size: 60000,
        gop_cache: true,
        ping: 30,
        ping_timeout: 60
    },
    // 转发推流的信息
    http: {
        port: 8000,
        allow_origin: '*'
    }
}
var nms = new NodeMediaServer(config);
nms.run();

// 推流工具、通常我们常用ffmpeg这个工具来推流、推给我们的中间件1935端口
// 新建一个命令行选择并输入以下命令开始推送资源(其中的ip就是你电脑自己的ip)

// 推送视频: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

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

 
app.use('/', require('./routes/index'));
app.use('/users', require('./routes/users'));


app.use(function(req, res, next) {
    next(createError(404));
});

app.use(function(err, req, res, next) {
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    res.status(err.status || 500);
    res.render('error');
});

process.env.PORT = 3000; //默认3000端口,可自行更改端口号

module.exports = app;

推流
一、传输的流媒体传输协议

常用的流媒体传输协议有RTMP, RTSP,HLS和HTTP-FLV。

RTMP (可用于推流端和拉流端)
Real Time Messaging Protocol,实时消息传输协议。RTMP协议中,视频必须是H264编码,音频必须是AAC或MP3编码,且多以flv格式封包。因为RTMP协议传输的基本是FLV格式的流文件,必须使用flash播放器才能播放。

RTSP (用于推流端)
Real-Time Stream Protocol,RTSP实时效果非常好,适合视频聊天、视频监控等方向。

HLS (用于拉流端)
Http Live Streaming,由Apple公司定义的基于HTTP的流媒体实时传输协议。传输内容包括两部分:1.M3U8描述文件;2.TS媒体文件。TS媒体文件中的视频必须是H264编码,音频必须是AAC或MP3编码。数据通过HTTP协议传输。目前video.js库支持该格式文件的播放。

HTTP-FLV (用于拉流端)
本协议就是http+flv,将音视频数据封装成FLV格式,然后通过http协议传输到客户端,这个协议大大方便了浏览器客户端播放直播视频流。目前flv.js库支持该格式的文件播放。

二、推流工具

推流我们通过ffmpeg这个工具来进行推流,推给我们的中间件1935端口

下载:brew install ffmpeg

ffmpeg,它是一个用来记录、转换数字音视频,并将其转化为流的开源软件,通过它可以进行视频的采集封装成流,并推送到流媒体服务器,例如在mac上面安装了这个软件之后,可以通过它调用摄像头,并将摄像头数据封装成流后推送到流媒体服务器,这个过程就是推流。ffmpeg还可以推送本地的视频文件到流媒体服务器。

三、具体操作

新建一个命令行选择并输入以下命令开始推送资源(其中的ip就是你电脑自己的ip)

推送视频: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

拉流
新建一个index.html页面来接受推送过来的数据

我们通过flv.js来接受推过来的流量,注意里写的是转发过来的端口号8000端口

前端起一个http-server并访问自己的ip进入index.html页面

<!-- index.html -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title></title>
  </head>
  <body>
    <script src="https://cdn.bootcss.com/flv.js/1.4.0/flv.min.js"></script>
    <video id="videoElement" style="width: 80%" controls="controls"></video>
    <script>
      if (flvjs.isSupported()) {
        var videoElement = document.getElementById('videoElement')
        var flvPlayer = flvjs.createPlayer({
          type: 'flv',
          url: 'http://ip:8000/live/STREAM_NAME.flv'
        })
        flvPlayer.attachMediaElement(videoElement)
        flvPlayer.load()
        flvPlayer.play()
      }
    </script>
  </body>
</html>

总结

推流:ffmpeg

流媒体服务器:nodejs+node-media-server

拉流:flv.js+video

 

github.com: https://github.com/whiskyma/node-media-server

点个赞吧!!!谢谢

标签:node,ffmpeg,media,app,express,flv,ip,推送
From: https://www.cnblogs.com/maqingyuan/p/16851767.html

相关文章

  • Node_exporter+Prometheus+Grafana 安装配置详解
    在进行性能测试时,想直观看到服务器的CPU、内存占用多少,可以搭建prometheus+node_exporter+grafana来实现。通过node_exporter把从服务器(即被监控机器)采集到的信息发到pr......
  • 利用node创建命令行工具
    什么是命令行工具?命令行工具(CmmandLineInterface)简称cli,顾名思义就是在命令行终端中使用的工具。我们常用的git、npm、vim等都是cli工具,比如我们可以通过gitclo......
  • isVnode 判断一个对象是否为 vnode 类型
    functionhasOwn(){returnObject.prototype.hasOwnProperty.call.apply(Object.prototype.hasOwnProperty,arguments)}//判断是否为vnode类型functionisV......
  • 理解NodeJS多进程
    序言一次面试中,我提到自己用过pm2,面试接着问:「那你知道pm2父子进程通信方式吗」。我大概听说pm2有cluster模式,但不清楚父子进程如何通信。面试结束后把NodeJS的多进程重新......
  • QMediaPlayer,setPosition很慢
    self.video_widget=QtMultimediaWidgets.QVideoWidget()self.player=QtMultimedia.QMediaPlayer()self.player.setVideoOutput(self.video_......
  • 记一次node节点无法加入K8S集群
    #问题现象:root@small-virtual-machine:~#kubeadmjoin10.0.0.133:6443--tokend2hyl5.5qt5fzjsdbxm2k5o   --discovery-token-ca-cert-hashsha256:d02674df33b......
  • 界面组件DevExpress WPF v22.1 - 全新升级数据分析功能
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专......
  • 安装node.js教程------深入使用Vue
    教程1、下载nodejs引擎网址:https://nodejs.org/en/download/选择32-bit或者64-bit都行2、下载最新版npm.zip压缩包网址:http://nodejs.org/dist/npm/3、将两者下载在......
  • nvm切换node.js环境工具
    下载地址:https://github.com/coreybutler/nvm-windows/releases使用默认安装目录,不用再单独配置环境变量默认安装目录:C:\Users\jay.star\AppData\Roaming\nvm找到setting......
  • LNK4098 defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:
    C++项目编译时遇到警告LNK4098defaultlib'MSVCRT'conflictswithuseofotherlibs;use/NODEFAULTLIB:library 原因使用多线程调试dll(/MDd)模式时,msvcrtd.lib和......