Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[技术咨询] 大华解码器RTSP播放异常 #3377

Closed
pinkcao opened this issue Mar 15, 2024 · 8 comments
Closed

[技术咨询] 大华解码器RTSP播放异常 #3377

pinkcao opened this issue Mar 15, 2024 · 8 comments

Comments

@pinkcao
Copy link

pinkcao commented Mar 15, 2024

咨询的功能模块

  • 流转发

咨询的具体内容和问题

  • 软件:wvp+zlm,wvp版本为最新,zlm版本为 1e39594
  • 硬件环境:4台服务器,1台大华解码器,1台大华摄像头,流为H265,2台部署zlm,2台部署wvp,wvp国标级联,在此分别描述为下级wvp A与上级wvp B。
  • 目的:上级wvp B点播下级wvp A注册的流打到解码器上并播放,解码器接受一个rtsp地址。
  • 调用过程:将大华摄像头的流以拉流代理的方式注册到下级wvp A中,并且将wvp A与wvp B级联,随后上级wvp B点播该流,得到流地址:rtsp://10.14.126.101:554/rtp/00168000000401000001_00168001001006001001 再将该流地址传给解码器播放。
  • 现象:解码器播放异常,异常图像如下:
    image

可见图像右侧无法正常显示。

  • 做过的尝试:直接使用下级wvp A给出的rtsp流地址: rtsp://10.14.116.8:554/01/1major 可正常播放,调用流程为将大华摄像头的流以拉流代理方式注册至下级wvp A中,在下级zlm中即得到了该流的rtsp地址rtsp://10.14.116.8:554/01/1major,随后将其打到解码器上。
    解码器播放正常,正常图像如下:
    image

将摄像头输出的流设置为H264,则均正常(但不能这样做,业务需求必须是H265)

由于下级出来的流可以正常播放,因此我认为可能是zlm对接zlm的时候可能存在异常。两台zlm的配置如下,其中尝试过将rtp.videoMtuSize从1400修改为1500,rtsp.directProxy设置为0,均没有解决问题:

