使用 Node Media Server 和 FFmpeg 创建直播流应用程序(OBS 作为流媒体)

本文介绍使用 Node Media Server 和 FFmpeg 创建直播流应用程序。直播流媒体由多个部分组成,在详细介绍之前,我先给大家介绍一下该计划的总体情况。

使用 Node Media Server 和 FFmpeg 创建直播流应用程序(OBS 作为流媒体)

如上图,Streamer 将使用 OBS 等流媒体应用程序来获取麦克风和摄像机的输入作为 RTMP 输入。您可以使用 FFMPEG 构建自己的流媒体,但由于 OBS 是开源且免费的,因此目前我对此不太关心。

RTMP 是实时信息传输协议(Real-Time Messaging Protocol)的缩写。它是 Adobe Systems 开发的一种专有协议,用于在服务器和 Flash 播放器之间通过互联网进行音频、视频和数据的高性能传输。RTMP 设计用于提供低延迟通信,通常用于在互联网上流式传输实时视频和音频内容。

下一步是将 RTMP 输入发送到 RTMP 媒体服务器,在我们的方案中,我将使用 Node Media Server 进行此操作。实现过程非常简单。只需按照 Node Media Server npm 软件包提供的文档进行操作即可。

  • 先创建一个名为 app.js 的文件
const NodeMediaServer = require('node-media-server');

const config = {
  rtmp: {
    port: 1935,
    chunk_size: 60000,
    gop_cache: true,
    ping: 30,
    ping_timeout: 60
  },
  http: {
    port: 8000,
    mediaroot: './media',
    allow_origin: '*'
  }
};

var nms = new NodeMediaServer(config)
nms.run();
  • 安装node-media-server包
npm i node-media-server
  • 运行app.js文件
node app.js

你会看到 2 台服务器在运行,一台是 8000 端口的 http 服务器,另一台是 1935 端口的 RTMP 服务器。现在 RTMP 服务器正在接受 RTMP 输入 rtmp://localhost/live/STREAM_NAME 网址。

进入 OBS,在 “设置 “中选择 “流”,然后像这样更改设置。在本例中,流关键字为 STREAM_NAME

使用 Node Media Server 和 FFmpeg 创建直播流应用程序(OBS 作为流媒体)

现在从 OBS 开始流式传输,如果使用 VLC 等播放器,可以使用 rtmp 链接检查来自 OBS 的实时直播。

使用 Node Media Server 和 FFmpeg 创建直播流应用程序(OBS 作为流媒体)

现在,我们要使用之前在系列教程中使用过的视频编码组件,但在这种情况下,Node 媒体服务器软件包本身就支持将实时视频转换为 HLS 和 DASH。

const NodeMediaServer = require('node-media-server');
require('dotenv').config()

const config = {
  rtmp: {
    port: 1935,
    chunk_size: 60000,
    gop_cache: true,
    ping: 30,
    ping_timeout: 60
  },
  http: {
    port: 8000,
    mediaroot: './media',
    allow_origin: '*'
  },
  trans: {
    ffmpeg: process.env.FFMPEG_PATH,
    tasks: [
      {
        app: 'live',
        hls: true,
        hlsFlags: '[hls_time=2:hls_list_size=3:hls_flags=delete_segments]',
        hlsKeep: true, // to prevent hls file delete after end the stream
        dash: true,
        dashFlags: '[f=dash:window_size=3:extra_window_size=5]',
        dashKeep: true // to prevent dash file delete after end the stream
      }
    ]
  }
};

var nms = new NodeMediaServer(config)
nms.run();

为此,我们必须在本地计算机上安装 FFMPEG。如果你和我一样是 Mac 用户,可能会通过 brew 安装。我的安装路径是这样的,我把它保存在一个名为 .env 的文件中。

FFMPEG_PATH = '/opt/homebrew/Cellar/ffmpeg/7.0/bin/ffmpeg'

如果使用 docker,就不必依赖本地安装的 FFMPEG。稍后我会讨论这个问题。

现在,当你运行 app.js 文件并使用 OBS 做同样的事情时,如果你访问这个 URL http://localhost:8000/live/STREAM_NAME/index.mpd,你会看到相同的 feed。这意味着我只需在视频播放器中使用这个 URL,就像我们在之前的教程中所做的那样,你就能看到这个 feed。

录音

如果您查看一下我们为支持 HLS 和 DASH 实时流媒体而新引入的配置,就会发现我们保留了流媒体内容而没有删除。但这并不能保留所有内容,因此我们需要引入另一个组件来完成录制部分。

使用 Node Media Server 和 FFmpeg 创建直播流应用程序(OBS 作为流媒体)

我们将使用之前教程中创建的编码器来完成这项任务,只需将输入改为 rtmp 链接即可。您可以从此处获取此代码:https://github.com/deBilla/bento-encoder

// 之前的代码
const encoder = async () => {
  const inputVideo = "rtmp://localhost/live/STREAM_NAME";
  const outputDirectory = "output_folder";
  const outputDirectoryDash = "output_dash";
  const outputDirectoryFragment = "output_fragment";

  const permissions = 0o777;

  try {
    if (fs.existsSync(outputDirectory)) {
      fs.rmSync(outputDirectory, { recursive: true });
    }

现在,如果运行这个 app.js 和之前的 app.js 并开始流式传输。你会看到,在一天结束时,我们已经录制、编码了全部直播流内容,并准备好稍后提供服务。

以下是直播流项目的 Dockerfile

# 使用官方 Node.js 14 镜像
FROM node:18-alpine3.19 

# 安装 ffmpeg
 RUN apk update && apk add ffmpeg 

# 设置容器中的工作目录
WORKDIR /app 

# 将 package.json 和 package-lock.json 复制到工作目录
COPY package*.json ./ 

# 安装依赖项
RUN npm install 

# 将应用程序代码复制到工作目录
COPY . 。

# 暴露 RTMP 和 HTTP 端口
EXPOSE 1935 8000 

ENV FFMPEG_PATH= '/usr/bin/ffmpeg' 

# 当容器启动时运行 Node-Media-Server
 CMD [ "node" , "app.js" ]

这就是关于直播和录制的内容。在下一个教程中,我们将创建一个与视频流一起使用的实时聊天服务器解决方案。

作者:Dimuthu Wickramanayake

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/48281.html

(0)

相关推荐

发表回复

登录后才能评论