一、全链路概览与数据源认知
做流媒体这行,很多人一上来就盯着编码参数、推流协议猛学。结果呢?采集端出了幺蛾子,后面全白搭。我见过太多人花三天调编码器,最后发现是摄像头采集的帧率就不对。
所以咱们第一节课,先把整条链路看清楚。你想想看,从摄像头拍到用户手机播放,中间到底经历了什么?
核心观点:全链路的质量天花板,在采集端就已经定死了。后面再怎么优化,也补不回来采集时的缺陷。
1.1 全链路架构图
先上一张图,把整条链路串起来。这张图我画了好几个版本,最终定成现在这样——每个环节都是我在项目中踩过坑的地方。
这张图我建议你保存下来。每次遇到问题,先定位是哪个环节出的毛病,别瞎调参数。
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 采集端常见问题与排查
最后,分享几个我踩过的坑:
- 摄像头采集不到画面:先检查权限(Windows隐私设置、macOS摄像头授权),再用ffmpeg -f dshow -list_options true -i video="摄像头名称"看支持格式。
- 麦克风有杂音:大概率是增益太高或者电源干扰。我习惯把增益调到80%,然后用软件做降噪,比硬件调低更可控。
- 屏幕录制掉帧:检查是不是用了软件编码。换成硬件编码(NVENC/AMF)能解决大部分问题。
- 音视频不同步:采集时打时间戳。我每个采集到的帧都记下系统时钟,后面同步时用这个时间戳对齐。
小技巧:调试采集端时,我习惯先用ffplay直接预览。ffplay -f dshow -i video="摄像头名称"能快速确认摄像头是否正常工作。比写代码调试快多了。