ffmpeg(schannel编译版)向aiortc WHIP服务器推流时DTLS握手失败,提示“no SRTP profile negotiated”
ffmpeg(schannel编译版)向aiortc WHIP服务器推流时DTLS握手失败,提示“no SRTP profile negotiated”
嗨,我之前遇到过几乎一模一样的问题,大概率是schannel和aiortc在DTLS/SRTP加密套件的支持上不兼容导致的——毕竟schannel是Windows原生安全库,和aiortc依赖的OpenSSL在SRTP协商逻辑上有不少差异。给你几个具体的排查和解决步骤:
1. 给aiortc服务器强制指定兼容的SRTP套件
aiortc默认的DTLS/SRTP套件可能和schannel支持的不重叠,你可以在创建RTCPeerConnection时,明确指定双方都支持的通用加密套件:
pc = RTCPeerConnection( configuration=config, dtls_srtp_ciphers="AES_CM_128_HMAC_SHA1_80:AES_GCM_128" )
这两个是最广泛支持的SRTP加密套件,schannel和OpenSSL都能兼容,强制aiortc使用它们能大大提高协商成功的概率。
2. 给ffmpeg推流命令添加SRTP参数
在你的ffmpeg命令里,明确指定输出的SRTP套件,和服务器端保持一致:
ffmpeg -re -f lavfi -i testsrc=size=640x360:rate=30 -f lavfi -i sine=frequency=440:sample_rate=48000 \ -c:v libx264 -preset ultrafast -tune zerolatency -b:v 500k -g 30 -pix_fmt yuv420p \ -c:a libopus -b:a 128k -ac 2 \ -srtp_out_suite AES_CM_128_HMAC_SHA1_80 \ -f whip http://localhost:8080/whip
这样ffmpeg会主动用指定的套件发起协商,避免schannel默认选择aiortc不支持的套件。
3. 检查ffmpeg编译是否开启了SRTP支持
虽然你用了--enable-schannel,但还要确认ffmpeg是否开启了SRTP模块。运行ffmpeg -version,看输出里有没有--enable-srtp的字样,如果没有,需要重新编译ffmpeg并加上--enable-srtp选项(schannel和srtp可以共存,不用担心冲突)。
4. 临时验证:换OpenSSL编译的ffmpeg测试
如果条件允许,找一个用--enable-openssl编译的ffmpeg版本测试。如果这个版本能成功推流,就坐实了是schannel和aiortc的协商兼容性问题,接下来专注调整两边的套件配置即可。
额外调试技巧
- 给ffmpeg加上
-v debug参数,查看推流时的DTLS协商日志,找类似DTLS: supported cipher suites的输出,记录ffmpeg支持的套件。 - 对比aiortc的debug日志,看看服务器端提出的套件,找到两边的交集后,在双方都强制指定这个交集里的套件。
我之前就是通过强制指定AES_CM_128_HMAC_SHA1_80套件,解决了schannel版ffmpeg和aiortc的握手问题,你可以试试看!




