XteVision Media Server 是什么,适合哪些用户?
XteVision Media Server(xtevision-media-server v1.0.0)是一个本地视频流媒体服务器,从目录树通过网络提供影片和视频文件。它提供一个现代网页界面,可在任何浏览器中浏览、过滤和播放视频——客户端无需安装额外软件。它设计为可由任何企业进行再品牌化并运行。
高层设计和通信流程
┌─────────────────────────────────────────────────────────────────┐
│ 浏览器(现代浏览器) │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────────────────────┐ │
│ │ 视频网格 │ │ 分类 │ │ 视频播放器(HTML5 模态框) │ │
│ │ │ │ 过滤 │ │ + 智能编解码器回退 │ │
│ └──────────┘ └──────────┘ └──────────────────────────────────┘ │
└──────────────────────────────┬──────────────────────────────────┘
│ HTTP/REST API
┌──────────────────────────────┴──────────────────────────────────┐
│ Node.js 服务器 — Express.js(端口 5002) │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌──────────────────┐ │
│ │ /videos │ │ /thumbnail │ │ /video/ │ │ FFmpeg(转码) │ │
│ │ (列表) │ │ (JPEG) │ │ original │ │ H.264 + AAC │ │
│ │ │ │ │ │ /h264 │ │ │ │
│ └───────────┘ └───────────┘ └───────────┘ └──────────────────┘ │
└──────────────────────────────┬──────────────────────────────────┘
│
┌──────────────────────────────┴──────────────────────────────────┐
│ 文件系统(唯一事实来源) │
│ video/ → 文件夹树(分类) │
│ .cache/ → h264/ + thumbnails/ │
└───────────────────────────────────────────────────────────────────┘GET /videos 列出所有文件;GET /thumbnail/... 获取 JPEG;GET /video/original/... 和 GET /video/h264/... 流式传输媒体readdirSync() 在每次 /videos 调用时读取 video/ 目录树XteVision Media Server 设计用于自托管、仅局域网运行:
ffmpeg-static 内嵌前端、后端和基础设施技术
| 层次 | 技术 | 用途 |
|---|---|---|
| 运行时 | Node.js ≥ 18 | 服务器运行时 |
| 服务器 | Express.js | HTTP 服务器 + API 路由 |
| 转码 | fluent-ffmpeg + ffmpeg-static | FFmpeg 控制 + 内嵌二进制 |
| 存储 | 文件系统 | 数据源(video/、.cache/) |
| 前端 | 原生 HTML/CSS/JS | 单页应用,无框架 |
| i18n | 客户端 data-lang-* | EN / DE / ZH 翻译 |
ffmpeg-static 中——无需系统安装。服务器忽略以点(.)开头的文件(例如 Apple Double ._file.mp4)。在您的服务器上运行 XteVision Media Server
# 1. 切换到项目目录
cd /path/to/video_server
# 2. 安装依赖项
npm install
以下包将被安装:
| 包 | 用途 |
|---|---|
| express | HTTP 服务器和路由 |
| fluent-ffmpeg | FFmpeg 控制用于视频转码 |
| ffmpeg-static | FFmpeg 二进制(无需系统安装) |
npm start
# 或: node server.js
服务器将在 http://localhost:5002 上运行。成功启动时的控制台输出:
Using ffmpeg: /path/to/ffmpeg-static
Video server running at http://localhost:5002
nohup node server.js > server.log 2>&1 &
视频目录和支持的格式
所有视频都位于项目目录下的 video/ 文件夹中。结构按客户/项目组织:
video/
├── Anting/
│ ├── anting.mp4
│ ├── biergarten720p.m4v
│ └── tiky_xuyun720p50.mp4
├── Porsche_VW/
├── Deutsche-Schule/
├── prodigy/
│ ├── prodigy_cn.mp4
│ ├── prodigy_de.mp4
│ └── prodigy_en.mp4
└── ...
video/ 的所需子文件夹/videos 调用时重新扫描目录.)开头的文件(例如 Apple Double ._file.mp4)。| 格式 | 扩展名 | MIME 类型 |
|---|---|---|
| MPEG-4 | .mp4 | video/mp4 |
| QuickTime | .mov | video/quicktime |
| MPEG-4 视频 | .m4v | video/x-m4v |
| Matroska | .mkv | video/x-matroska |
| AVI | .avi | video/x-msvideo |
| WebM | .webm | video/webm |
浏览、过滤和播放视频
位于 http://localhost:5002 的网页界面分为三个区域:
localStorage)和主题切换按钮(深色/浅色)点击视频会打开一个叠加播放器:
× 或按下 Esc播放器自动检测浏览器能否原生播放视频:
直接 HTTP 访问数据和媒体
| 接口 | 描述 |
|---|---|
| GET /videos | 以 JSON 数组形式列出所有视频文件 |
| GET /thumbnail/{path} | 返回 JPEG 缩略图;按需生成,然后缓存 24 小时 |
| GET /video/original/{path} | 带 HTTP 范围支持地流式传输原始文件(可在时间线中跳转) |
| GET /video/h264/{path} | 流式传输 H.264 转码版本;首次调用时转码,然后缓存 |
# 列出所有视频
curl http://localhost:5002/videos
# 获取缩略图
curl http://localhost:5002/thumbnail/Anting/anting.mp4
# 流式传输原始文件(带范围支持)
curl http://localhost:5002/video/original/Anting/anting.mp4
# 流式传输 H.264 转码版本
curl http://localhost:5002/video/h264/Anting/anting.mp4
/videos 的示例响应:[
"Anting/anting.mp4",
"Anting/biergarten720p.m4v",
"prodigy/prodigy_cn.mp4"
]
转码、缩略图和缓存管理
当视频无法原生播放时,服务器会将其自动转码为 H.264 + AAC——所有现代浏览器都可以播放的格式。
| 参数 | 值 |
|---|---|
| 视频编解码器 | libx264 |
| 音频编解码器 | aac |
| 像素格式 | yuv420p |
| 配置 | main |
| 预设 | veryfast(快,可接受质量) |
| 质量 | CRF 23 |
| 流式传输 | frag_keyframe+empty_moov(即时播放) |
为减轻服务器负担,缩略图生成会被放入队列,对同一缩略图的并发请求会被合并去重。生成的缩略图位于 .cache/thumbnails/,并在 24 小时内直接提供(Cache-Control: public, max-age=86400)。
.cache/
├── h264/ # H.264 转码视频
└── thumbnails/ # JPEG 缩略图
这两个目录镜像 video/ 的文件夹结构。要清空缓存(例如在更改原始文件后):
# 删除缓存子目录
rm -rf .cache/h264/* .cache/thumbnails/*
# 或删除整个缓存文件夹
rm -rf .cache
常见问题及解决方案
lsof -i :5002 检查,然后结束进程(kill -9 [PID])。Using ffmpeg: undefined 表示 ffmpeg-static 未正确安装——运行 npm install ffmpeg-static。.cache/h264/ 文件夹是否可写。video/ 目录中。含特殊字符的文件名需以 URL 编码形式提供。.cache/thumbnails/ 文件夹是否可写。-ss 2)。