浏览代码

update code

yb 1 月之前
当前提交
41cc2db721
共有 7 个文件被更改,包括 332 次插入0 次删除
  1. 8 0
      .gitignore
  2. 120 0
      README.md
  3. 34 0
      config/stream.env.example
  4. 17 0
      scripts/list-devices.sh
  5. 13 0
      scripts/stop-stream.sh
  6. 74 0
      scripts/stream-camera.sh
  7. 66 0
      scripts/stream-screen.sh

+ 8 - 0
.gitignore

@@ -0,0 +1,8 @@
+# 配置文件(包含敏感信息)
+config/stream.env
+
+# macOS
+.DS_Store
+
+# 日志
+*.log

+ 120 - 0
README.md

@@ -0,0 +1,120 @@
+# TG Live Game Stream Service
+
+Mac 摄像头/屏幕推流到 Cloudflare Stream 的脚本工具。
+
+## 前置要求
+
+### 安装 FFmpeg
+
+```bash
+brew install ffmpeg
+```
+
+### 获取推流地址
+
+1. 打开 `tg-live-game-web` 前端
+2. 进入 **Cloudflare Stream → 直播管理**
+3. 点击 **创建直播**
+4. 获取 **RTMPS 推流地址** 和 **推流密钥**
+
+## 快速开始
+
+### 1. 配置推流参数
+
+```bash
+# 复制配置文件
+cp config/stream.env.example config/stream.env
+
+# 编辑配置,填入推流密钥
+vim config/stream.env
+```
+
+### 2. 查看可用设备
+
+```bash
+chmod +x scripts/*.sh
+./scripts/list-devices.sh
+```
+
+输出示例:
+```
+[AVFoundation indev @ 0x...] [0] FaceTime HD Camera
+[AVFoundation indev @ 0x...] [1] Capture screen 0
+[AVFoundation indev @ 0x...] [0] MacBook Pro Microphone
+```
+
+### 3. 开始推流
+
+**摄像头推流:**
+```bash
+./scripts/stream-camera.sh
+```
+
+**屏幕推流:**
+```bash
+./scripts/stream-screen.sh
+```
+
+### 4. 停止推流
+
+按 `Ctrl+C` 或运行:
+```bash
+./scripts/stop-stream.sh
+```
+
+## 配置说明
+
+| 参数 | 说明 | 推荐值 |
+|------|------|--------|
+| `RTMP_URL` | 推流地址 | `rtmps://live.cloudflare.com:443/live` |
+| `STREAM_KEY` | 推流密钥 | 从 Cloudflare 获取 |
+| `VIDEO_DEVICE` | 摄像头编号 | `0` |
+| `AUDIO_DEVICE` | 麦克风编号 | `0` |
+| `RESOLUTION` | 分辨率 | `1280x720` |
+| `FPS` | 帧率 | `30` |
+| `BITRATE` | 视频码率 | `2500k` |
+
+## 推荐码率
+
+| 分辨率 | 帧率 | 推荐码率 |
+|--------|------|----------|
+| 720p (1280x720) | 30fps | 2500k |
+| 720p (1280x720) | 60fps | 3500k |
+| 1080p (1920x1080) | 30fps | 4500k |
+| 1080p (1920x1080) | 60fps | 6000k |
+
+## 常见问题
+
+### 权限问题
+
+首次运行时,macOS 会提示授权摄像头和麦克风访问,请点击允许。
+
+如果没有提示,可以在 **系统偏好设置 → 安全性与隐私 → 隐私 → 摄像头/麦克风** 中手动授权终端。
+
+### 推流失败
+
+1. 检查网络连接
+2. 确认推流密钥正确
+3. 确认 Cloudflare Stream 服务已开通
+4. 查看 FFmpeg 错误输出
+
+### 画面卡顿
+
+- 降低分辨率或码率
+- 检查网络上传带宽
+- 关闭其他占用网络的应用
+
+## 文件结构
+
+```
+tg-live-game-stream-service/
+├── scripts/
+│   ├── list-devices.sh       # 列出可用设备
+│   ├── stream-camera.sh      # 摄像头推流
+│   ├── stream-screen.sh      # 屏幕推流
+│   └── stop-stream.sh        # 停止推流
+├── config/
+│   ├── stream.env.example    # 配置模板
+│   └── stream.env            # 实际配置(需创建)
+└── README.md
+```

+ 34 - 0
config/stream.env.example

@@ -0,0 +1,34 @@
+# Cloudflare Stream 推流配置
+# 复制此文件为 stream.env 并填写配置
+
+# ============ Cloudflare Stream 配置 ============
+# 从 tg-live-game-web 的「直播管理」页面获取
+
+# RTMPS 推流地址(不要修改)
+RTMP_URL=rtmps://live.cloudflare.com:443/live
+
+# 推流密钥(从 Cloudflare 创建直播后获取)
+STREAM_KEY=your_stream_key_here
+
+# ============ 设备配置 ============
+# 运行 ./scripts/list-devices.sh 查看可用设备
+
+# 摄像头设备编号(通常是 0)
+VIDEO_DEVICE=0
+
+# 麦克风设备编号(通常是 0)
+AUDIO_DEVICE=0
+
+# 屏幕设备编号(用于屏幕推流,通常是 1)
+SCREEN_DEVICE=1
+
+# ============ 视频参数 ============
+
+# 分辨率(推荐: 1280x720 或 1920x1080)
+RESOLUTION=1280x720
+
+# 帧率(推荐: 30)
+FPS=30
+
+# 视频码率(推荐: 720p 用 2500k, 1080p 用 4500k)
+BITRATE=2500k

+ 17 - 0
scripts/list-devices.sh

@@ -0,0 +1,17 @@
+#!/bin/bash
+# 列出 Mac 上可用的音视频设备
+# 用于确定 VIDEO_DEVICE 和 AUDIO_DEVICE 的编号
+
+echo "====== 可用的音视频设备 ======"
+echo ""
+
+ffmpeg -f avfoundation -list_devices true -i "" 2>&1 | grep -E "^\[AVFoundation"
+
+echo ""
+echo "====== 使用说明 ======"
+echo "视频设备编号: [AVFoundation ...] [0] 后面的数字"
+echo "音频设备编号: [AVFoundation ...] [0] 后面的数字"
+echo ""
+echo "在 config/stream.env 中配置:"
+echo "  VIDEO_DEVICE=0"
+echo "  AUDIO_DEVICE=0"

+ 13 - 0
scripts/stop-stream.sh

@@ -0,0 +1,13 @@
+#!/bin/bash
+# 停止所有 FFmpeg 推流进程
+
+echo "正在停止所有 FFmpeg 推流进程..."
+
+# 查找并终止 ffmpeg 进程
+pkill -f "ffmpeg.*flv.*cloudflare" 2>/dev/null
+
+if [ $? -eq 0 ]; then
+    echo "已停止推流"
+else
+    echo "没有找到正在运行的推流进程"
+fi

+ 74 - 0
scripts/stream-camera.sh

