Skip to content

Atom-Video

INFO

Atom-Video是一个面向开发者的视频分享CMS,专注于代码教程和技术分享内容的管理与展示。

项目概述

GitHub仓库: https://github.com/FightingTrip/atom-video

在线预览: https://atom-video.vercel.app

Atom-Video致力于为开发者提供一个专业的视频教程分享平台,解决传统视频平台对开发者内容支持不足的问题。通过集成代码展示、交互式时间轴和智能章节标记等功能,大幅提升了技术视频的学习体验。

核心功能

视频内容管理

  • 多格式视频支持: 支持MP4、WebM、AV1等多种视频格式
  • 自动转码处理: 使用FFmpeg自动转码为适合Web播放的格式
  • 云存储集成: 支持AWS S3、七牛云、阿里云OSS等多种存储方案
  • 批量管理: 支持批量上传、标记和分类

代码与视频关联

  • 代码片段嵌入: 在视频播放的特定时间点展示相关代码片段
  • 语法高亮: 支持超过100种编程语言的语法高亮
  • 代码变化追踪: 展示在教程过程中代码的演变
  • 一键复制: 快速复制代码片段到剪贴板

交互式时间轴

  • 章节标记: 自动或手动为视频添加章节标记,便于导航
  • 内容概要: 每个章节提供内容概要,方便快速理解
  • 智能跳转: 基于内容相关性的智能跳转推荐
  • 笔记与书签: 用户可以在时间轴上添加个人笔记和书签

团队协作系统

  • 基于角色的权限控制: 管理员、编辑者、贡献者等不同角色
  • 审核工作流: 内容发布前的审核与反馈机制
  • 协作评论: 团队成员可以对视频内容进行内部评论和讨论
  • 版本历史: 追踪内容的修改历史和版本变更

技术架构

前端技术栈

  • 框架: React 18 + TypeScript
  • 状态管理: Redux Toolkit
  • 样式解决方案: TailwindCSS + Styled Components
  • UI组件: 自研组件库 + HeadlessUI
  • 视频播放: Plyr + hls.js
  • 代码展示: CodeMirror 6 + Prism.js

后端技术栈

  • 服务框架: Node.js + Express
  • 数据库: PostgreSQL + Redis
  • 认证: JWT + OAuth2.0
  • 文件处理: Multer + Sharp
  • 视频处理: FFmpeg + WebRTC
  • API文档: Swagger + OpenAPI 3.0

部署与DevOps

  • 容器化: Docker + Docker Compose
  • CI/CD: GitHub Actions
  • 监控: Sentry + Prometheus
  • 负载均衡: Nginx + CloudFlare
  • CDN: CloudFront / Cloudflare

系统架构图

mermaid
graph TD
    Client[用户浏览器] --> Frontend[前端应用]
    Frontend --> API[API网关]
    API --> AuthService[认证服务]
    API --> VideoService[视频服务]
    API --> CodeService[代码服务]
    API --> UserService[用户服务]
    API --> AnalyticsService[分析服务]
    
    VideoService --> VideoProcessor[视频处理器]
    VideoProcessor --> VideoStorage[视频存储]
    
    CodeService --> GitIntegration[Git集成]
    
    subgraph 数据存储
        PostgreSQL[(PostgreSQL)]
        Redis[(Redis)]
        ObjectStorage[(对象存储)]
    end
    
    VideoService --> PostgreSQL
    VideoService --> ObjectStorage
    CodeService --> PostgreSQL
    UserService --> PostgreSQL
    UserService --> Redis
    AnalyticsService --> PostgreSQL
    AnalyticsService --> Redis

项目进展

已完成功能

  • [x] 基础视频上传与管理
  • [x] 视频播放器与自定义控制
  • [x] 代码片段关联系统
  • [x] 用户认证与基本权限
  • [x] 基础分析与统计
  • [x] 响应式设计与移动端支持

