ffmpeg推流至mediasoup时音频正常、视频仅显示首帧问题求助
排查与解决思路
- 首先修正ffmpeg编码参数错误:你当前命令中
-cpu-used -5属于非法参数,libvpx的cpu-used取值范围为0(质量最优编码最慢)8(编码最快质量最低),实时推流场景建议设置为48之间的正整数,替换为-cpu-used 6即可。同时补充关键帧控制参数:添加-g 60 -keyint_min 60 -rc_lookahead 0,保证每2秒(按30fps计算)输出一个关键帧,避免浏览器因长时间未收到关键帧停止画面刷新。 - 验证RTP时间戳连续性:使用tcpdump抓取ffmpeg发往mediasoup视频端口的RTP包,检查相邻视频RTP包的时间戳是否按帧率对应增量正常递增(30fps下每帧时间戳增量为90000/30=3000),如果出现时间戳停滞或跳变,可在ffmpeg视频编码参数后添加
-fflags +genpts强制生成正确的Presentation Time Stamp。 - 核对mediasoup Producer配置:确认你创建VideoProducer时传入的参数与ffmpeg推流参数完全匹配:
payloadType必须为101、ssrc必须为2222、编码格式明确指定为VP8,同时关闭未配置的rtx、fec等扩展功能,避免服务端对RTP包做额外处理导致时序异常。 - 单独测试视频推流链路:暂时去掉tee命令中的音频分流逻辑,仅保留视频推流到mediasoup,验证是否能正常播放,排除音频分流对全局时间戳的干扰。如果单独推视频仍然异常,可以将输出格式临时改为本地文件
-f webm test.webm,播放本地输出文件确认编码后的视频本身是否正常,排除编码环节问题。 - 检查浏览器端Consumer状态:在Chrome控制台打印视频Consumer的实时统计信息,确认
framesDecoded指标是否持续增长:- 如果该指标停滞,说明服务端未正常转发RTP包或者浏览器解码失败,进一步检查mediasoup服务端的Consumer统计,确认是否有持续收到视频包
- 如果该指标正常增长但画面未刷新,检查页面video元素是否设置了
autoplayplaysinline属性,是否成功触发了play()调用,手动调用video.currentTime = video.currentTime强制刷新画面验证是否为渲染层问题。
内容的提问来源于stack exchange,提问作者boygiandi
相关产品推荐
相关产品推荐

