本文介绍使用 Node Media Server 和 FFmpeg 创建直播流应用程序。直播流媒体由多个部分组成,在详细介绍之前,我先给大家介绍一下该计划的总体情况。
如上图,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
现在从 OBS 开始流式传输,如果使用 VLC 等播放器,可以使用 rtmp 链接检查来自 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 实时流媒体而新引入的配置,就会发现我们保留了流媒体内容而没有删除。但这并不能保留所有内容,因此我们需要引入另一个组件来完成录制部分。
我们将使用之前教程中创建的编码器来完成这项任务,只需将输入改为 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