{
            "api.apiDebug": "1",
            "api.defaultSnap": "./www/logo.png",
            "api.downloadRoot": "./www",
            "api.secret": "035c73f7-bb6b-4889-a715-d9eb2d1925cc",
            "api.snapRoot": "./www/snap/",
            "cluster.origin_url": "",
            "cluster.retry_count": "3",
            "cluster.timeout_sec": "15",
            "ffmpeg.bin": "/usr/bin/ffmpeg",
            "ffmpeg.cmd": "%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s",
            "ffmpeg.log": "./ffmpeg/ffmpeg.log",
            "ffmpeg.restart_sec": "0",
            "ffmpeg.snap": "%s -rtsp_transport tcp -i %s -y -f mjpeg -t 0.001 %s",
            "general.check_nvidia_dev": "1",
            "general.enableVhost": "0",
            "general.enable_ffmpeg_log": "0",
            "general.flowThreshold": "1024",
            "general.maxStreamWaitMS": "15000",
            "general.mediaServerId": "9W2RoUj7ByF4fYU4",
            "general.mergeWriteMS": "0",
            "general.resetWhenRePlay": "1",
            "general.streamNoneReaderDelayMS": "20000",
            "general.unready_frame_cache": "100",
            "general.wait_add_track_ms": "3000",
            "general.wait_track_ready_ms": "10000",
            "hls.broadcastRecordTs": "0",
            "hls.deleteDelaySec": "10",
            "hls.fastRegister": "0",
            "hls.fileBufSize": "65536",
            "hls.segDelay": "0",
            "hls.segDur": "2",
            "hls.segKeep": "0",
            "hls.segNum": "3",
            "hls.segRetain": "5",
            "hook.admin_params": "secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc",
            "hook.alive_interval": "30.000000",
            "hook.enable": "1",
            "hook.on_flow_report": "",
            "hook.on_http_access": "",
            "hook.on_play": "http://10.14.1.209:18080/index/hook/on_play",
            "hook.on_publish": "http://10.14.1.209:18080/index/hook/on_publish",
            "hook.on_record_mp4": "http://127.0.0.1:18081/api/record/on_record_mp4",
            "hook.on_record_ts": "",
            "hook.on_rtp_server_timeout": "http://10.14.1.209:18080/index/hook/on_rtp_server_timeout",
            "hook.on_rtsp_auth": "",
            "hook.on_rtsp_realm": "",
            "hook.on_send_rtp_stopped": "http://10.14.1.209:18080/index/hook/on_send_rtp_stopped",
            "hook.on_server_exited": "",
            "hook.on_server_keepalive": "http://10.14.1.209:18080/index/hook/on_server_keepalive",
            "hook.on_server_started": "http://10.14.1.209:18080/index/hook/on_server_started",
            "hook.on_shell_login": "",
            "hook.on_stream_changed": "http://10.14.1.209:18080/index/hook/on_stream_changed",
            "hook.on_stream_none_reader": "http://10.14.1.209:18080/index/hook/on_stream_none_reader",
            "hook.on_stream_not_found": "http://10.14.1.209:18080/index/hook/on_stream_not_found",
            "hook.retry": "1",
            "hook.retry_delay": "3.000000",
            "hook.stream_changed_schemas": "rtsp/rtmp/fmp4/ts/hls/hls.fmp4",
            "hook.timeoutSec": "20",
            "http.allow_cross_domains": "1",
            "http.allow_ip_range": "::1,127.0.0.1,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255,10.0.0.0-10.255.255.255",
            "http.charSet": "utf-8",
            "http.dirMenu": "1",
            "http.forbidCacheSuffix": "",
            "http.forwarded_ip_header": "",
            "http.keepAliveSecond": "15",
            "http.maxReqSize": "40960",
            "http.notFound": "<html><head><title>404 Not Found</title></head><body bgcolor=\"white\"><center><h1>您访问的资源不存在!</h1></center><hr><center>ZLMediaKit(git hash:15e7629/2023-05-14T10:19:07+08:00,branch:master,build time:2023-05-16T08:00:00)</center></body></html>",
            "http.port": "80",
            "http.rootPath": "./www",
            "http.sendBufSize": "65536",
            "http.sslport": "443",
            "http.virtualPath": "",
            "multicast.addrMax": "239.255.255.255",
            "multicast.addrMin": "239.0.0.0",
            "multicast.udpTTL": "64",
            "protocol.add_mute_audio": "1",
            "protocol.auto_close": "0",
            "protocol.continue_push_ms": "3000",
            "protocol.enable_audio": "1",
            "protocol.enable_fmp4": "1",
            "protocol.enable_hls": "1",
            "protocol.enable_hls_fmp4": "0",
            "protocol.enable_mp4": "0",
            "protocol.enable_rtmp": "1",
            "protocol.enable_rtsp": "1",
            "protocol.enable_ts": "1",
            "protocol.fmp4_demand": "0",
            "protocol.hls_demand": "0",
            "protocol.hls_save_path": "./www",
            "protocol.modify_stamp": "0",
            "protocol.mp4_as_player": "0",
            "protocol.mp4_max_second": "3600",
            "protocol.mp4_save_path": "./www",
            "protocol.paced_sender_ms": "0",
            "protocol.rtmp_demand": "0",
            "protocol.rtsp_demand": "0",
            "protocol.ts_demand": "0",
            "record.appName": "record",
            "record.enableFmp4": "0",
            "record.fastStart": "0",
            "record.fileBufSize": "65536",
            "record.fileRepeat": "0",
            "record.sampleMS": "500",
            "rtmp.directProxy": "1",
            "rtmp.enhanced": "0",
            "rtmp.handshakeSecond": "15",
            "rtmp.keepAliveSecond": "15",
            "rtmp.modifyStamp": "0",
            "rtmp.port": "1935",
            "rtmp.sslport": "19350",
            "rtp.audioMtuSize": "600",
            "rtp.h264_stap_a": "1",
            "rtp.lowLatency": "0",
            "rtp.rtpMaxSize": "10",
            "rtp.videoMtuSize": "1400",
            "rtp_proxy.dumpDir": "",
            "rtp_proxy.gop_cache": "1",
            "rtp_proxy.h264_pt": "98",
            "rtp_proxy.h265_pt": "99",
            "rtp_proxy.opus_pt": "100",
            "rtp_proxy.port": "10000",
            "rtp_proxy.port_range": "30000-30500",
            "rtp_proxy.ps_pt": "96",
            "rtp_proxy.rtp_g711_dur_ms": "100",
            "rtp_proxy.timeoutSec": "15",
            "rtp_proxy.udp_recv_socket_buffer": "4194304",
            "rtsp.authBasic": "0",
            "rtsp.directProxy": "1",
            "rtsp.handshakeSecond": "15",
            "rtsp.keepAliveSecond": "15",
            "rtsp.lowLatency": "0",
            "rtsp.port": "554",
            "rtsp.rtpTransportType": "-1",
            "rtsp.sslport": "332",
            "shell.maxReqSize": "1024",
            "shell.port": "9000",
            "srt.latencyMul": "4",
            "srt.pktBufSize": "8192",
            "srt.port": "9000",
            "srt.timeoutSec": "5"
        }

