feat: 初始化屏幕播放控制系统

搭建基于 Flask 的多屏幕定时播放控制后端,提供设备管理控制台、播放端页面、媒体上传与配置文件持久化,并补充项目文档、示例配置及 MIT 许可证。
这个提交包含在:
2026-08-24 10:51:18 +08:00
当前提交 efc80ca1e0
共修改 11 个文件,包含 1172 行新增和 0 行删除
+212
查看文件
@@ -0,0 +1,212 @@
# 屏幕播放控制系统 / Screen Controller
> 一个轻量级的展厅多屏幕定时播放控制系统,方便展厅介绍员通过 Web 控制台统一管理多台显示屏的定时图片/视频播放。
A lightweight, web-based multi-screen scheduled playback control system for exhibition halls. It lets presenters centrally manage scheduled image/video playback across multiple displays from a single control console.
---
## 功能特性
- **多设备管理**:在一台控制端集中管理多块屏幕(设备),每块屏幕对应一个独立播放列表。
- **定时播放**:为每条内容设置开始时间,播放端到点自动切换;支持图片(可设展示秒数)与视频。
- **可视化控制台**:无需手改 JSON,通过网页即可新增/删除设备、编辑播放列表、上传媒体文件。
- **媒体库**:支持在控制台直接上传图片/视频,并一键插入到播放列表。
- **局域网部署**:默认监听 `0.0.0.0`,展厅内任意设备(电脑、电视盒子、平板)通过浏览器访问播放端即可。
- **实时轮询**:播放端每 30 秒从服务端拉取最新配置,改完即生效,无需刷新。
---
## 系统架构
```
控制端 (浏览器) ──HTTP──> Flask 服务 <──HTTP── 播放端 (各屏幕浏览器)
/ | config.json /player?device_id=xx
管理设备/播放列表/上传 媒体文件 (static/)
```
- **控制端** `/`:展厅介绍员使用的管理页面。
- **播放端** `/player?device_id=xxx`:部署在每块屏幕的浏览器上,按配置定时播放。
- **数据** `config.json`:设备与播放列表的持久化存储。
- **媒体** `static/`:图片与视频文件存放目录。
---
## 快速开始
### 1. 环境要求
- Python 3.8+
- 支持现代浏览器的播放设备(建议 Chrome / Edge)
### 2. 安装
```bash
# 克隆仓库(开源后)
git clone <your-repo-url>
cd screen_controller
# 创建虚拟环境(可选但推荐)
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装依赖
pip install -r requirements.txt
```
### 3. 运行
```bash
python main.py
```
启动后控制台会输出访问地址,默认:
- 控制端: `http://0.0.0.0:5000/`
- 播放端示例: `http://<服务器IP>:5000/player?device_id=d1`
> 局域网内其他设备请使用**服务器的内网 IP**(如 `http://192.168.1.100:5000/`)访问。
### 4. 环境变量(可选)
可通过环境变量自定义监听配置(参见 `.env.example`):
| 变量 | 说明 | 默认值 |
| --- | --- | --- |
| `HOST` | 监听地址,`0.0.0.0` 允许局域网访问 | `0.0.0.0` |
| `PORT` | 监听端口 | `5000` |
| `FLASK_DEBUG` | 调试模式,`1` 开启 | `0` |
---
## 使用说明
### 控制端
1. 打开 `http://<服务器IP>:5000/`,左侧为设备列表。
2. 点击「+ 新增」创建设备,填写设备名称与 ID。
3. 在「播放列表」中添加条目:
- **类型**:图片 / 视频
- **路径**:媒体文件在 `static/` 下的访问路径,如 `/static/video1.mp4`
- **开始时间**:该内容开始播放的时间
- **时长(秒)**:仅对图片有效,默认 10 秒
4. 「媒体库」区域可直接上传本地图片/视频,上传后点击「使用」即可插入到播放列表。
5. 点击「保存」后配置立即生效,播放端会在 30 秒内自动更新。
### 播放端
在每块屏幕上用浏览器打开对应的播放端地址,例如:
```
http://<服务器IP>:5000/player?device_id=d1
```
建议将播放端浏览器设为**全屏**(F11)。播放端会:
- 按各条目 `start_time` 倒计时到点播放;
- 视频播完后自动切换到下一条;
- 图片按 `duration` 秒数展示后切换;
- 每 30 秒拉取最新配置,后台修改无需人工刷新。
---
## 配置文件格式
`config.json` 结构如下(也可通过控制端界面编辑,无需手写):
```json
{
"devices": [
{
"id": "d1",
"name": "主屏幕",
"playlist": [
{
"type": "image",
"path": "/static/image1.png",
"start_time": "2024-11-21T16:32:10",
"duration": 10
},
{
"type": "video",
"path": "/static/video1.mp4",
"start_time": "2024-11-21T16:55:00"
}
]
}
]
}
```
| 字段 | 说明 |
| --- | --- |
| `devices[].id` | 设备唯一标识,播放端 URL 中 `device_id` 对应此值 |
| `devices[].name` | 设备显示名称 |
| `devices[].playlist[].type` | `image` 或 `video` |
| `devices[].playlist[].path` | 媒体文件访问路径(位于 `static/` 下) |
| `devices[].playlist[].start_time` | 开始播放时间(ISO 8601,本地时间) |
| `devices[].playlist[].duration` | 图片展示秒数(视频忽略) |
---
## 目录结构
```
screen_controller/
├── main.py # Flask 后端服务
├── config.json # 设备与播放列表配置
├── requirements.txt # Python 依赖
├── .env.example # 环境变量示例
├── static/ # 媒体文件存放目录(图片/视频)
└── templates/
├── index.html # 控制端页面
└── player.html # 播放端页面
```
---
## 文档导航
- [用户操作指引](./用户操作指引.md):面向展厅介绍员/运维人员的日常使用手册(快速上手、常见场景、状态说明、排错)。
- 本文档(README):系统介绍、部署与技术说明。
---
## 常见问题
**Q: 播放端打不开 / 一直「正在初始化」?**
- 确认设备 ID 与 `config.json` 中一致;
- 确认访问地址使用的是服务器**内网 IP** 而非 `localhost`(localhost 仅本机有效)。
**Q: 视频无法自动播放?**
- 部分浏览器禁止有声自动播放,展厅设备建议在系统设置中允许自动播放,或保持浏览器在前台。
**Q: 修改配置后播放端没变化?**
- 播放端每 30 秒轮询一次,最多等待 30 秒生效;也可手动刷新播放端页面。
**Q: 时间不准确?**
- 播放以**播放设备本地系统时间**为准,请保证各屏幕设备时间同步(建议开启网络时间同步)。
---
## 开源协议
本项目基于 [MIT License](./LICENSE) 开源,可自由用于学习、商用与二次开发,请保留版权声明。
---
## English
**Screen Controller** is a lightweight web system for scheduling image/video playback across multiple screens in an exhibition hall.
- **Console** (`/`): manage devices, playlists, and upload media via a web UI.
- **Player** (`/player?device_id=xxx`): runs on each screen's browser and plays content by schedule.
- **Backend**: Flask serves config from `config.json` and media from `static/`.
Quick start:
```bash
pip install -r requirements.txt
python main.py
```
Then open `http://<server-ip>:5000/` for the console, and `http://<server-ip>:5000/player?device_id=d1` on each display. Licensed under the MIT License.