正在开发

  • [ ] 高级搜索与推荐系统
  • [ ] AI自动章节划分
  • [ ] 代码片段实时运行环境
  • [ ] 互动式问答功能
  • [ ] 完整的API文档

未来规划

  • 支持更多的视频源集成
  • 添加社区功能与用户互动
  • 开发VS Code插件,直接从编辑器创建教程
  • 支持多语言字幕与内容翻译

技术亮点

视频流优化

我们针对视频教程的特殊需求,开发了自适应比特率流媒体解决方案:

javascript
// videoProcessor.js
class AdaptiveStreamProcessor {
  constructor(videoPath, outputDir) {
    this.videoPath = videoPath;
    this.outputDir = outputDir;
    this.ffmpeg = require('fluent-ffmpeg');
  }

  async generateHLS() {
    return new Promise((resolve, reject) => {
      this.ffmpeg(this.videoPath)
        .outputOptions([
          '-profile:v main',
          '-sc_threshold 0',
          '-g 48',
          '-keyint_min 48',
          // 生成多种分辨率的视频流
          '-map 0:v',
          '-map 0:v',
          '-map 0:v',
          '-map 0:a',
          // 240p
          '-s:v:0 426x240',
          '-c:v:0 libx264',
          '-b:v:0 400k',
          // 480p
          '-s:v:1 854x480',
          '-c:v:1 libx264',
          '-b:v:1 1400k',
          // 720p
          '-s:v:2 1280x720',
          '-c:v:2 libx264',
          '-b:v:2 2800k',
          // 音频设置
          '-c:a aac',
          '-b:a 128k',
          // HLS设置
          '-f hls',
          '-hls_time 4',
          '-hls_playlist_type vod',
          '-hls_segment_filename',
          `${this.outputDir}/segment_%v_%03d.ts`,
          '-master_pl_name master.m3u8',
          '-var_stream_map', 'v:0,a:0 v:1,a:0 v:2,a:0'
        ])
        .output(`${this.outputDir}/stream_%v.m3u8`)
        .on('end', resolve)
        .on('error', reject)
        .run();
    });
  }
}

module.exports = AdaptiveStreamProcessor;

代码同步系统

我们开发了时间轴与代码同步系统,实现了视频播放进度与代码展示的精确同步:

typescript
// CodeSyncManager.tsx
interface CodeSegment {
  id: string;
  filename: string;
  language: string;
  code: string;
  startTime: number;
  endTime: number;
  description?: string;
}

const CodeSyncManager: React.FC<{
  videoTime: number;
  codeSegments: CodeSegment[];
}> = ({ videoTime, codeSegments }) => {
  const [activeSegment, setActiveSegment] = useState<CodeSegment | null>(null);
  
  useEffect(() => {
    // 根据当前视频时间找到对应的代码段
    const segment = codeSegments.find(
      seg => videoTime >= seg.startTime && videoTime <= seg.endTime
    ) || null;
    
    if (segment?.id !== activeSegment?.id) {
      setActiveSegment(segment);
    }
  }, [videoTime, codeSegments, activeSegment]);
  
  if (!activeSegment) {
    return <EmptyCodeView />;
  }
  
  return (
    <div className="code-sync-container">
      <div className="code-header">
        <span className="filename">{activeSegment.filename}</span>
        <span className="language">{activeSegment.language}</span>
      </div>
      <CodeEditor
        language={activeSegment.language}
        value={activeSegment.code}
        readOnly
        highlight
      />
      {activeSegment.description && (
        <div className="code-description">{activeSegment.description}</div>
      )}
    </div>
  );
};

参与贡献

我们欢迎开发者参与Atom-Video项目的贡献!无论是功能开发、Bug修复、文档完善还是创意建议,都非常欢迎。

联系方式

如果您对项目有任何问题或建议,欢迎通过以下方式联系我们:


贡献指南

如果您想参与贡献,请先阅读我们的贡献指南,了解代码规范和提交流程。

One Day We Will All Be Famous!