SRS无法正确识别RTMP流音频声道问题求助
问题概述
使用FFmpeg 4.4将单声道16000Hz的Speex流转码为单声道22050Hz的AAC流,推送到SRS(v4.0.251/v4.0.268)后,FFmpeg输出日志和ffprobe检测均显示流为单声道,但SRS网页管理端错误识别为立体声。对比测试显示,OBS直接推送单声道流时,SRS识别正常。
排查要点
- FLV封装元数据差异:FLV格式的AudioTag中包含
SoundType字段(0=单声道,1=立体声),SRS对声道数的识别可能优先依赖该字段,而非AAC帧的ADTS头信息。FFmpeg 4.4在封装FLV时可能未正确设置该字段,导致SRS误判。 - 流初始标记验证:用
flvmeta等工具分别抓取OBS和FFmpeg推流的前几个FLV包,对比两者AudioTag的SoundType值,确认FFmpeg是否错误标记为立体声。 - SRS解析逻辑确认:SRS对AAC流的声道数解析逻辑,可能存在优先读取FLV元数据而非解析AAC内部信息的情况,当元数据与实际帧信息不符时会出现识别错误。
解决方法
- 强制FFmpeg设置声道元数据
修改推流命令,明确指定音频流的声道数元数据,并强制编码器输出单声道布局:ffmpeg -i rtmp://127.0.0.1/live/livestream -vn -ac 1 -ar 22050 -c:a libfdk_aac -metadata:s:a:0 channels=1 -acodec_options "channel_layout=mono" -f flv rtmp://IP/live/livestream - 升级FFmpeg版本
FFmpeg 4.4存在FLV封装时声道元数据设置的已知问题,升级到5.x及以上版本可修复该类封装bug。 - SRS配置强制指定声道数(临时方案)
若无法调整FFmpeg,可在SRS配置文件中强制指定全局音频声道数,仅适用于所有流均为单声道的场景:vhost __defaultVhost__ { audio_channel 1; }
内容的提问来源于stack exchange,提问作者Zhufeng Tang
相关产品推荐
相关产品推荐

