You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

FFmpeg调用含凭证的Milestone ONB RTSP URL时出现DESCRIBE 401 Unauthorized错误,VLC可正常访问的问题排查求助

解决FFmpeg连接Milestone ONB RTSP流的401 Unauthorized问题

问题梳理

你碰到的情况很典型:带用户名密码的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

火山引擎 最新活动