抓包文件如下,文件中已标明哪份为异常抓包哪份为正常抓包:
抓包文件.zip

注意事项

  • 技术咨询前请先认真阅读readme, wiki,如有必要,您也可以同时搜索已经答复的issue,如果没找到答案才在此提issue

  • 技术咨询不属于bug缺陷,要求用户先star(收藏)本项目,否则会直接关闭issue

@xia-chu
Copy link
Member

xia-chu commented Mar 17, 2024

听你的意思是 startSendRtp级联出现问题了,排查手段可以这样:

  • 1、观察上级zlm的日志 看看是否有丢包日志。
  • 2、使用ffplay、vlc播放上级zlm rtsp/rtmp/fmp4等协议,看看是否正常。

@xia-chu
Copy link
Member

xia-chu commented Mar 17, 2024

有可能是startSendRtp是udp模式 丢包了。不过听你的意思H264级联却没问题,猜测也可能是H265 ps打包有问题

@pinkcao
Copy link
Author

pinkcao commented Mar 18, 2024

有可能是startSendRtp是udp模式 丢包了。不过听你的意思H264级联却没问题,猜测也可能是H265 ps打包有问题

  1. 观察上级zlm日志,发现无丢包日志
  2. 使用vlc播放上级zlm rtsp, fmp4, hls可以正常播放,rtmp, flv无法正常播放
    image

如果是H265 ps打包有问题,我应该做什么修改?

@xia-chu
Copy link
Member

xia-chu commented Mar 18, 2024

rtmp本来就不支持265 vlc无法识别是正常的

@xia-chu
Copy link
Member

xia-chu commented Mar 18, 2024

那我怀疑 有没有可能是rtsp播放时 选择的udp模式 丢包了?

@pinkcao
Copy link
Author

pinkcao commented Mar 19, 2024

我们这里排查下来与网络问题应该是没有关系,从日志以及抓包看均无丢包现象,我们怀疑可能是解码器写死了payload type的解析,没有根据服务器给的rtpmap去做正确的解码,在下级流媒体正常解码的rtsp交互中,服务器给出的payload type为98,在上级流媒体异常解码的rtsp交互中,服务器给出的payload type为96,为了做测试,我有没有什么办法能够让上级流媒体在回复DESCRIBE时携带rtpmap:98 H265/90000 ?

@xia-chu
Copy link
Member

xia-chu commented Mar 19, 2024

打个补丁即可:

Index: src/Rtsp/RtspMuxer.cpp
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/Rtsp/RtspMuxer.cpp b/src/Rtsp/RtspMuxer.cpp
--- a/src/Rtsp/RtspMuxer.cpp	(revision 5a137f8b8ed3aafce7f05dd0b0291554738a14ae)
+++ b/src/Rtsp/RtspMuxer.cpp	(date 1710836327713)
@@ -67,7 +67,7 @@
     CHECK(!encoder);
 
     // payload type 96以后则为动态pt
-    Sdp::Ptr sdp = track->getSdp(96 + _index);
+    Sdp::Ptr sdp = track->getSdp(98 + _index);
     if (!sdp) {
         WarnL << "Unsupported codec: " << track->getCodecName();
         return false;

@xia-chu xia-chu closed this as completed Mar 22, 2024
@pinkcao
Copy link
Author

pinkcao commented Apr 1, 2024

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants