's'
This commit is contained in:
128
app/cloudphone/config/course.ts
Normal file
128
app/cloudphone/config/course.ts
Normal file
@@ -0,0 +1,128 @@
|
||||
/**
|
||||
* 云手机实战课 - 课程配置(克隆自 nomadlms)
|
||||
*/
|
||||
|
||||
export const SITE_CONFIG = {
|
||||
brand: "🌍 云手机",
|
||||
ctaUrl: "/cloudphone/pay",
|
||||
footer: "🌍 云手机 · 低成本工作室搭建指南",
|
||||
} as const;
|
||||
|
||||
export const HERO_CONFIG = {
|
||||
title: "云手机实战课",
|
||||
subtitle: "低成本工作室搭建指南 · TikTok/Youtube 无人直播,开启 24 小时赚美金",
|
||||
stats: [
|
||||
{ value: "13", label: "节实战课程" },
|
||||
{ value: "170+", label: "分钟视频" },
|
||||
{ value: "1", label: "位资深导师" },
|
||||
],
|
||||
} as const;
|
||||
|
||||
export const AUDIENCE_CONFIG = {
|
||||
title: "这门课适合谁?",
|
||||
subtitle: "向往低成本自建,想用开源硬件实现无人直播的人",
|
||||
items: [
|
||||
{ emoji: "💻", title: "无人直播创业者", desc: "想用低成本硬件搭建 TikTok/Youtube 直播矩阵" },
|
||||
{ emoji: "⚙️", title: "技术极客", desc: "想自建云手机、Redroid、ARM 开发板玩转自动化" },
|
||||
{ emoji: "📱", title: "出海副业者", desc: "想摆脱云手机平台高额月费,自建开箱即用" },
|
||||
{ emoji: "🌴", title: "工作室搭建者", desc: "想低成本打造无人值守 24 小时赚美金" },
|
||||
],
|
||||
} as const;
|
||||
|
||||
export const BENEFITS_CONFIG = {
|
||||
title: "学完你将获得",
|
||||
subtitle: "5大核心能力,助你自建云手机工作室",
|
||||
items: [
|
||||
{ num: "1", title: "云手机自建方案", desc: "Redroid、AOSP 安卓、ARM 开发板,从零搭建云手机" },
|
||||
{ num: "2", title: "无人直播技术栈", desc: "ffmpeg、SRS、油猴脚本,实现 24 小时自动化推流" },
|
||||
{ num: "3", title: "软路由与网络", desc: "科学上网、静态住宅 IP,出海必备基础设施" },
|
||||
{ num: "4", title: "硬件选型与成本", desc: "开发板、采集卡、配件,一套成本不过千" },
|
||||
{ num: "5", title: "VIP 社群支持", desc: "加入异度星球,获取部署教程与即时答疑" },
|
||||
],
|
||||
} as const;
|
||||
|
||||
export const CURRICULUM_CONFIG = {
|
||||
title: "实战课程",
|
||||
subtitle: "从入门到进阶,完整搭建云手机工作室",
|
||||
modules: [
|
||||
{
|
||||
emoji: "🚀",
|
||||
title: "基础篇 · 云手机入门",
|
||||
lessons: [
|
||||
{ name: "01 什么是云手机?自建 vs 商业平台", duration: "08:32" },
|
||||
{ name: "02 低成本工作室硬件选型", duration: "12:15" },
|
||||
],
|
||||
},
|
||||
{
|
||||
emoji: "⚙️",
|
||||
title: "技术篇 · Redroid 与 AOSP",
|
||||
lessons: [
|
||||
{ name: "03 Docker 虚拟化安卓 - Redroid", duration: "15:20" },
|
||||
{ name: "04 ARM 开发板 AOSP 系统", duration: "18:00" },
|
||||
{ name: "05 相机与推流配置", duration: "14:30" },
|
||||
],
|
||||
},
|
||||
{
|
||||
emoji: "📺",
|
||||
title: "直播篇 · 无人推流",
|
||||
lessons: [
|
||||
{ name: "06 ffmpeg 拉流转推", duration: "16:00" },
|
||||
{ name: "07 SRS 直播服务器", duration: "12:45" },
|
||||
{ name: "08 油猴脚本自动化", duration: "11:20" },
|
||||
{ name: "09 TikTok/Youtube 实战", duration: "20:00" },
|
||||
],
|
||||
},
|
||||
{
|
||||
emoji: "🌐",
|
||||
title: "网络篇 · 出海基础",
|
||||
lessons: [
|
||||
{ name: "10 软路由与科学上网", duration: "13:00" },
|
||||
{ name: "11 静态住宅 IP 配置", duration: "10:30" },
|
||||
],
|
||||
},
|
||||
{
|
||||
emoji: "🏆",
|
||||
title: "进阶篇 · 产品化",
|
||||
lessons: [
|
||||
{ name: "12 HDMI 辅助板方案", duration: "15:00" },
|
||||
{ name: "13 多设备群控与远控", duration: "12:00" },
|
||||
],
|
||||
},
|
||||
],
|
||||
} as const;
|
||||
|
||||
export const INSTRUCTORS_CONFIG = {
|
||||
title: "资深导师授课",
|
||||
subtitle: "异度世界带你开启云手机工作室之旅",
|
||||
items: [
|
||||
{
|
||||
name: "异度世界",
|
||||
role: "数字游民先行者",
|
||||
desc: "5年旅居经验,低成本工作室实践",
|
||||
tag: "课程主理",
|
||||
},
|
||||
],
|
||||
} as const;
|
||||
|
||||
export const CTA_CONFIG = {
|
||||
title: "准备好开启你的云手机工作室了吗?",
|
||||
subtitle: "加入异度星球 VIP,解锁云手机实战课 + 电子书 + 即时答疑",
|
||||
badges: ["实战视频", "永久回看", "社群答疑"],
|
||||
} as const;
|
||||
|
||||
export const FAQ_CONFIG = {
|
||||
title: "常见问题",
|
||||
items: [
|
||||
{ q: "课程可以永久回看吗?", a: "可以,VIP 会员永久有效,随时回看。" },
|
||||
{ q: "适合零基础吗?", a: "适合。课程从入门到进阶,前 2 节可免费试看。" },
|
||||
{ q: "有社群答疑吗?", a: "有,VIP 加入异度星球专属社群,即时答疑。" },
|
||||
{ q: "支持退款吗?", a: "虚拟数字交付,不支持退款。" },
|
||||
],
|
||||
} as const;
|
||||
|
||||
export const DOWNLOAD_CONFIG = {
|
||||
enabled: true,
|
||||
url: "https://pan.baidu.com/s/example",
|
||||
title: "课程资料下载",
|
||||
buttonText: "前往网盘下载",
|
||||
} as const;
|
||||
145
app/cloudphone/config/lessons.ts
Normal file
145
app/cloudphone/config/lessons.ts
Normal file
@@ -0,0 +1,145 @@
|
||||
/**
|
||||
* 云手机课程章节详情配置(克隆自 nomadlms)
|
||||
*/
|
||||
|
||||
const SAMPLE_VIDEO = "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4";
|
||||
|
||||
const SAMPLE_MARKDOWN = `# 课程概述
|
||||
|
||||
本小节将带你理解云手机的核心概念,掌握低成本工作室搭建技能。
|
||||
|
||||
## 学习目标
|
||||
|
||||
- 理解云手机的本质与自建方案
|
||||
- 掌握 Redroid、AOSP 等虚拟化技术
|
||||
- 完成无人直播推流配置
|
||||
|
||||
## 核心要点
|
||||
|
||||
1. **定义**:云手机 = 虚拟化安卓 + 远程控制 + 自动化推流
|
||||
2. **技术**:Docker Redroid、ARM 开发板、ffmpeg、SRS
|
||||
3. **成本**:自建单台成本可控制在千元以内
|
||||
|
||||
## 行动清单
|
||||
|
||||
- [ ] 评估自己的硬件与网络环境
|
||||
- [ ] 列出想实现的直播平台(TikTok/Youtube 等)
|
||||
- [ ] 设定 1 个月内的搭建目标
|
||||
|
||||
### 代码示例
|
||||
|
||||
\`\`\`bash
|
||||
# 启动 Redroid 容器
|
||||
docker run -itd --privileged \\
|
||||
-v ~/data:/data \\
|
||||
redroid/redroid:13.0.0-latest
|
||||
\`\`\`
|
||||
|
||||
行内代码示例:\`ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live\` 可推流到 RTMP 服务器。
|
||||
|
||||
## 注意事项
|
||||
|
||||
> 云手机自建需要一定技术基础,建议先完成前 2 节试看再决定是否购买。
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| 硬件 | 建议 ARM 开发板或 x86 主机 |
|
||||
| 网络 | 需科学上网与静态 IP |
|
||||
| 时间 | 完整搭建约 1-2 天 |
|
||||
`;
|
||||
|
||||
export type LessonDetail = {
|
||||
name: string;
|
||||
duration: string;
|
||||
videoUrl: string;
|
||||
markdown: string;
|
||||
};
|
||||
|
||||
export const LESSONS_MAP: Record<string, LessonDetail> = {
|
||||
"0-0": {
|
||||
name: "01 什么是云手机?自建 vs 商业平台",
|
||||
duration: "08:32",
|
||||
videoUrl: SAMPLE_VIDEO,
|
||||
markdown: SAMPLE_MARKDOWN.replace("本小节", "本节").replace("核心概念", "云手机定义与自建 vs 商业平台对比"),
|
||||
},
|
||||
"0-1": {
|
||||
name: "02 低成本工作室硬件选型",
|
||||
duration: "12:15",
|
||||
videoUrl: SAMPLE_VIDEO,
|
||||
markdown: SAMPLE_MARKDOWN.replace("本小节", "本节").replace("核心概念", "开发板、采集卡、配件选型"),
|
||||
},
|
||||
"1-0": {
|
||||
name: "03 Docker 虚拟化安卓 - Redroid",
|
||||
duration: "15:20",
|
||||
videoUrl: SAMPLE_VIDEO,
|
||||
markdown: SAMPLE_MARKDOWN.replace("本小节", "本节").replace("核心概念", "Redroid 安装与配置"),
|
||||
},
|
||||
"1-1": {
|
||||
name: "04 ARM 开发板 AOSP 系统",
|
||||
duration: "18:00",
|
||||
videoUrl: SAMPLE_VIDEO,
|
||||
markdown: SAMPLE_MARKDOWN.replace("本小节", "本节").replace("核心概念", "AOSP 刷机与系统定制"),
|
||||
},
|
||||
"1-2": {
|
||||
name: "05 相机与推流配置",
|
||||
duration: "14:30",
|
||||
videoUrl: SAMPLE_VIDEO,
|
||||
markdown: SAMPLE_MARKDOWN.replace("本小节", "本节").replace("核心概念", "虚拟相机与 RTMP 推流"),
|
||||
},
|
||||
"2-0": {
|
||||
name: "06 ffmpeg 拉流转推",
|
||||
duration: "16:00",
|
||||
videoUrl: SAMPLE_VIDEO,
|
||||
markdown: SAMPLE_MARKDOWN.replace("本小节", "本节").replace("核心概念", "ffmpeg 拉流与转推"),
|
||||
},
|
||||
"2-1": {
|
||||
name: "07 SRS 直播服务器",
|
||||
duration: "12:45",
|
||||
videoUrl: SAMPLE_VIDEO,
|
||||
markdown: SAMPLE_MARKDOWN.replace("本小节", "本节").replace("核心概念", "SRS 部署与推拉流"),
|
||||
},
|
||||
"2-2": {
|
||||
name: "08 油猴脚本自动化",
|
||||
duration: "11:20",
|
||||
videoUrl: SAMPLE_VIDEO,
|
||||
markdown: SAMPLE_MARKDOWN.replace("本小节", "本节").replace("核心概念", "油猴脚本实现自动化操作"),
|
||||
},
|
||||
"2-3": {
|
||||
name: "09 TikTok/Youtube 实战",
|
||||
duration: "20:00",
|
||||
videoUrl: SAMPLE_VIDEO,
|
||||
markdown: SAMPLE_MARKDOWN.replace("本小节", "本节").replace("核心概念", "TikTok/Youtube 无人直播实战"),
|
||||
},
|
||||
"3-0": {
|
||||
name: "10 软路由与科学上网",
|
||||
duration: "13:00",
|
||||
videoUrl: SAMPLE_VIDEO,
|
||||
markdown: SAMPLE_MARKDOWN.replace("本小节", "本节").replace("核心概念", "软路由配置与科学上网"),
|
||||
},
|
||||
"3-1": {
|
||||
name: "11 静态住宅 IP 配置",
|
||||
duration: "10:30",
|
||||
videoUrl: SAMPLE_VIDEO,
|
||||
markdown: SAMPLE_MARKDOWN.replace("本小节", "本节").replace("核心概念", "静态住宅 IP 与代理配置"),
|
||||
},
|
||||
"4-0": {
|
||||
name: "12 HDMI 辅助板方案",
|
||||
duration: "15:00",
|
||||
videoUrl: SAMPLE_VIDEO,
|
||||
markdown: SAMPLE_MARKDOWN.replace("本小节", "本节").replace("核心概念", "HDMI 采集与辅助板"),
|
||||
},
|
||||
"4-1": {
|
||||
name: "13 多设备群控与远控",
|
||||
duration: "12:00",
|
||||
videoUrl: SAMPLE_VIDEO,
|
||||
markdown: SAMPLE_MARKDOWN.replace("本小节", "本节").replace("核心概念", "群控与远程控制方案"),
|
||||
},
|
||||
};
|
||||
|
||||
export function getLessonKey(moduleIndex: number, lessonIndex: number): string {
|
||||
return `${moduleIndex}-${lessonIndex}`;
|
||||
}
|
||||
|
||||
export function getLesson(moduleIndex: number, lessonIndex: number): LessonDetail | null {
|
||||
return LESSONS_MAP[getLessonKey(moduleIndex, lessonIndex)] ?? null;
|
||||
}
|
||||
Reference in New Issue
Block a user