FFmpeg调用含凭证的Milestone ONB RTSP URL时出现DESCRIBE 401 Unauthorized错误,VLC可正常访问的问题排查求助
问题梳理
你碰到的情况很典型:带用户名密码的RTSP URL在VLC里能正常拉流,但用FFmpeg调用就报method DESCRIBE failed: 401 Unauthorized,哪怕换了最新版的Docker镜像alfg/ffmpeg:latest也没解决。你的核心需求是实时转码这个带认证的RTSP流,再推送到RTSP Simple Server,其他环节都没问题,唯独卡在认证这一步。
找到问题根源
从你更新的信息来看,罪魁祸首是Milestone Open Network Bridge(ONB)服务器返回的响应里有两个WWW-Authenticate字段:
WWW-Authenticate: Digest realm="RtspServerLibrary", nonce="3JY4rKzboHUqFVrC9yZuSAeUpGiun3BT", algorithm="MD5"
WWW-Authenticate: Digest realm="RtspServerLibrary", nonce="3JY4rKzboHUqFVrC9yZuSAeUpGiun3BT", algorithm="SHA-256"
VLC之所以能正常工作,是因为它会自动提取凭证,然后选一种认证算法提交;但FFmpeg目前还不支持处理多个认证选项,直接就卡壳了。
可行的修复方案
根据Milestone的官方支持文档,你可以试试这几个方法:
1. 强制指定认证算法
直接在FFmpeg命令里指定用MD5或者SHA-256,不让它去处理多个选项。建议加上-rtsp_transport tcp保证传输稳定,再搭配认证相关参数:
ffmpeg -rtsp_transport tcp -auth_type digest -rtsp_flags prefer_tcp -i rtsp://username:password@server:554/path -c:v copy -c:a copy rtsp://your-rtsp-simple-server/stream-path
如果MD5不行,就换成SHA-256试试,最新版FFmpeg应该都支持这两种算法。
2. 手动构造认证头(进阶操作)
要是上面的方法不管用,你可以用Wireshark抓VLC成功拉流的请求,把它的Authorization头直接拿过来给FFmpeg用。用-headers参数传入自定义头部:
ffmpeg -rtsp_transport tcp -headers "Authorization: Digest username=\"你的用户名\", realm=\"RtspServerLibrary\", nonce=\"抓包拿到的nonce值\", uri=\"/path\", response=\"抓包拿到的response值\"" -i rtsp://server:554/path -c:v copy -c:a copy rtsp://your-rtsp-simple-server/stream-path
注意:nonce是会过期的,每次抓包要拿最新的;response值是按照Digest认证规则计算出来的,直接复制VLC请求里的就行。
3. 等FFmpeg官方修复(长期方案)
现在这个问题已经被反馈给FFmpeg团队了,后续版本可能会支持处理多个WWW-Authenticate选项,你可以关注一下官方更新。
验证方法
修复之后,你可以这么验证是否成功:
- 运行FFmpeg命令,观察是否还会出现401错误
- 用Wireshark抓包,确认FFmpeg发送的认证请求是否正确选择了其中一种算法
- 检查RTSP Simple Server是否能正常接收转码后的流
内容的提问来源于stack exchange,提问作者IpsRich




