Toybrick

标题: Rockchip Linux Edge Python SDK在3588上rtsp失败 [打印本页]

作者: zylo117    时间: 2022-8-10 00:35
标题: Rockchip Linux Edge Python SDK在3588上rtsp失败
在3588上跑Rockchip Linux Edge Python SDK的rtsp拉流,在大华录像机上可以正常拉海康相机的流,得到GraphicBuffer。但是在海康相机上或者在rtsp-simple-server上拉都失败。
rtsp服务端提示401。明明用户密码都是正确的,用ffmpeg和vlc都可以正常硬解这个rtsp的!

然后程序提示E/: (binb in :316): SOCKET: udp bind socket (0.0.0.0:40190) failed. errno=22


感觉是兼容性不太好,请问怎么解决呢?



作者: jefferyzhang    时间: 2022-8-10 09:31
本帖最后由 jefferyzhang 于 2022-8-10 09:54 编辑

你这pysdk什么版本的?我这里海康是正常的。如果你版本是0.5.8,还是出问题的话,请提供下journalctl的日志,从你运行开始前到出错的部分就可以了。

作者: zylo117    时间: 2022-8-10 10:30
jefferyzhang 发表于 2022-8-10 09:31
你这pysdk什么版本的?我这里海康是正常的。如果你版本是0.5.8,还是出问题的话,请提供下journalctl的日志 ...

你好,是0.5.8的版本。
这个是journalctl日志。
大华的可以获取到GraphicBuffer,不过后面会有mpp的一些错误;而海康的是直接无法正常拉流

[attach]2410[/attach]


作者: jefferyzhang    时间: 2022-8-10 11:08
从你的log看握手都没起来,跟python sdk关系不大,你这个看过去rtsp地址就是不对的,
海康的地址格式一般是 rtsp://192.168.169.21/Streaming/Channels/101
而你log里的地址是:rtsp://192.188.10.4:554/Streaming/Channels/2
请先核查下地址
作者: zylo117    时间: 2022-8-10 11:54
地址是正确的,我用vlc和ffmpeg都是可以用这个地址直接播放的
作者: jefferyzhang    时间: 2022-8-10 12:39
zylo117 发表于 2022-8-10 11:54
地址是正确的,我用vlc和ffmpeg都是可以用这个地址直接播放的

你试下主流用这个地址能不能拉到:
rtsp://192.188.10.4/Streaming/Channels/101

作者: zylo117    时间: 2022-8-10 12:44
jefferyzhang 发表于 2022-8-10 12:39
你试下主流用这个地址能不能拉到:
rtsp://192.188.10.4/Streaming/Channels/101

我可以用vlc播放,看来101和1,102和2是一样的。但是还是不能用python sdk去拉流。
作者: zylo117    时间: 2022-8-10 12:51
本帖最后由 zylo117 于 2022-8-10 12:59 编辑
jefferyzhang 发表于 2022-8-10 12:39
你试下主流用这个地址能不能拉到:
rtsp://192.188.10.4/Streaming/Channels/101

