# douyin **Repository Path**: llhelei/douyin ## Basic Information - **Project Name**: douyin - **Description**: 网页直播弹幕插件与管理 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-01-13 - **Last Updated**: 2026-02-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README l'l'l'l'l'l'l'l'l'l'l'l'l'l'l'l啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦llllllllllllllllllll'l'l'l'l'l'l'l'l'l'l'l'l'l'l'l'l'l'lll# 视频文件使用说明 ## 本地视频文件 请将年会直播视频文件放置在此目录中,系统会自动加载:lll ### 推荐的视频文件名(按优先级): 1. **live.mp4** - 主要直播视频(推荐) 2. **background.mp4** - 背景视频(备用) ### 视频格式要求: - 格式:MP4 (H.264编码) - 分辨率:1920x1080 (1080p) 或 1280x720 (720p) - 时长:循环播放,建议 30秒 - 5分钟 - 文件大小:建议 < 100MB 以便快速加载 ## 如何获取视频: ### 选项1:下载示例视频 1. 访问免费视频网站下载: - https://www.pexels.com/videos/ - https://pixabay.com/videos/ - https://www.videezy.com/ 2. 搜索关键词:"party", "celebration", "abstract", "background" 3. 下载 MP4 格式视频 4. 重命名为 `live.mp4` 并放到此目录 ### 选项2:使用年会现场视频 1. 将年会现场拍摄的视频剪辑 2. 导出为 MP4 格式 3. 重命名为 `live.mp4` 并放到此目录 ### 选项3:创建渐变背景视频 1. 使用视频编辑软件创建纯色或渐变背景 2. 添加年会文字(如"2024年会盛典") 3. 导出为 MP4 格式 ## 默认行为 如果没有本地视频文件,系统会尝试使用在线备用视频源。 如果所有视频都无法加载,会显示年会直播的静态海报。 ## 注意事项 - 视频文件名必须完全匹配 - 视频路径区分大小写(在 Linux 服务器上) - 建议使用短时循环视频以减少加载时间 - 确保视频编码为 H.264 以保证兼容性 # Windows服务器SRT流播放到screen页面的详细安装指南 ## 1. 环境准备 ### 1.1 安装Node.js 1. 访问 [Node.js官网](https://nodejs.org/) 2. 下载LTS版本(推荐18.x或更高版本) 3. 以管理员身份运行安装程序,勾选"Add to PATH" 4. 验证安装: ```cmd node -v npm -v ``` ### 1.2 安装FFmpeg 1. 访问 [FFmpeg官网](https://ffmpeg.org/download.html) 2. 下载Windows版Static build 3. 解压到 `C:\ffmpeg` 4. 将 `C:\ffmpeg\bin` 添加到系统PATH环境变量 5. 验证安装: ```cmd ffmpeg -version ``` ## 2. 项目结构创建 ### 2.1 创建项目目录 ```cmd mkdir C:\srt-player cd C:\srt-player mkdir server public ``` ### 2.2 初始化Node.js项目 ```cmd cd C:\srt-player npm init -y ``` ## 3. 安装项目依赖 ### 3.1 安装Express和WebSocket库 ```cmd npm install express ws cors ``` ### 3.2 安装开发依赖(可选) ```cmd npm install -g nodemon pm2 ``` ## 4. 创建服务端文件 ### 4.1 创建SRT转HLS服务 (server\srt-proxy.js) ```javascript const express = require('express'); const WebSocket = require('ws'); const http = require('http'); const path = require('path'); const fs = require('fs'); const { spawn } = require('child_process'); const app = express(); const server = http.createServer(app); const wss = new WebSocket.Server({ server }); // 服务静态文件 app.use(express.static(path.join(__dirname, '../public'))); // 存储WebSocket连接 let activeConnections = []; wss.on('connection', (ws, req) => { console.log('New client connected'); activeConnections.push(ws); // 发送初始配置 ws.send(JSON.stringify({ type: 'init', config: { srtUrl: 'srt://srt-pull-txnj.njyqkj0ksyz.cc:8100?streamid=784100_645828037076643848&zbid=784100&tpid=36074496' } })); ws.on('close', () => { console.log('Client disconnected'); activeConnections = activeConnections.filter(conn => conn !== ws); }); ws.on('error', (err) => { console.error('WebSocket error:', err); }); }); // 启动FFmpeg将SRT转换为HLS function startSRTConversion() { const srtUrl = 'srt://srt-pull-txnj.njyqkj0ksyz.cc:8100?streamid=784100_645828037076643848&zbid=784100&tpid=36074496'; const outputPath = path.join(__dirname, '../public/streams'); // 确保输出目录存在 if (!fs.existsSync(outputPath)) { fs.mkdirSync(outputPath, { recursive: true }); } const ffmpegArgs = [ '-i', srtUrl, '-c:v', 'libx264', '-preset', 'veryfast', '-tune', 'zerolatency', '-c:a', 'aac', '-f', 'hls', '-hls_time', '2', '-hls_list_size', '5', '-hls_flags', 'delete_segments', '-hls_segment_filename', path.join(outputPath, 'segment_%03d.ts'), path.join(outputPath, 'playlist.m3u8') ]; const ffmpeg = spawn('ffmpeg', ffmpegArgs); ffmpeg.stdout.on('data', (data) => { console.log(`FFmpeg stdout: ${data}`); }); ffmpeg.stderr.on('data', (data) => { console.error(`FFmpeg stderr: ${data}`); }); ffmpeg.on('close', (code) => { console.log(`FFmpeg process exited with code ${code}`); if (code !== 0) { console.log('Restarting FFmpeg...'); setTimeout(startSRTConversion, 5000); // 5秒后重启 } }); return ffmpeg; } // 启动SRT到HLS的转换 const ffmpegProcess = startSRTConversion(); const PORT = process.env.PORT || 3000; server.listen(PORT, () => { console.log(`SRT Proxy Server running on port ${PORT}`); console.log(`Stream URL: http://localhost:${PORT}/streams/playlist.m3u8`); }); // 处理程序退出 process.on('SIGINT', () => { console.log('Shutting down server...'); if (ffmpegProcess) { ffmpegProcess.kill(); } process.exit(0); }); ``` ### 4.2 创建API服务 (server\api-server.js) ```javascript const express = require('express'); const path = require('path'); const app = express(); // 提供HLS流的访问 app.use('/streams', express.static(path.join(__dirname, '../public/streams'))); // 提供主页面 app.get('/', (req, res) => { res.sendFile(path.join(__dirname, '../public/screen.html')); }); const PORT = process.env.PORT || 8080; app.listen(PORT, () => { console.log(`API Server running on port ${PORT}`); }); ``` ## 5. 修改screen.html页面 ### 5.1 替换完整的screen.html内容 ```html