@@ -0,0 +1,74 @@
+#!/bin/bash
+# Mac 摄像头推流到 Cloudflare Stream
+# 使用方法: ./scripts/stream-camera.sh
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+CONFIG_FILE="$SCRIPT_DIR/../config/stream.env"
+
+# 检查配置文件
+if [ ! -f "$CONFIG_FILE" ]; then
+    echo "错误: 配置文件不存在"
+    echo "请复制 config/stream.env.example 为 config/stream.env 并填写配置"
+    exit 1
+fi
+
+# 加载配置
+source "$CONFIG_FILE"
+
+# 默认参数
+VIDEO_DEVICE="${VIDEO_DEVICE:-0}"
+AUDIO_DEVICE="${AUDIO_DEVICE:-0}"
+RESOLUTION="${RESOLUTION:-1280x720}"
+FPS="${FPS:-30}"
+BITRATE="${BITRATE:-2500k}"
+
+# 检查必要配置
+if [ -z "$RTMP_URL" ] || [ -z "$STREAM_KEY" ]; then
+    echo "错误: 请在 config/stream.env 中配置 RTMP_URL 和 STREAM_KEY"
+    echo ""
+    echo "获取方式:"
+    echo "1. 打开 tg-live-game-web 前端"
+    echo "2. 进入 Cloudflare Stream -> 直播管理"
+    echo "3. 创建直播,获取推流地址和密钥"
+    exit 1
+fi
+
+# 检查 ffmpeg
+if ! command -v ffmpeg &> /dev/null; then
+    echo "错误: ffmpeg 未安装"
+    echo "请运行: brew install ffmpeg"
+    exit 1
+fi
+
+echo "======================================"
+echo "    Cloudflare Stream 摄像头推流"
+echo "======================================"
+echo ""
+echo "配置信息:"
+echo "  视频设备: $VIDEO_DEVICE"
+echo "  音频设备: $AUDIO_DEVICE"
+echo "  分辨率:   $RESOLUTION"
+echo "  帧率:     $FPS fps"
+echo "  码率:     $BITRATE"
+echo "  推流地址: $RTMP_URL"
+echo ""
+echo "按 Ctrl+C 停止推流"
+echo "======================================"
+echo ""
+
+# 开始推流
+ffmpeg -f avfoundation \
+    -framerate "$FPS" \
+    -video_size "$RESOLUTION" \
+    -i "$VIDEO_DEVICE:$AUDIO_DEVICE" \
+    -c:v libx264 \
+    -preset veryfast \
+    -maxrate "$BITRATE" \
+    -bufsize 5000k \
+    -pix_fmt yuv420p \
+    -g 60 \
+    -c:a aac \
+    -b:a 128k \
+    -ar 44100 \
+    -f flv \
+    "${RTMP_URL}/${STREAM_KEY}"

+ 66 - 0
scripts/stream-screen.sh

@@ -0,0 +1,66 @@
+#!/bin/bash
+# Mac 屏幕录制推流到 Cloudflare Stream
+# 使用方法: ./scripts/stream-screen.sh
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+CONFIG_FILE="$SCRIPT_DIR/../config/stream.env"
+
+# 检查配置文件
+if [ ! -f "$CONFIG_FILE" ]; then
+    echo "错误: 配置文件不存在"
+    echo "请复制 config/stream.env.example 为 config/stream.env 并填写配置"
+    exit 1
+fi
+
+# 加载配置
+source "$CONFIG_FILE"
+
+# 屏幕录制参数
+SCREEN_DEVICE="${SCREEN_DEVICE:-1}"  # 屏幕设备号(通常是1)
+AUDIO_DEVICE="${AUDIO_DEVICE:-0}"
+FPS="${FPS:-30}"
+BITRATE="${BITRATE:-3000k}"
+
+# 检查必要配置
+if [ -z "$RTMP_URL" ] || [ -z "$STREAM_KEY" ]; then
+    echo "错误: 请在 config/stream.env 中配置 RTMP_URL 和 STREAM_KEY"
+    exit 1
+fi
+
+# 检查 ffmpeg
+if ! command -v ffmpeg &> /dev/null; then
+    echo "错误: ffmpeg 未安装"
+    echo "请运行: brew install ffmpeg"
+    exit 1
+fi
+
+echo "======================================"
+echo "    Cloudflare Stream 屏幕推流"
+echo "======================================"
+echo ""
+echo "配置信息:"
+echo "  屏幕设备: $SCREEN_DEVICE"
+echo "  音频设备: $AUDIO_DEVICE"
+echo "  帧率:     $FPS fps"
+echo "  码率:     $BITRATE"
+echo ""
+echo "按 Ctrl+C 停止推流"
+echo "======================================"
+echo ""
+
+# 开始屏幕推流
+ffmpeg -f avfoundation \
+    -framerate "$FPS" \
+    -capture_cursor 1 \
+    -i "$SCREEN_DEVICE:$AUDIO_DEVICE" \
+    -c:v libx264 \
+    -preset veryfast \
+    -maxrate "$BITRATE" \
+    -bufsize 6000k \
+    -pix_fmt yuv420p \
+    -g 60 \
+    -c:a aac \
+    -b:a 128k \
+    -ar 44100 \
+    -f flv \
+    "${RTMP_URL}/${STREAM_KEY}"