另外我也试了一下,把大华的rtsp的帐号或者密码故意写错,也出现了一样的错误。
但是海康的帐号密码肯定是输入正确了的,因为vlc可以播放。
有没有可能是pysdk的rtsp鉴权部分不兼容呢?
因为不只是在海康,pc上的rtsp-simple-server(https://github.com/aler9/rtsp-simple-server)一样无法拉流。但是vlc和ffmpeg都是可以的.

然而,我的大华录像机和摄像头都可以pysdk拉流,但是他们都是非常老旧的,有没有可能是因为他们很旧,所以才兼容上pysdk,而新的就不行?


作者: jefferyzhang    时间: 2022-8-10 14:26
不要乱猜测,这两个都有客户用过是可以的,现在要调试下才能知道为什么你的海康是不行的。
请用下我们编译的带握手信息的debug版本跑下:

链接: https://pan.baidu.com/s/1xVBnb19Q111wvoHWrk3zyA?pwd=cttv 提取码: cttv 复制这段内容后打开百度网盘手机App,操作更方便哦

把这个deb包拷贝到板子上,然后执行 sudo apt reinstall ./python3-toybrick.deb
然后再运行下,把所有握手信息都发给我看下。
作者: zylo117    时间: 2022-8-10 14:42
jefferyzhang 发表于 2022-8-10 14:26
不要乱猜测,这两个都有客户用过是可以的,现在要调试下才能知道为什么你的海康是不行的。
请用下我们编译 ...

好的,这次增加了rtsp-simple-server的结果,和海康一样不能拉,只有大华可以

[attach]2411[/attach]



作者: jefferyzhang    时间: 2022-8-10 14:55
从log上看,你这两个都无法支持数字用户名认证,你再试试这个版本:
链接: https://pan.baidu.com/s/1gXpWFItd-h8ApJM6sOGuyg?pwd=qx2g 提取码: qx2g 复制这段内容后打开百度网盘手机App,操作更方便哦
不行的话log再给我看看。

如果想绕过,海康摄像头可以在后台从传统明文用户名密码校验方式改成数字认证方式就可以了,
rtsp-simple-server也可以改,你得自己研究下他的配置文件。或者最暴力的方式就是直接取消rtspserver的用户名密码

作者: zylo117    时间: 2022-8-10 15:10
jefferyzhang 发表于 2022-8-10 14:55
从log上看,你这两个都无法支持数字用户名认证,你再试试这个版本:
链接: https://pan.baidu.com/s/1gXpWF ...

我先试试。海康默认是digest,只能改成digest/basic。rtsp-simple-server可以二选一,但是选basic一样不行。
一开始就是没有密码的,但是pysdk那里,如果用户和密码为空字符串还是有这样的问题
作者: jefferyzhang    时间: 2022-8-10 15:13
zylo117 发表于 2022-8-10 15:10
我先试试。海康默认是digest,只能改成digest/basic。rtsp-simple-server可以二选一,但是选basic一样不 ...

要改成digest,pysdk默认就是digest方式,basic大部分支持
作者: zylo117    时间: 2022-8-10 15:19
jefferyzhang 发表于 2022-8-10 15:13
要改成digest,pysdk默认就是digest方式,basic大部分支持

默认就是digest的。用了新的deb还是不行。海康不行,大华的可以
[attach]2412[/attach]



作者: jefferyzhang    时间: 2022-8-10 15:22
zylo117 发表于 2022-8-10 15:19
默认就是digest的。用了新的deb还是不行。海康不行,大华的可以

你用wireshake抓一份vlc拉海康的rtsp报文,然后保存一份给我,我对比下两个有什么区别
作者: zylo117    时间: 2022-8-10 15:35
jefferyzhang 发表于 2022-8-10 15:22
你用wireshake抓一份vlc拉海康的rtsp报文,然后保存一份给我,我对比下两个有什么区别 ...

wireshark过滤rtsp的信息,vlc拉流海康rtsp

[attach]2413[/attach]



作者: jefferyzhang    时间: 2022-8-10 15:52
再试下这个版本:链接: https://pan.baidu.com/s/1jVd10QxUK_BwRcjyauBUZw?pwd=3yht 提取码: 3yht 复制这段内容后打开百度网盘手机App,操作更方便哦
这个版本锁死了只能走digest
作者: zylo117    时间: 2022-8-10 15:58
jefferyzhang 发表于 2022-8-10 15:52
再试下这个版本:链接: https://pan.baidu.com/s/1jVd10QxUK_BwRcjyauBUZw?pwd=3yht 提取码: 3yht 复制这段 ...

还是一样不行
[attach]2414[/attach]



作者: zylo117    时间: 2022-8-10 16:09
jefferyzhang 发表于 2022-8-10 15:22
你用wireshake抓一份vlc拉海康的rtsp报文,然后保存一份给我,我对比下两个有什么区别 ...

3588那个是在3588上用pysdk拉海康的流的wireshark抓包

[attach]2416[/attach]

[attach]2415[/attach]



作者: zylo117    时间: 2022-8-10 16:15
海康的rtsp认证是digest和digest/basic
rtsp摘要算法是md5, sha256, sha256/md5,有没有可能是摘要算法对不上呢?
[attach]2417[/attach]
file:///home/carl/Pictures/Screenshots/Screenshot%20from%202022-08-10%2016-14-18.png
作者: jefferyzhang    时间: 2022-8-10 16:32
试下这个链接: https://pan.baidu.com/s/1sLR31z6re8KvSLgMFbdLPQ?pwd=hecc 提取码: hecc 复制这段内容后打开百度网盘手机App,操作更方便哦
不用改那个,我大概知道原因,只是目前要试下怎么让你这个海康握手认证成功下
作者: zylo117    时间: 2022-8-10 16:57
jefferyzhang 发表于 2022-8-10 16:32
试下这个链接: https://pan.baidu.com/s/1sLR31z6re8KvSLgMFbdLPQ?pwd=hecc 提取码: hecc 复制这段内容后打 ...

海康现在可以了 ,大华也是可以。但是rtsp-simple-server还是不可以,日志信息也和之前不同了。
[attach]2418[/attach]




作者: zylo117    时间: 2022-8-10 17:04
接入rtsp-simple-server的时候,有时候会提示这个错误,请问是什么意思呢

[08/10 09:02:34.928] E/: (fill in :32): Buffer::fill size out of memory! 1224 > 1024
作者: zylo117    时间: 2022-8-10 17:06
现在rsp-simple-server应该是通的,但是最下面的那个fill size out of memory错误还导致崩溃退出
> PLAY rtsp://192.188.10.15:8554/mystream RTSP/1.0
CSeq: 5
Session: 1943921708
Range: 0.000-
User-Agent: Toy Rtsp Client/1.0

< RTSP/1.0 200 OK
< CSeq: 5
< RTP-Info: url=rtsp://192.188.10.15:8554/mystream/trackID=0;seq=4606;rtptime=646549777,url=rtsp://192.188.10.15:8554/mystream/trackID=1;seq=670;rtptime=694930700
< Server: gortsplib
< Session: 1943921708
<
* Connection #0 to host 192.188.10.15 left intact
* Found bundle for host 192.188.10.15: 0x7f7c020730 [serially]
* Re-using existing connection! (#0) with host 192.188.10.15
* Connected to 192.188.10.15 (192.188.10.15) port 8554 (#0)
* Connection #0 to host 192.188.10.15 left intact
* Found bundle for host 192.188.10.15: 0x7f7c020730 [serially]
* Re-using existing connection! (#0) with host 192.188.10.15
* Connected to 192.188.10.15 (192.188.10.15) port 8554 (#0)
* Connection #0 to host 192.188.10.15 left intact
* Found bundle for host 192.188.10.15: 0x7f7c020730 [serially]
* Re-using existing connection! (#0) with host 192.188.10.15
* Connected to 192.188.10.15 (192.188.10.15) port 8554 (#0)
[08/10 09:05:22.745] E/: (fill in :32): Buffer::fill size out of memory! 1337 > 1024

Process finished with exit code 134 (interrupted by signal 6: SIGABRT)

作者: zylo117    时间: 2022-8-10 17:08
如果是发布h265的rtsp,还会在这个基础上增加一条错误
[08/10 09:07:39.516] E/: (onTransmitIn in :133): H265 RTP cannot recognize f=0x0, type=0x0, layer=0x0, tid=0x1
作者: jefferyzhang    时间: 2022-8-10 17:10
zylo117 发表于 2022-8-10 17:08
如果是发布h265的rtsp,还会在这个基础上增加一条错误
[08/10 09:07:39.516] E/: (onTransmitIn in :133):  ...

没关系,稍等下,一个个来,我再改一个版本给你
作者: jefferyzhang    时间: 2022-8-10 17:29
用这个版本测试下:链接: https://pan.baidu.com/s/14YUXxkd8t439zCJPuk2P_g?pwd=xvsq 提取码: xvsq 复制这段内容后打开百度网盘手机App,操作更方便哦

如果海康可以用,而你那个simple server不能用的话,提供下 jouralctl的log,不需要握手log了,目前跟握手没关系了
作者: zylo117    时间: 2022-8-10 17:51
jefferyzhang 发表于 2022-8-10 17:29
用这个版本测试下:链接: https://pan.baidu.com/s/14YUXxkd8t439zCJPuk2P_g?pwd=xvsq 提取码: xvsq 复制这 ...

海康可以, simple的不行。这个是日志[attach]2419[/attach]


作者: jefferyzhang    时间: 2022-8-10 17:57
zylo117 发表于 2022-8-10 17:51
海康可以, simple的不行。这个是日志

从log上看是他的RTP封装不是很标准,帮忙抓个wireshake给我分析下,我需要过滤的RTP包,抓前100个左右就够了,我尝试看下有没有办法兼容这种不标准的封装。你那边也可以试试simple有没有其他版本。
作者: zylo117    时间: 2022-8-10 18:39
jefferyzhang 发表于 2022-8-10 17:57
从log上看是他的RTP封装不是很标准,帮忙抓个wireshake给我分析下,我需要过滤的RTP包,抓前100个左右就 ...

[attach]2420[/attach]
rtp抓包


作者: jefferyzhang    时间: 2022-8-10 19:06
你这个流有问题,支持不了,前四个RTP包只有4个byte,连RTP都不是,这种我没办法解析。

作者: zylo117    时间: 2022-8-10 19:18
jefferyzhang 发表于 2022-8-10 19:06
你这个流有问题,支持不了,前四个RTP包只有4个byte,连RTP都不是,这种我没办法解析。
...

但是ffmpeg和vlc都可以正常拉流和播放啊。这种服务对视频虚拟rtsp本地调试很有用的。能不能再想下办法支持呢?
另外,请问今天海康的握手认证的实现会同步到最新的pysdk中吗?以后更新了pysdk会失去这次的认证功能吗?


作者: zylo117    时间: 2022-8-10 21:18
jefferyzhang 发表于 2022-8-10 19:06
你这个流有问题,支持不了,前四个RTP包只有4个byte,连RTP都不是,这种我没办法解析。
...

抱歉,这个rtp是我发错了。这个才是,是可以过滤出rtp的[attach]2421[/attach]


作者: jefferyzhang    时间: 2022-8-11 08:52
zylo117 发表于 2022-8-10 19:18
但是ffmpeg和vlc都可以正常拉流和播放啊。这种服务对视频虚拟rtsp本地调试很有用的。能不能再想下办法支 ...

已经加进去了,回头等你这个问题处理完我们再发布。我看下怎么兼容,他这个simple server问题是RTP包的payload不标准,网络编码不能是0001,必须是2个字节的长度,而他这个发的0001我们没办法得到他整个264长度
作者: zylo117    时间: 2022-8-11 09:45
jefferyzhang 发表于 2022-8-11 08:52
已经加进去了,回头等你这个问题处理完我们再发布。我看下怎么兼容,他这个simple server问题是RTP包的pa ...

那就很奇怪了,因为vlc都可以播放的。我们公司以前一直都用这个软件进行本地调试
作者: jefferyzhang    时间: 2022-8-11 10:00
zylo117 发表于 2022-8-11 09:45
那就很奇怪了,因为vlc都可以播放的。我们公司以前一直都用这个软件进行本地调试 ...

vlc,ffm这些都对很多不标准做了兼容,能播是很正常的,但我们写代码都是按ITU标准白皮书编码的。
耗费的工时决定了兼容性高低
作者: zylo117    时间: 2022-8-11 11:13
jefferyzhang 发表于 2022-8-11 10:00
vlc,ffm这些都对很多不标准做了兼容,能播是很正常的,但我们写代码都是按ITU标准白皮书编码的。
耗费的 ...

我换了个视频,下面的这个错误就没了,
[08/10 09:02:34.928] E/: (fill in :32): Buffer::fill size out of memory! 1224 > 1024
变成了另一个错误,
[08/11 03:09:58.648] E/: (get in :286): decode_get_frame failed ret -8

journalctl日志是

Aug 11 03:12:19 python3.9[537817]: W/: (threadRtpFunc in :224): UDP-RTP receive timeout, exit it. rtsp://192.188.10.15:8554/mystream ; type = A>
Aug 11 03:12:20 python3.9[537817]: W/: (onTransmitIn in :61): rtp lost one packet ... mDebugCntRtpLost: 50808 > 50831
Aug 11 03:12:22 python3.9[537817]: E/: (get in :286): decode_get_frame failed ret -8
Aug 11 03:12:22 python3.9[537817]: W/: (onTransmitIn in :61): rtp lost one packet ... mDebugCntRtpLost: 51659 > 51704
Aug 11 03:12:23 python3.9[537817]: W/: (onTransmitIn in :61): rtp lost one packet ... mDebugCntRtpLost: 51747 > 51800
Aug 11 03:12:25 python3.9[537817]: E/: (get in :286): decode_get_frame failed ret -8
Aug 11 03:12:26 python3.9[537817]: D/: RTP264UP_UNIT [0x55b3d0b9a0] loss/recv:14.70/293.90 SEI|SPS|PPS|NI|I: 0.00|0.00|0.00|24.60|0.00
Aug 11 03:12:27 python3.9[537817]: W/: (threadRtpFunc in :224): UDP-RTP receive timeout, exit it. rtsp://192.188.10.15:8554/mystream ; type = A>
Aug 11 03:12:28 python3.9[537817]: E/: (get in :286): decode_get_frame failed ret -8
Aug 11 03:12:29 python3.9[537817]: W/: (onTransmitIn in :61): rtp lost one packet ... mDebugCntRtpLost: 53684 > 53691
Aug 11 03:12:31 python3.9[537817]: E/: (get in :286): decode_get_frame failed ret -8

作者: jefferyzhang    时间: 2022-8-11 11:23
zylo117 发表于 2022-8-11 11:13
我换了个视频,下面的这个错误就没了,
[08/10 09:02:34.928] E/: (fill in :32): Buffer::fill size out ...

这log明显丢包了
作者: zylo117    时间: 2022-8-11 11:49
本帖最后由 zylo117 于 2022-8-11 11:53 编辑
jefferyzhang 发表于 2022-8-11 11:23
这log明显丢包了

换硬解就没有丢包了。
提示这个程序就崩溃了。
E/: (get in :286): decode_get_frame failed ret -8

[08/11 03:48:25.083] T/: decode_get_frame get info changed found
[08/11 03:48:25.083] T/: decoder require buffer w:h [640:360] stride [640:368] size 471040

journalctl日志是
g 11 03:45:47 python3.9[544210]: D/: # Found[1] server_port: 8000 - 8001
Aug 11 03:45:47 python3.9[544210]: D/: # Found[1] port: 8000 - 8001
Aug 11 03:45:47 python3.9[544210]: W/: (startCurl in :651): RtspClient: audio track no found !
Aug 11 03:45:47 python3.9[544210]: D/: RtspClient: state changed ! CONNECTING -> CONNECTED
Aug 11 03:45:47 python3.9[544210]: D/: Video SSRC Changed! 0 -> 2752882705
Aug 11 03:45:47 python3.9[544210]: D/: RTP264UP_UNIT [0x558e883820] loss/recv: 0.00/ 0.10 SEI|SPS|PPS|NI|I: 0.00|0.00|0.00|0.10|0.00
Aug 11 03:45:47 python3.9[544210]: W/: (transmitTo in :39): [0x558e874c48] transmitIn buffer PT_RTP_VIDEO is filter out by RTPUP_AAC_UNIT
Aug 11 03:45:47 python3.9[544210]: mpp_info: mpp version: 8a85dc5d author: Herman Chen   2022-03-14 [mpp_enc]: Fix stuck on reset async mode en>
Aug 11 03:45:47 python3.9[544210]: mpp_rt: NOT found ion allocator
Aug 11 03:45:47 python3.9[544210]: mpp_rt: found drm allocator
Aug 11 03:45:47 python3.9[544210]: W/: (transmitTo in :39): [0x558e874c48] transmitIn buffer PT_RTP_VIDEO is filter out by RTPUP_AAC_UNIT
Aug 11 03:45:47 python3.9[544210]: W/: (transmitTo in :39): [0x558e874c48] transmitIn buffer PT_RTP_VIDEO is filter out by RTPUP_AAC_UNIT
Aug 11 03:45:47 python3.9[544210]: W/: (transmitTo in :39): [0x558e874c48] transmitIn buffer PT_RTP_VIDEO is filter out by RTPUP_AAC_UNIT
Aug 11 03:45:47 python3.9[544210]: W/: (transmitTo in :39): [0x558e874c48] transmitIn buffer PT_RTP_VIDEO is filter out by RTPUP_AAC_UNIT
Aug 11 03:45:47 python3.9[544210]: W/: (transmitTo in :39): [0x558e874c48] transmitIn buffer PT_RTP_VIDEO is filter out by RTPUP_AAC_UNIT
Aug 11 03:45:47 python3.9[544210]: W/: (transmitTo in :39): [0x558e874c48] transmitIn buffer PT_RTP_VIDEO is filter out by RTPUP_AAC_UNIT
Aug 11 03:45:47 python3.9[544210]: W/: (transmitTo in :39): [0x558e874c48] transmitIn buffer PT_RTP_VIDEO is filter out by RTPUP_AAC_UNIT
Aug 11 03:45:47 python3.9[544210]: W/: (transmitTo in :39): [0x558e874c48] transmitIn buffer PT_RTP_VIDEO is filter out by RTPUP_AAC_UNIT
Aug 11 03:45:47 python3.9[544210]: W/: (transmitTo in :39): [0x558e874c48] transmitIn buffer PT_RTP_VIDEO is filter out by RTPUP_AAC_UNIT

作者: jefferyzhang    时间: 2022-8-11 12:01
zylo117 发表于 2022-8-11 11:49
换硬解就没有丢包了。
提示这个程序就崩溃了。
E/: (get in :286): decode_get_frame failed ret -8

你这log并没有崩溃啊
作者: zylo117    时间: 2022-8-11 12:19
jefferyzhang 发表于 2022-8-11 12:01
你这log并没有崩溃啊

好吧,刚刚是我配置问题。
现在还是老问题,会出现这种错误,然后崩溃
E/: (fill in :32): Buffer::fill size out of memory! 1337 > 1024

Aug 11 04:19:01 python3.9[550566]: D/: RtspClient: state changed ! CONNECTING -> CONNECTED
Aug 11 04:19:01 python3.9[550566]: D/: Video SSRC Changed! 0 -> 2290526379
Aug 11 04:19:01 python3.9[550566]: D/: Audio SSRC Changed! 0 -> 1341825817
Aug 11 04:19:01 python3.9[550566]: W/: (transmitTo in :39): [0x55c268de60] transmitIn buffer PT_RTP_AUDIO is filter out by RTPVUP_UNIT_SE
Aug 11 04:19:01 python3.9[550566]: D/: RTP264UP_UNIT [0x55c269ca10] loss/recv: 0.00/ 0.10 SEI|SPS|PPS|NI|I: 0.00|0.00|0.00|0.00|0.00
Aug 11 04:19:01 python3.9[550566]: W/: (transmitTo in :39): [0x55c268de68] transmitIn buffer PT_RTP_VIDEO is filter out by RTPUP_AAC_UNIT
Aug 11 04:19:01 python3.9[550566]: E/: (fill in :32): Buffer::fill size out of memory! 1155 > 1024
Aug 11 04:19:01 python3.9[550566]: W/: (transmitTo in :39): [0x55c268de68] transmitIn buffer PT_RTP_VIDEO is filter out by RTPUP_AAC_UNIT

作者: jefferyzhang    时间: 2022-8-11 12:21
zylo117 发表于 2022-8-11 12:19
好吧,刚刚是我配置问题。
现在还是老问题,会出现这种错误,然后崩溃
E/: (fill in :32): Buffer::fill  ...

这个问题等我处理完再测
作者: MWM    时间: 2022-8-12 10:38
官方的demo在哪里呀  

我自己按照api写,多路解码的时候好像撑不住
1
  1.     for x in range(6):
  2.         for y in range(2):
  3.             idx = gl.addview(x*D_W, y*D_H, D_W, D_H)
  4.             td = threading.Thread(target=func_rtspdisplay, args=(gl, idx, cam_url, cam_user, cam_pwd))
  5.             td.start()
复制代码

> [4] got frame. use = 0.134155 s
[08/12 02:34:06.465] T/: decode_get_frame get info changed found

[08/12 02:34:06.465] T/: decoder require buffer w:h [1280:720] stride [1280:720] size 1843200

Segmentation fault
作者: jefferyzhang    时间: 2022-8-12 14:23
MWM 发表于 2022-8-12 10:38
官方的demo在哪里呀  

我自己按照api写,多路解码的时候好像撑不住

用gdb跟下错误堆栈在哪里,回头我也试下




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3