核心是通过优先级调度、可配置降级开关和轨道协同,在资源紧张时优雅分摊负载:按cpu、内存、gpu指标触发视频帧率/码率降低、音频转单声道等分级降级,状态机协调多轨节奏,拒绝策略仅作兜底。
这个问题核心不在“拒绝策略”本身,而在于如何在音视频异步编解码流程中,面对资源紧张(如cpu过载、内存不足、gpu忙等)时,有意识、可预测地降低某一路轨道的处理质量,避免整体卡顿或崩溃。所谓“优雅分摊”,是指不粗暴中断,而是按需降级——比如视频帧率略降、分辨率微调,同时音频保持流畅;或音频转为单声道+低码率,视频维持基础清晰度。这不是靠“拒绝任务”实现的,而是靠**优先级调度 + 可配置的降级开关 + 轨道间状态协同**。
明确音视频轨的降级优先级与触发条件
物理降级必须基于可量化的指标,而非主观判断。常见触发源包括:
- CPU使用率持续>85%且持续2秒以上:优先降低视频编码复杂度(如跳过B帧、关闭CABAC)、降低目标码率10%~20%
- 可用内存<200MB:暂停非主音频轨(如背景音效、多语言配音轨),仅保留主音轨+视频;字幕轨切换为文本渲染而非合成帧
- GPU纹理上传延迟>3帧:视频解码启用硬件缩放(YUV→RGB一步完成),禁用后处理滤镜;音频暂不启用3D空间音频渲染
为每条轨道预置可插拔的降级能力
不是临时“拒绝”,而是提前设计好“降级档位”。例如:
-
视频轨:支持三级输出配置 —— 全高清@30fps(默认)、标清@25fps(一级降级)、QVGA@15fps(二级降级)。通过FFmpeg的
-vf scale和-r参数动态注入,无需重启编码器 -
主音频轨:支持AAC-LC → HE-AAC v1 → MP3@64kbps三级回退,由
avcodec_parameters_copy()配合重初始化实现无缝切换 - 辅助音频轨(如解说、评论):设计为“按需加载”模式 —— 默认不解码;仅当用户主动选择且系统资源充足时才启用;否则直接静音并返回空缓冲区,不抛异常、不阻塞主线程
用状态机协调多轨降级节奏,避免雪崩
音视频异步处理中,各轨独立运行但共享底层资源。若各自盲目降级,可能引发连锁反应(如音频降采样导致时间戳重算,进而打乱视频同步)。推荐引入轻量状态机:
- 定义全局状态:
NORMAL/DEGRADED_VIDEO/DEGRADED_AUDIO/BOTH_DEGRADED - 任一轨触发降级时,先广播状态变更事件;其他轨监听后,检查自身是否需联动调整(如视频已降帧率,音频可暂缓降码率)
- 恢复逻辑同样受控:仅当所有指标连续5秒达标,才允许状态升回
NORMAL,且恢复采用渐进式(先恢复音频,1秒后再恢复视频)
拒绝策略只用于兜底,不参与主流程
真正的“自定义拒绝策略”应定位为最后一道防线,例如:
- 当某次视频帧编码耗时超过阈值(如120ms @ 30fps场景),且当前已是最低档位,此时丢弃该帧并记录
DROPPED_FRAME指标,不重试、不报错 - 音频解码器连续3次返回
AVERROR(EAGAIN),且缓冲区已满,则触发“静音填充”:生成10ms零样本PCM插入输出队列,维持时间线连续 - 所有降级路径失效时,拒绝新入队的非关键帧(如P帧、非I帧关键字幕cue),但始终保障I帧和主音轨首帧不被拒










