Skip to content

Architecture

johnjiamzhong-project edited this page Jun 6, 2026 · 1 revision

架构概览

RambosPlayer 采用双管线设计:本地播放管线和 HTTP-MPEG-TS 推流管线共享同一个解复用层(DemuxThread),互不干扰。


本地播放管线

UI 层 (MainWindow) │ ▼ PlayerController │ ▼ DemuxThread ├─ videoPacketQueue ──→ VideoDecodeThread ──→ videoFrameQueue ──→ VideoRenderer (QPainter) └─ audioPacketQueue ──→ AudioDecodeThread ──→ QAudioOutput (PCM) │ AVSync(音频时钟) │ 控制 VideoRenderer 渲染时机

  • 音频时钟主导同步AVSync 存储当前播放 PTS,VideoRenderer 每 1ms 检查视频帧是否到点,落后超过 400ms 直接丢帧。
  • FrameQueue<T> 是所有线程间通信的唯一机制,有界阻塞,生产者满时阻塞,abort() 解锁所有等待线程。

HTTP-MPEG-TS 推流管线

DemuxThread ──→ StreamDecoder(重解码为原始帧) ├─ restreamVideoQ ──→ EncodeThread(libx264)──┐ └─ restreamAudioQ ──→ AudioEncodeThread(AAC)─┤ ▼ MpegTsServer (MPEG-TS muxer) │ HTTP chunked ──→ 浏览器 mpegts.js

  • 低延迟设计:GOP = 0.5s,强制关键帧,mpegts.js 追帧,浏览器延迟 ≤ 600ms。
  • Seek 连续性:MpegTsServer 使用 PTS remap(pkt->pts - segBase + accumPts),seek 后不断开客户端。

Seek 流(sentinel 机制)

DemuxThread::seek() → 向 videoPacketQueue / audioPacketQueue push nullptr(哨兵) → StreamDecoder:avcodec_flush_buffers + 向输出队列 push nullptr → EncodeThread:reopenCodec()(libx264 flush 后进入 EOS,必须重建) → AudioEncodeThread:drain FIFO + reopenCodec()(AAC 内部 ~2048 samples lookahead 无法 flush) → MpegTsServer:PTS remap 续接,不断开客户端


推流协议对比

协议 地址 适用场景
RTMP rtmp://127.0.0.1:1935/live/test 推送到 SRS / B站 / Twitch
SRT srt://:9000 局域网 VLC 拉流,无需服务器
HTTP-FLV 端口 8080(内置) 局域网浏览器,无需安装客户端
HTTP-MPEG-TS 端口 8090(内置) 低延迟模式,延迟 ≤ 600ms

核心组件

组件 文件 职责
FrameQueue<T> src/framequeue.h 线程安全有界阻塞队列
AVSync src/avsync.cpp 音频时钟 + 视频帧延迟计算
DemuxThread src/demuxthread.cpp av_read_frame 循环,按流索引分发包
VideoDecodeThread src/videodecodethread.cpp 解码视频包 → AVFrame
AudioDecodeThread src/audiodecodethread.cpp 解码 + swr 重采样 → QAudioOutput
VideoRenderer src/videorenderer.cpp sws_scale YUV→RGB,QPainter 渲染
PlayerController src/playercontroller.cpp 持有所有组件,暴露 open/play/pause/seek
StreamDecoder src/streamdecoder.cpp 推流专用重解码,输出原始 AVFrame
EncodeThread src/encodethread.cpp libx264 重编码,seek 后 reopenCodec
AudioEncodeThread src/audioencodethread.cpp AAC 编码(swr + audio_fifo),seek 后 reopenCodec
MpegTsServer src/mpegtsserver.cpp HTTP-MPEG-TS 服务器,PTS remap,广播给所有客户端
ExportWorker src/exportworker.cpp 帧精确重编码导出(H.264 + AAC → MP4)
AudioMixWorker src/audiomixworker.cpp amix/adelay avfilter 混音 → 替换音轨 → MP4

Clone this wiki locally