一、全链路概览与数据源认知

做流媒体这行,很多人一上来就盯着编码参数、推流协议猛学。结果呢?采集端出了幺蛾子,后面全白搭。我见过太多人花三天调编码器,最后发现是摄像头采集的帧率就不对。

所以咱们第一节课,先把整条链路看清楚。你想想看,从摄像头拍到用户手机播放,中间到底经历了什么?

核心观点:全链路的质量天花板,在采集端就已经定死了。后面再怎么优化,也补不回来采集时的缺陷。

1.1 全链路架构图

先上一张图,把整条链路串起来。这张图我画了好几个版本,最终定成现在这样——每个环节都是我在项目中踩过坑的地方。

数据采集到编码推流全链路架构图 数据采集 → 编码推流全链路架构 数据源 摄像头 麦克风 屏幕录制 采集处理 格式转换 分辨率缩放 帧率控制 编码压缩 H.264/H.265 AAC/Opus 码率控制 封装推流 FLV/TS RTMP/SRT 💡 说明:每个环节都有坑。采集端丢帧、格式不兼容、编码参数不合理,都会导致最终画面出问题。 本课程会逐一拆解每个环节,让你从入门到实战都能自己搞定。 ⏱ 典型延迟分布:采集 10-30ms → 处理 5-15ms → 编码 20-100ms → 网络 50-500ms 📊 关键参数:分辨率 1920×1080 | 帧率 30fps | 视频码率 2-8 Mbps | 音频码率 128 Kbps

这张图我建议你保存下来。每次遇到问题,先定位是哪个环节出的毛病,别瞎调参数。

1.2 数据源:摄像头

摄像头是视频流的第一站。说白了,它就是个光电转换器——把光信号变成电信号,再变成数字信号。

我个人习惯把摄像头分成三类:

类型 接口 典型分辨率 帧率 适用场景
USB摄像头 USB 2.0/3.0 720p ~ 4K 30fps 直播、视频会议
HDMI/SDI摄像头 HDMI/SDI 1080p ~ 4K 60fps 专业直播、导播
网络摄像头 RTSP/ONVIF 720p ~ 5MP 25fps 安防监控

避坑指南:我曾经遇到过USB摄像头在Windows上默认输出MJPEG格式,但采集程序只认YUYV。结果画面一片绿。后来我养成了习惯——采集之前先查摄像头支持的格式列表,用ffmpeg -list_devices true -f dshow -i dummy就能看到。

摄像头采集时,有几个参数你必须关注:

  • 分辨率:不是越高越好。4K采集对CPU和带宽都是考验。我一般推荐1080p起步,除非你有特殊需求。
  • 帧率:30fps是主流。60fps适合体育、游戏场景,但编码压力翻倍。
  • 像素格式:常见的有YUYV、MJPEG、NV12。NV12是编码器最喜欢的格式,省去一次颜色空间转换。

1.3 数据源:麦克风

音频这块,很多人不重视。但你想一下,画面稍微糊一点观众还能忍,声音一炸裂、一卡顿,观众直接关页面。

麦克风采集的核心参数:

参数 推荐值 说明
采样率 44100 Hz / 48000 Hz 44100是CD音质,48000是视频标准
位深 16 bit / 24 bit 16bit够用,24bit动态范围更大
声道数 1(单声道)/ 2(立体声) 直播用单声道省带宽,音乐类用立体声
采样格式 s16le / fltp s16le是整数,fltp是浮点,编码器更爱fltp

注意:音频和视频的时钟是独立的。采集时如果音视频采样率不匹配,后期同步会让你头疼到怀疑人生。我建议统一用48000 Hz采样率,省事。

1.4 数据源:屏幕录制

屏幕录制在网课、游戏直播、软件演示中特别常见。它和摄像头采集最大的区别在于——屏幕是静态生成画面,没有物理噪声,但帧率变化大。

屏幕录制的三种主流方式:

  • GDI/DirectX 抓取(Windows):兼容性好,但CPU占用高。适合简单录屏。
  • Desktop Duplication API(Windows 8+):效率高,支持硬件加速。我推荐用这个。
  • CGDisplayStream(macOS):macOS原生方案,稳定但灵活性差。

嗯,这里要注意:屏幕录制时,如果画面变化不大(比如PPT翻页),用固定帧率会浪费带宽。我习惯用动态帧率——画面静止时降到5fps,有变化时升到30fps。能省30%-50%的码率。

1.5 数据源对比与选择

三种数据源各有优劣。我整理了一张对比表:

维度 摄像头 麦克风 屏幕录制
数据类型 视频帧 音频PCM 视频帧
典型格式 YUYV, MJPEG, NV12 s16le, fltp BGRA, NV12
帧率稳定性 稳定(硬件固定) 连续流 波动大(依赖画面变化)
CPU占用 低(硬件解码) 极低 中高(需编码)
常见问题 格式不兼容、丢帧 回声、底噪、爆音 帧率不稳、画面撕裂

我的建议:如果你做直播,摄像头+麦克风是标配。屏幕录制作为辅助。如果你做录课,屏幕录制为主,摄像头画中画为辅。别贪多,数据源越多,同步越难。

1.6 采集端常见问题与排查

最后,分享几个我踩过的坑:

  1. 摄像头采集不到画面:先检查权限(Windows隐私设置、macOS摄像头授权),再用ffmpeg -f dshow -list_options true -i video="摄像头名称"看支持格式。
  2. 麦克风有杂音:大概率是增益太高或者电源干扰。我习惯把增益调到80%,然后用软件做降噪,比硬件调低更可控。
  3. 屏幕录制掉帧:检查是不是用了软件编码。换成硬件编码(NVENC/AMF)能解决大部分问题。
  4. 音视频不同步:采集时打时间戳。我每个采集到的帧都记下系统时钟,后面同步时用这个时间戳对齐。

小技巧:调试采集端时,我习惯先用ffplay直接预览。ffplay -f dshow -i video="摄像头名称"能快速确认摄像头是否正常工作。比写代码调试快多了。