-
Notifications
You must be signed in to change notification settings - Fork 12
Architecture
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()解锁所有等待线程。
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 后不断开客户端。
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 |