文件
wangchuanli efc80ca1e0 feat: 初始化屏幕播放控制系统
搭建基于 Flask 的多屏幕定时播放控制后端,提供设备管理控制台、播放端页面、媒体上传与配置文件持久化,并补充项目文档、示例配置及 MIT 许可证。
2026-08-24 10:51:18 +08:00

6.9 KiB

屏幕播放控制系统 / 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. 安装

# 克隆仓库(开源后)
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. 运行

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 结构如下(也可通过控制端界面编辑,无需手写):

{
  "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      # 播放端页面

文档导航

  • 用户操作指引:面向展厅介绍员/运维人员的日常使用手册(快速上手、常见场景、状态说明、排错)。
  • 本文档(README):系统介绍、部署与技术说明。

常见问题

Q: 播放端打不开 / 一直「正在初始化」?

  • 确认设备 ID 与 config.json 中一致;
  • 确认访问地址使用的是服务器内网 IP 而非 localhost(localhost 仅本机有效)。

Q: 视频无法自动播放?

  • 部分浏览器禁止有声自动播放,展厅设备建议在系统设置中允许自动播放,或保持浏览器在前台。

Q: 修改配置后播放端没变化?

  • 播放端每 30 秒轮询一次,最多等待 30 秒生效;也可手动刷新播放端页面。

Q: 时间不准确?

  • 播放以播放设备本地系统时间为准,请保证各屏幕设备时间同步(建议开启网络时间同步)。

开源协议

本项目基于 MIT 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:

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.