ZLMediaKit / ZLMediaKit

WebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT server and client framework based on C++11
https://docs.zlmediakit.com
Other
13.66k stars 3.37k forks source link

[BUG] wvp对执法记录仪发起语音对讲时,webrtc推流至zlm报错 #3152

Closed lr897219186 closed 8 months ago

lr897219186 commented 8 months ago

现象描述

wvp联调zlm:wvp向执法记录仪对讲,前端发起推流请求将webrtc流推至zlm,但是zlm日志显示 WebRtcSession.cpp:104 onError | 5-92(192.168.1.102:61240) 1(end of file) 的报错;后续请求 /index/api/startSendRtp 接口时zlm回复拒绝连接 "connection refused"

如何复现?

wvp前端页面发起语音对讲时必现: 1、发起语音对讲请求后,组装webrtc地址(如http://192.168.1.200/index/api/webrtc?app=audio&stream=34020000002000000008_34020000002000000008&type=push&sign=41db35390ddad33f83944f44b8b75ded),由前端推流给zlm; image image 2、前端推送zlm且收到zlm的返回成功后,请求wvp后端接口,后端开始与执法记录仪进行sip信令交互; 3、信令交互完成后,后端通过rtp推流的方式将语音推送给第1步已经注册好的流媒体中 image

相关日志或截图

webrtc推流报错: Snipaste_2023-12-22_16-52-39

请求 /index/api/startSendRtp 接口拒绝连接: Snipaste_2023-12-22_17-08-09

webrtc推流报错日志:
2023-12-22 16:40:06.786 D [MediaServer] [19493-event poller 2] WebApi.cpp:260 http api debug | 
# request:
POST /index/api/webrtc?app=audio&stream=34020000002000000008_34020000002000000008&type=push&sign=41db35390ddad33f83944f44b8b75ded
# header:
Accept : application/json, text/plain, */*
Accept-Encoding : gzip, deflate
Accept-Language : zh-CN,zh;q=0.9
Connection : keep-alive
Content-Length : 1457
Content-Type : text/plain;charset=UTF-8
Host : 192.168.1.200
Origin : http://127.0.0.1:8080
Referer : http://127.0.0.1:8080/
User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36
# content:
v=0
o=- 3171467370455362545 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0
a=extmap-allow-mixed
a=msid-semantic: WMS
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 0 8 106 105 13 110 112 113 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:zVK+
a=ice-pwd:FvH9+zYNAmc75RpiOfSq+Q9q
a=ice-options:trickle
a=fingerprint:sha-256 01:1D:6F:81:E9:4C:1A:1F:C2:AF:03:BE:FE:AC:A6:E3:1F:DF:71:C5:E1:8F:CB:43:78:52:CB:62:05:7A:DF:C5
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=sendrecv
a=msid:- 4f7ecf52-5591-4579-9f09-9a30275743a2
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:63 red/48000/2
a=fmtp:63 111/111
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
a=ssrc:3357273320 cname:ahvmXo1JJj42Q9fP
a=ssrc:3357273320 msid:- 4f7ecf52-5591-4579-9f09-9a30275743a2
a=ssrc:3357273320 mslabel:-
a=ssrc:3357273320 label:4f7ecf52-5591-4579-9f09-9a30275743a2

# response:
{
    "code" : 0,
    "id" : "wKgByB9AH0A=_1",
    "sdp" : "v=0\r\no=- 3171467370455362545 2 IN IP4 192.168.1.200\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0\r\na=msid-semantic: WMS\r\na=ice-lite\r\nm=audio 8000 UDP/TLS/RTP/SAVPF 8\r\nc=IN IP4 192.168.1.200\r\na=rtcp:8000 IN IP4 192.168.1.200\r\na=ice-ufrag:wKgByB9AH0A=_1\r\na=ice-pwd:gDuJko8OOmwa65YLg9X7C4b1\r\na=ice-options:trickle\r\na=fingerprint:sha-256 5D:43:0F:2C:BD:82:BB:C5:B4:77:42:D3:8C:2B:D5:1A:32:59:39:1D:78:7A:BB:88:E2:EF:2A:60:37:AD:6E:A3\r\na=setup:passive\r\na=mid:0\r\na=ice-lite\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:8 PCMA/8000/1\r\na=candidate:udpcandidate 1 udp 110 192.168.1.200 8000 typ host\r\na=candidate:tcpcandidate 1 tcp 105 192.168.1.200 8000 typ host tcptype passive\r\n",
    "type" : "answer"
}

2023-12-22 16:40:06.886 W [MediaServer] [19493-event poller 2] WebRtcSession.cpp:104 onError | 5-92(192.168.1.102:61240) 1(end of file)
2023-12-22 16:40:06.886 W [MediaServer] [19493-event poller 2] WebRtcSession.cpp:104 onError | 6-91(192.168.1.102:61241) 1(end of file)
2023-12-22 16:40:06.916 I [MediaServer] [19493-event poller 2] WebRtcSession.cpp:85 onRecv_l | 8-90(192.168.1.102:54842) 
2023-12-22 16:40:06.917 D [MediaServer] [19493-event poller 2] IceServer.cpp:340 HandleTuple | transition from state 'new' to 'connected'
2023-12-22 16:40:06.917 I [MediaServer] [19493-event poller 2] WebRtcTransport.cpp:165 OnIceServerSelectedTuple | wKgByB9AH0A=_1 select tuple udp 192.168.1.102:54842
2023-12-22 16:40:06.917 I [MediaServer] [19493-event poller 2] WebRtcTransport.cpp:171 OnIceServerConnected | wKgByB9AH0A=_1
2023-12-22 16:40:06.917 E [MediaServer] [19493-event poller 2] DtlsTransport.cpp:744 ProcessDtlsData | cannot process data while not running
2023-12-22 16:40:06.979 D [MediaServer] [19493-event poller 2] IceServer.cpp:429 HandleTuple | transition from state 'connected' to 'completed'
2023-12-22 16:40:06.979 I [MediaServer] [19493-event poller 2] WebRtcTransport.cpp:175 OnIceServerCompleted | wKgByB9AH0A=_1
2023-12-22 16:40:06.979 I [MediaServer] [19493-event poller 2] WebRtcTransport.cpp:210 OnDtlsTransportConnecting | wKgByB9AH0A=_1
2023-12-22 16:40:06.979 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:699 Run | running [role:server]
2023-12-22 16:40:06.979 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1411 OnSslInfo | DTLS handshake start
2023-12-22 16:40:06.979 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'before SSL initialization']
2023-12-22 16:40:06.979 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1407 OnSslInfo | role: server, waiting:'before SSL initialization']
2023-12-22 16:40:06.979 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'before SSL initialization']
2023-12-22 16:40:06.979 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'SSLv3/TLS read client hello']
2023-12-22 16:40:06.979 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'SSLv3/TLS write server hello']
2023-12-22 16:40:06.979 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'SSLv3/TLS write certificate']
2023-12-22 16:40:06.981 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'SSLv3/TLS write key exchange']
2023-12-22 16:40:06.981 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'SSLv3/TLS write certificate request']
2023-12-22 16:40:06.981 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'SSLv3/TLS write server done']
2023-12-22 16:40:06.981 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1407 OnSslInfo | role: server, waiting:'SSLv3/TLS write server done']
2023-12-22 16:40:06.981 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:977 SendPendingOutgoingDtlsData | 2117 bytes of DTLS data ready to sent to the peer
2023-12-22 16:40:06.981 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1015 SetTimeout | DTLS timer set in 99ms
2023-12-22 16:40:06.982 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'SSLv3/TLS write server done']
2023-12-22 16:40:06.982 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'SSLv3/TLS read client certificate']
2023-12-22 16:40:06.982 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'SSLv3/TLS read client key exchange']
2023-12-22 16:40:06.983 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'SSLv3/TLS read certificate verify']
2023-12-22 16:40:06.983 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'SSLv3/TLS read change cipher spec']
2023-12-22 16:40:06.983 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'SSLv3/TLS read finished']
2023-12-22 16:40:06.983 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'SSLv3/TLS write change cipher spec']
2023-12-22 16:40:06.983 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1369 OnSslInfo | [role:server, action:'SSLv3/TLS write finished']
2023-12-22 16:40:06.983 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1415 OnSslInfo | DTLS handshake done
2023-12-22 16:40:06.983 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:977 SendPendingOutgoingDtlsData | 67 bytes of DTLS data ready to sent to the peer
2023-12-22 16:40:06.983 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1166 CheckRemoteFingerprint | valid remote fingerprint
2023-12-22 16:40:06.983 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1340 GetNegotiatedSrtpCryptoSuite | chosen SRTP crypto suite: SRTP_AEAD_AES_256_GCM
2023-12-22 16:40:06.983 I [MediaServer] [19493-event poller 2] WebRtcTransport.cpp:192 OnDtlsTransportConnected | wKgByB9AH0A=_1
2023-12-22 16:40:06.983 D [MediaServer] [19493-event poller 2] SrtpSession.cpp:97 DepLibSRTP | libsrtp version: "libsrtp2 2.3.0"
2023-12-22 16:40:07.007 I [MediaServer] [19493-event poller 2] WebRtcTransport.cpp:951 createRtpChannel | create rtp receiver of ssrc:3357273320, rid:, codec:PCMA
2023-12-22 16:40:07.009 I [MediaServer] [19493-event poller 2] MediaSource.cpp:517 emitEvent | 媒体注册:rtsp://__defaultVhost__/audio/34020000002000000008_34020000002000000008
2023-12-22 16:40:07.028 D [MediaServer] [19493-event poller 2] MediaSink.cpp:161 emitAllTrackReady | All track ready use 40ms
2023-12-22 16:40:07.030 I [MediaServer] [19493-event poller 2] MediaSource.cpp:517 emitEvent | 媒体注册:fmp4://__defaultVhost__/audio/34020000002000000008_34020000002000000008
2023-12-22 16:40:07.031 I [MediaServer] [19493-event poller 2] MultiMediaSourceMuxer.cpp:551 onAllTrackReady | stream: rtc://192.168.1.200/audio/34020000002000000008_34020000002000000008?app=audio&stream=34020000002000000008_34020000002000000008&type=push&sign=41db35390ddad33f83944f44b8b75ded&session=4-88 , codec info: PCMA[8000/1/16] 
2023-12-22 16:40:07.032 I [MediaServer] [19493-event poller 2] MediaSource.cpp:517 emitEvent | 媒体注册:rtmp://__defaultVhost__/audio/34020000002000000008_34020000002000000008
2023-12-22 16:40:07.033 I [MediaServer] [19493-event poller 2] MediaSource.cpp:517 emitEvent | 媒体注册:ts://__defaultVhost__/audio/34020000002000000008_34020000002000000008
2023-12-22 16:40:07.214 D [MediaServer] [19493-event poller 2] WebApi.cpp:260 http api debug | 
# request:
POST /index/api/startSendRtp
# header:
Accept-Encoding : gzip
Connection : Keep-Alive
Content-Length : 221
Content-Type : application/x-www-form-urlencoded
Host : 192.168.1.200
User-Agent : okhttp/4.10.0
# content:
secret=8w45q9thKzhxS0GJ3XUqXaNThmaTMgAf&app=audio&src_port=50002&vhost=__defaultVhost__&use_ps=0&is_udp=0&pt=0&stream=34020000002000000008_34020000002000000008&ssrc=1422143671&dst_port=0&dst_url=192.168.1.103&only_audio=1
# response:
{
    "code" : -1,
    "local_port" : 0,
    "msg" : "connection refused"
}

2023-12-22 16:40:07.214 I [MediaServer] [19493-event poller 2] RawEncoder.cpp:28 ~RawEncoderImp | 0x7fdea803fa00 54C430B7
2023-12-22 16:40:09.027 I [MediaServer] [19493-event poller 2] MediaSource.cpp:517 emitEvent | 媒体注册:hls://__defaultVhost__/audio/34020000002000000008_34020000002000000008
2023-12-22 16:40:16.916 W [MediaServer] [19493-event poller 2] WebRtcSession.cpp:104 onError | 7-95(192.168.1.102:61242) 1(end of file)
2023-12-22 16:40:25.966 D [MediaServer] [19493-event poller 2] WebApi.cpp:260 http api debug | 
# request:
POST /index/api/stopSendRtp
# header:
Accept-Encoding : gzip
Connection : Keep-Alive
Content-Length : 137
Content-Type : application/x-www-form-urlencoded
Host : 192.168.1.200
User-Agent : okhttp/4.10.0
# content:
secret=8w45q9thKzhxS0GJ3XUqXaNThmaTMgAf&app=audio&vhost=__defaultVhost__&stream=34020000002000000008_34020000002000000008&ssrc=1422143671
# response:
{
    "code" : -1,
    "msg" : "stopSendRtp failed"
}

2023-12-22 16:40:25.977 W [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1391 OnSslInfo | received DTLS warning alert: close notify
2023-12-22 16:40:25.977 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:935 CheckStatus | disconnected
2023-12-22 16:40:25.977 W [MediaServer] [19493-event poller 2] DtlsTransport.cpp:842 Reset | resetting DTLS transport
2023-12-22 16:40:25.977 D [MediaServer] [19493-event poller 2] DtlsTransport.cpp:1395 OnSslInfo | sending DTLS warning alert: close notify

配置

zlm配置文件:

展开查看详细配置
; auto-generated by mINI class {

[api]
apiDebug=1
defaultSnap=./www/logo.png
downloadRoot=./www
secret=8w45q9thKzhxS0GJ3XUqXaNThmaTMgAf
snapRoot=./www/snap/

[cluster]
origin_url=
retry_count=3
timeout_sec=15

[ffmpeg]
bin=/usr/bin/ffmpeg
cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s
log=./ffmpeg/ffmpeg.log
restart_sec=0
snap=%s -rtsp_transport tcp -i %s -y -f mjpeg -t 0.001 %s

[general]
check_nvidia_dev=1
enableVhost=0
enable_ffmpeg_log=0
flowThreshold=1024
maxStreamWaitMS=15000
mediaServerId=lr_zlm
mergeWriteMS=0
resetWhenRePlay=1
streamNoneReaderDelayMS=20000
unready_frame_cache=100
wait_add_track_ms=3000
wait_track_ready_ms=10000

[hls]
broadcastRecordTs=0
deleteDelaySec=10
fastRegister=0
fileBufSize=65536
segDur=2
segKeep=0
segNum=3
segRetain=5

[hook]
alive_interval=10.0
enable=1
on_flow_report=
on_http_access=
on_play=http://192.168.1.102:18080/index/hook/on_play
on_publish=http://192.168.1.102:18080/index/hook/on_publish
on_record_mp4=http://127.0.0.1:18081/api/record/on_record_mp4
on_record_ts=
on_rtp_server_timeout=http://192.168.1.102:18080/index/hook/on_rtp_server_timeout
on_rtsp_auth=
on_rtsp_realm=
on_send_rtp_stopped=http://192.168.1.102:18080/index/hook/on_send_rtp_stopped
on_server_exited=
on_server_keepalive=http://192.168.1.102:18080/index/hook/on_server_keepalive
on_server_started=http://192.168.1.102:18080/index/hook/on_server_started
on_shell_login=
on_stream_changed=http://192.168.1.102:18080/index/hook/on_stream_changed
on_stream_none_reader=http://192.168.1.102:18080/index/hook/on_stream_none_reader
on_stream_not_found=http://192.168.1.102:18080/index/hook/on_stream_not_found
retry=1
retry_delay=3.0
stream_changed_schemas=rtsp/rtmp/fmp4/ts/hls/hls.fmp4
timeoutSec=20

[http]
allow_cross_domains=1
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
charSet=utf-8
dirMenu=1
forbidCacheSuffix=
forwarded_ip_header=
keepAliveSecond=30
maxReqSize=40960
notFound=404 Not Found

您访问的资源不存在!


ZLMediaKit(git hash:22732ea/%aI,branch:master,build time:2023-12-04T16:13:07)
port=80 rootPath=./www sendBufSize=65536 sslport=443 virtualPath= [multicast] addrMax=239.255.255.255 addrMin=239.0.0.0 udpTTL=64 [protocol] add_mute_audio=1 auto_close=0 continue_push_ms=3000 enable_audio=1 enable_fmp4=1 enable_hls=1 enable_hls_fmp4=0 enable_mp4=0 enable_rtmp=1 enable_rtsp=1 enable_ts=1 fmp4_demand=0 hls_demand=0 hls_save_path=./www modify_stamp=2 mp4_as_player=0 mp4_max_second=3600 mp4_save_path=G:\media\lin\Server\ZLMediaKit\dev\ZLMediaKit\release\linux\Debug\www paced_sender_ms=0 rtmp_demand=0 rtsp_demand=0 ts_demand=0 [record] appName=record fastStart=0 fileBufSize=65536 fileRepeat=0 sampleMS=500 [rtc] externIP=192.168.1.200 port=8000 preferredCodecA=PCMA,PCMU,opus,mpeg4-generic preferredCodecV=H264,H265,AV1,VP9,VP8 rembBitRate=0 tcpPort=8000 timeoutSec=15 [rtmp] handshakeSecond=15 keepAliveSecond=15 port=1935 sslport=0 [rtp] audioMtuSize=600 h264_stap_a=1 lowLatency=0 rtpMaxSize=10 videoMtuSize=1400 [rtp_proxy] dumpDir= gop_cache=1 h264_pt=98 h265_pt=99 opus_pt=100 port=10000 port_range=50000-50300 ps_pt=96 timeoutSec=15 [rtsp] authBasic=0 directProxy=1 handshakeSecond=15 keepAliveSecond=15 lowLatency=0 port=554 rtpTransportType=-1 sslport=0 [shell] maxReqSize=1024 port=0 [srt] latencyMul=4 pktBufSize=8192 port=9000 timeoutSec=5 ; } ---

wvp流媒体部分的配置:

展开查看详细配置
media:
  id: lr_zlm
  # [必须修改] zlm服务器的内网IP
  ip: 192.168.1.200
  # [必须修改] zlm服务器的http.port
  http-port: 80
  # [可选] 返回流地址时的ip,置空使用 media.ip
  stream-ip: 192.168.1.200
  # [可选] wvp在国标信令中使用的ip,此ip为摄像机可以访问到的ip, 置空使用 media.ip
  sdp-ip: 192.168.1.200
  # [可选] zlm服务器的hook所使用的IP, 默认使用sip.ip
  hook-ip: 192.168.1.102
  # [可选] zlm服务器的http.sslport, 置空使用zlm配置文件配置
  http-ssl-port: 443
  # [可选] zlm服务器的hook.admin_params=secret
  secret: 8w45q9thKzhxS0GJ3XUqXaNThmaTMgAf
  # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试
  rtp:
    # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输
    enable: true
    # [可选] 在此范围内选择端口用于媒体流传输, 必须提前在zlm上配置该属性,不然自动配置此属性可能不成功
    port-range: 50000,50300 # 端口范围
    # [可选] 国标级联在此范围内选择端口发送媒体流,
    send-port-range: 50000,50300 # 端口范围
  # 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用
  record-assist-port: 18081

各种环境信息

walkTtalk commented 8 months ago

dst_port=0 ?

MengFanLu1 commented 8 months ago

这不是webrtc的问题还是你的信令或者接口调用有问题

lr897219186 commented 8 months ago

这不是webrtc的问题还是你的信令或者接口调用有问题

ok我再检查下,谢谢

lr897219186 commented 8 months ago

dst_port=0 ?

这好像确实不对,我检查下