1. 项目概述
最近在开发一个需要实时直播功能的项目,经过多方调研,最终选择了Node.js + FFmpeg + flv.js这套技术方案。这套方案最大的优势就是简单高效,从零开始搭建一个完整的直播系统只需要10分钟左右,而且支持多种直播场景,包括文件直播、摄像头直播、桌面直播和画中画直播。
作为一名全栈开发者,我特别喜欢这种轻量级的解决方案。后端用Node.js只需要十几行代码就能搭建RTMP服务,前端用flv.js实现浏览器无插件播放,而FFmpeg则负责各种复杂的音视频处理工作。这种组合既保持了开发的灵活性,又能满足专业级的直播需求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 整体架构设计
整个直播系统由三个核心组件构成:
- 推流端:使用FFmpeg进行音视频采集和编码,支持多种输入源(文件、摄像头、桌面等),输出RTMP流
- 服务端:基于Node.js的node-media-server,接收RTMP流并转换为HTTP-FLV流
- 播放端:使用flv.js在浏览器中播放FLV格式的视频流
这种架构的优势在于:
- 低延迟:RTMP+FLV组合可以实现1-3秒的延迟
- 兼容性好:不需要浏览器插件,主流浏览器都能支持
- 资源占用低:服务端处理简单,单机可以支持大量并发
2.2 核心组件选型
2.2.1 node-media-server
选择node-media-server作为服务端核心有以下几个原因:
- 轻量级:纯JavaScript实现,不需要额外依赖
- 功能完整:支持RTMP输入和HTTP-FLV输出
- 配置简单:几行代码就能启动服务
- 性能优秀:基于Node.js的事件驱动模型,高并发表现好
2.2.2 flv.js
flv.js是B站开源的FLV播放器,它的优势包括:
- 纯前端实现:不需要Flash等插件
- 低延迟:支持HTTP-FLV直播流
- 兼容性好:基于Media Source Extensions API
- 功能丰富:支持自动重连、错误恢复等特性
2.2.3 FFmpeg
FFmpeg是音视频处理的瑞士军刀,我们选择它是因为:
- 功能强大:支持几乎所有音视频格式和操作
- 跨平台:Windows/Linux/macOS都能运行
- 灵活配置:通过命令行参数可以精确控制各种处理流程
3. 服务端实现
3.1 环境准备
首先需要安装Node.js环境,建议使用LTS版本(如16.x或18.x)。然后创建一个新的项目目录,初始化npm:
bash复制mkdir live-stream-server
cd live-stream-server
npm init -y
3.2 安装依赖
安装核心依赖node-media-server:
bash复制npm install node-media-server
3.3 服务端代码实现
创建一个server.js文件,添加以下代码:
javascript复制const NodeMediaServer = require('node-media-server');
const config = {
rtmp: {
port: 1935, // RTMP服务端口
chunk_size: 60000, // 分块大小
gop_cache: true, // 启用GOP缓存
ping: 30, // 心跳间隔(秒)
ping_timeout: 60 // 心跳超时(秒)
},
http: {
port: 8000, // HTTP服务端口
allow_origin: '*' // 允许跨域
}
};
const nms = new NodeMediaServer(config);
nms.run();
console.log('RTMP推流地址: rtmp://localhost:1935/live/stream');
console.log('HTTP-FLV拉流地址: http://localhost:8000/live/stream.flv');
这段代码做了以下几件事:
- 导入node-media-server模块
- 配置RTMP和HTTP服务参数
- 创建并启动媒体服务器
- 输出推流和拉流地址
3.4 服务启动与测试
启动服务:
bash复制node server.js
服务启动后,会输出RTMP推流地址和HTTP-FLV拉流地址。此时服务端已经准备就绪,等待推流端连接。
4. 播放端实现
4.1 前端页面结构
创建一个index.html文件,添加以下代码:
html复制<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Node.js直播演示</title>
<script src="https://cdn.jsdelivr.net/npm/flv.js@latest/dist/flv.min.js"></script>
</head>
<body>
<video id="videoElement" width="640" height="360" controls autoplay></video>
<script>
if (flvjs.isSupported()) {
const videoElement = document.getElementById('videoElement');
const flvPlayer = flvjs.createPlayer({
type: 'flv',
isLive: true,
