pion / example-webrtc-applications Goto Github PK
View Code? Open in Web Editor NEWExamples of WebRTC applications that are large, or use 3rd party libraries
Home Page: https://pion.ly/
License: MIT License
Examples of WebRTC applications that are large, or use 3rd party libraries
Home Page: https://pion.ly/
License: MIT License
The "gstreamer-receive" application is sharing screenshots for desktops, but sharing only cameras on Android devices. The screen sharing app on Android devices can be nice.
Enormous thanks to all who contributed to developing these wonderful Pion-webRTC applications.
I'm experimenting with SFU-WS to develop a video conferencing tool.
Although things work like a charm, I'm clueless about how to run multiple conferences (like we know from Microsoft Teams or Zoom). Here is an example of what I'm trying to do:
Room 1: https://localhost:7676/?room-id=12345
Participants of room 1 = A, B, C, D
Room 2: https://localhost:7676/?room-id=67890
Participants of room 2 = E, F, G, H
I can imagine that a static session-id must be passed to
peerConnection, err := webrtc.NewPeerConnection(webrtc.Configuration{})
However, all my efforts/approaches have failed.
Any help would be immensely appreciated.
I found a problem. If my html file opens the video stream directly inside the folder, the response is very fast. If it is based on a server request, it returns slowly.
such as:
file:///D:/work/test/example-webrtc-applications/sfu-ws/sfu.html Open the video stream very quickly
https://127.0.0.1:8443/ Wait for more than 10S to open the video stream
I just learned webrtc, I don’t know how the rtc request connection is implemented, so I don’t know if this phenomenon is normal, or how to improve the speed of establishing a video streaming connection from http request。
Thank you very much for your help. I learned a lot from this project。
-Run the server
-Go to browser and publish
Then in other PC via local network
-Go to browser and subscribe
-The video and audio from the publisher
-Nothing happen
-Error: mDNS: failed to join multicast group goroutine 299
I created an example of flutter for sfu-ws here examples/sfu-ws/flutter, I did some simple tests, Publisher is works, but Subscriber in iOS can only hear the sound, the webrtc log shows that the decoder could not find the keyframe.
1, Run sfu-ws
2. Start publish use Chrome.
pc.createOffer
provides VP8/playload=96 ==> sfu
pc.setRemoteDescription(answer)
<== sfu
3, Start subscribe use Flutter app.
pc.createOffer
provides H264/payload=96 ==> sfu (The real payload of VP8 is 100 on iOS.)
pc.setRemoteDescription(answer)
<== sfu
Video should be available on iOS
The Flutter client starts to receive the video stream, but the playoad does not match, the webrtc framework will get the rtp from SFU's VP8/pt=96, and the error as H264/pt=96 will not be decoded.
I tried adapt these examples for v3 using notes writen by @Sean-Der https://github.com/pion/webrtc/wiki/[email protected] , but I'm struggling with gst.CreatePipeline
to which depends internal/gstreamer-src
and apparently had a some changes to do.
Thanks.
Create an example connecting pions with flutter-webrtc.
cc @gedw99
In jsfiddle.net text areas are showing empty. There is nothing to copy as mentioned in the readme section
$ go get github.com/pion/example-webrtc-applications/gstreamer-send
# github.com/pion/webrtc
../go/src/github.com/pion/webrtc/dtlstransport.go:187:48: cannot use t.conn (type *dtls.Conn) as type srtp.KeyingMaterialExporter in argument to srtpConfig.ExtractSessionKeysFromDTLS:
*dtls.Conn does not implement srtp.KeyingMaterialExporter (missing ExportKeyingMaterial method)
../go/src/github.com/pion/webrtc/dtlstransport.go:334:23: t.conn.RemoteCertificate undefined (type *dtls.Conn has no field or method RemoteCertificate)
I ran go get github.com/pion/example-webrtc-applications/gstreamer-send
I expected the demo to build and run.
It failed with the error output above.
go run ./gocv-receive
I even removed all code from main(), but nothing changed.
should run
immediately finished with single message
exit status 3221225781
What am I doing wrong?
Hi, If possible can any one give me guidance for creating live streaming server that receives the broadcast from android/ios/webbrowser and then convert the stream into different quality for delivering to users by using Hls. I know the broadcasting and receiving parts that involves the clients, but need guidance in the server part.
The Flow is:
Android/ios/web browser (single user) ---- Broadcast ----> Server ---- Broadcast(hls) ----> Android/ios/Web browser
Server - Receive and change format to hls, create multiple quality of the video than broadcast to multiple users(1:N relation)
One paragraph explanation of the feature.
Why are we doing this? What use cases does it support? What is the expected outcome? Is this available in other implementations? Can this not be implemented using primitives?
A clear and concise description of the alternative solutions you've considered.
Add any other context or screenshots about the feature request here.
I configured both the browser client and backend server code to use a turn/ice server that had TLS and authentication.
I did this in the javascript by setting an RTCConfig and in the backend by setting a non-empty webrtc.Configuration{
ICEServers: []webrtc.ICEServer{ block.
I have tested this configuration using https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ and do get the "relay" option there.
I have changed this server to use TLS due to Modern browser security policies preventing video without TLS for non-localhost.
The video call to work using TURN
"WebRTC: ICE failed, add a STUN server and see about:webrtc for more details" in the firefox JS console logs.
Even when running the server with "PION_LOG_TRACE=all" there were no logs
From coturn I can see what look like successful connections which then go to "allocation timed out"
Please let me know if there's anything else I can send that would help!
Follow README and run.
Run without crash
Crash
I/FlutterWebRTCPlugin(20997): getUserMedia(audio): mandatory: [], optional: [googNoiseSuppression: true, googEchoCancellation: true, echoCancellation: true, googEchoCancellation2: true, googDAEchoCancellation: true]
E/rtc (20997):
E/rtc (20997):
E/rtc (20997): #
E/rtc (20997): # Fatal error in: ../../../../usr/local/google/home/sakal/code/webrtc-aar-release/src/pc/peer_connection.cc, line 1989
E/rtc (20997): # last system error: 0
E/rtc (20997): # Check failed: IsUnifiedPlan()
**E/rtc (20997): # GetTransceivers is only supported with Unified Plan SdpSemantics.
**
After I change version from 0.5.7 to 0.6.4 , bug fixed.
flutter: 2020-04-19 22:25:42.932062 Allow self-signed certificate => chat.xxx.com:8443.
flutter: v=0
o=- 8760475895372397277 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video data
a=msid-semantic: WMS 7B397A3B-0F9B-484A-BFD2-9DDC754AAA68
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 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:P3yX
a=ice-pwd:eA6SbA09gMUOiFKG4leEmSeU
a=ice-options:trickle renomination
a=fingerprint:sha-256 91:0A:30:C9:3A:ED:8F:89:46:E9:5C:A7:79:CD:85:10:9E:7E:A7:BB:35:43:8B:61:45:8C:DB:BA:6F:BA:8F:0B
a=setup:actpass
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=sendrecv
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:102 ILBC/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:4129030591 cname:Jw9TKuAD+QiX2am0
a=ssrc:4129030591 msid:7B397A3B-0F9B-484A-BFD2-9DDC754AAA68 D2764890-A350-468D-AA4D-2266477172DE
a=ssrc:4129030591 mslabel:7B397A3B-0F9B-484A-BFD2-9DDC754AAA68
a=ssrc:4129030591 label:D2764890-A350-468D-AA4D-2266477172DE
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 127 124 125
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:P3yX
a=ice-pwd:eA6SbA09gMUOiFKG4leEmSeU
a=ice-options:trickle renomination
a=fingerprint:sha-256 91:0A:30:C9:3A:ED:8F:89:46:E9:5C:A7:79:CD:85:10:9E:7E:A7:BB:35:43:8B:61:45:8C:DB:BA:6F:BA:8F:0B
a=setup:actpass
a=mid:video
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:13 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:2 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07
a=extmap:9 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=sendrecv
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 H264/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=fmtp:96 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640c2a
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 H264/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e02a
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP8/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:127 red/90000
a=rtpmap:124 rtx/90000
a=fmtp:124 apt=127
a=rtpmap:125 ulpfec/90000
a=ssrc-group:FID 3796320835 1884814991
a=ssrc:3796320835 cname:Jw9TKuAD+QiX2am0
a=ssrc:3796320835 msid:7B397A3B-0F9B-484A-BFD2-9DDC754AAA68 44FCC10B-D7F4-4842-9C7C-E79C60BE265C
a=ssrc:3796320835 mslabel:7B397A3B-0F9B-484A-BFD2-9DDC754AAA68
a=ssrc:3796320835 label:44FCC10B-D7F4-4842-9C7C-E79C60BE265C
a=ssrc:1884814991 cname:Jw9TKuAD+QiX2am0
a=ssrc:1884814991 msid:7B397A3B-0F9B-484A-BFD2-9DDC754AAA68 44FCC10B-D7F4-4842-9C7C-E79C60BE265C
a=ssrc:1884814991 mslabel:7B397A3B-0F9B-484A-BFD2-9DDC754AAA68
a=ssrc:1884814991 label:44FCC10B-D7F4-4842-9C7C-E79C60BE265C
m=application 9 DTLS/SCTP 5000
c=IN IP4 0.0.0.0
a=ice-ufrag:P3yX
a=ice-pwd:eA6SbA09gMUOiFKG4leEmSeU
a=ice-options:trickle renomination
a=fingerprint:sha-256 91:0A:30:C9:3A:ED:8F:89:46:E9:5C:A7:79:CD:85:10:9E:7E:A7:BB:35:43:8B:61:45:8C:DB:BA:6F:BA:8F:0B
a=setup:actpass
a=mid:data
a=sctpmap:5000 webrtc-datachannel 1024
flutter: 2020-04-19 22:25:44.312692 session => {"version":0,"origin":{"username":"-","sessionId":8760475895372397277,"sessionVersion":2,"netType":"IN","ipVer":4,"address":"127.0.0.1"},"name":"-","invalid":[{"value":"-"}],"timing":{"start":0,"stop":0},"groups":[{"type":"BUNDLE","mids":"audio video data"}],"msidSemantic":{"semantic":"WMS","token":"7B397A3B-0F9B-484A-BFD2-9DDC754AAA68"},"media":[{"rtp":[{"payload":111,"codec":"opus","rate":48000,"encoding":2},{"payload":103,"codec":"ISAC","rate":16000,"encoding":null},{"payload":104,"codec":"ISAC","rate":32000,"encoding":null},{"payload":9,"codec":"G722","rate":8000,"encoding":null},{"payload":102,"codec":"ILBC","rate":8000,"encoding":null},{"payload":0,"codec":"PCMU","rate":8000,"encoding":null},{"payload":8,"codec":"PCMA","rate":8000,"encoding":null},{"payload":106,"codec":"CN","rate":32000,"encoding":null},{"payload":105,"codec":"CN","rate":16000,"encoding":null},{"payload":13,"codec":"CN","rate":8000,"encoding":null},{"payload":110,"codec":"telephone-event","rate":48000,"encoding":null},{"payload":112,"codec":"telephone-event","rate":32000,"encoding":null},{"payload":113,"codec":"telephone-event","rate":16000,"encoding":null},{"payload":126,"codec":"telephone-event","rate":8000,"encoding":null}],"fmtp":[{"payload":111,"config":"minptime=10;useinbandfec=1"}],"type":"audio","port":9,"protocol":"UDP/TLS/RTP/SAVPF","payloads":"111 103 104 9 102 0 8 106 105 13 110 112 113 126","connection":{"version":4,"ip":"0.0.0.0"},"rtcp":{"port":9,"netType":"IN","ipVer":4,"address":"0.0.0.0"},"iceUfrag":"P3yX","icePwd":"eA6SbA09gMUOiFKG4leEmSeU","iceOptions":"trickle","fingerprint":{"type":"sha-256","hash":"91:0A:30:C9:3A:ED:8F:89:46:E9:5C:A7:79:CD:85:10:9E:7E:A7:BB:35:43:8B:61:45:8C:DB:BA:6F:BA:8F:0B"},"setup":"actpass","mid":"audio","ext":[{"value":1,"direction":null,"uri":"urn:ietf:params:rtp-hdrext:ssrc-audio-level","config":null},{"value":2,"direction":null,"uri":"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01","config":null}],"direction":"sendrecv","rtcpMux":"rtcp-mux","rtcpFb":[{"payload":111,"type":"transport-cc","subtype":null}],"ssrcs":[{"id":4129030591,"attribute":"cname","value":"Jw9TKuAD+QiX2am0"},{"id":4129030591,"attribute":"msid","value":"7B397A3B-0F9B-484A-BFD2-9DDC754AAA68 D2764890-A350-468D-AA4D-2266477172DE"},{"id":4129030591,"attribute":"mslabel","value":"7B397A3B-0F9B-484A-BFD2-9DDC754AAA68"},{"id":4129030591,"attribute":"label","value":"D2764890-A350-468D-AA4D-2266477172DE"}]},{"rtp":[{"payload":96,"codec":"H264","rate":90000,"encoding":null},{"payload":97,"codec":"rtx","rate":90000,"encoding":null},{"payload":98,"codec":"H264","rate":90000,"encoding":null},{"payload":99,"codec":"rtx","rate":90000,"encoding":null},{"payload":100,"codec":"VP8","rate":90000,"encoding":null},{"payload":101,"codec":"rtx","rate":90000,"encoding":null},{"payload":127,"codec":"red","rate":90000,"encoding":null},{"payload":124,"codec":"rtx","rate":90000,"encoding":null},{"payload":125,"codec":"ulpfec","rate":90000,"encoding":null}],"fmtp":[{"payload":96,"config":"level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640c2a"},{"payload":97,"config":"apt=96"},{"payload":98,"config":"level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e02a"},{"payload":99,"config":"apt=98"},{"payload":101,"config":"apt=100"},{"payload":124,"config":"apt=127"}],"type":"video","port":9,"protocol":"UDP/TLS/RTP/SAVPF","payloads":"96 97 98 99 100 101 127 124 125","connection":{"version":4,"ip":"0.0.0.0"},"rtcp":{"port":9,"netType":"IN","ipVer":4,"address":"0.0.0.0"},"iceUfrag":"P3yX","icePwd":"eA6SbA09gMUOiFKG4leEmSeU","iceOptions":"trickle","fingerprint":{"type":"sha-256","hash":"91:0A:30:C9:3A:ED:8F:89:46:E9:5C:A7:79:CD:85:10:9E:7E:A7:BB:35:43:8B:61:45:8C:DB:BA:6F:BA:8F:0B"},"setup":"actpass","mid":"video","ext":[{"value":14,"direction":null,"uri":"urn:ietf:params:rtp-hdrext:toffset","config":null},{"value":13,"direction":null,"uri":"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time","config":null},{"value":3,"direction":null,"uri":"urn:3gpp:video-orientation","config":null},{"value":2,"direction":null,"uri":"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01","config":null},{"value":5,"direction":null,"uri":"http://www.webrtc.org/experiments/rtp-hdrext/playout-delay","config":null},{"value":6,"direction":null,"uri":"http://www.webrtc.org/experiments/rtp-hdrext/video-content-type","config":null},{"value":7,"direction":null,"uri":"http://www.webrtc.org/experiments/rtp-hdrext/video-timing","config":null},{"value":8,"direction":null,"uri":"http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07","config":null},{"value":9,"direction":null,"uri":"http://www.webrtc.org/experiments/rtp-hdrext/color-space","config":null}],"direction":"sendrecv","rtcpMux":"rtcp-mux","rtcpRsize":"rtcp-rsize","rtcpFb":[{"payload":96,"type":"goog-remb","subtype":null},{"payload":96,"type":"transport-cc","subtype":null},{"payload":96,"type":"ccm","subtype":"fir"},{"payload":96,"type":"nack","subtype":null},{"payload":96,"type":"nack","subtype":"pli"},{"payload":98,"type":"goog-remb","subtype":null},{"payload":98,"type":"transport-cc","subtype":null},{"payload":98,"type":"ccm","subtype":"fir"},{"payload":98,"type":"nack","subtype":null},{"payload":98,"type":"nack","subtype":"pli"},{"payload":100,"type":"goog-remb","subtype":null},{"payload":100,"type":"transport-cc","subtype":null},{"payload":100,"type":"ccm","subtype":"fir"},{"payload":100,"type":"nack","subtype":null},{"payload":100,"type":"nack","subtype":"pli"}],"ssrcGroups":[{"semantics":"FID","ssrcs":"3796320835 1884814991"}],"ssrcs":[{"id":3796320835,"attribute":"cname","value":"Jw9TKuAD+QiX2am0"},{"id":3796320835,"attribute":"msid","value":"7B397A3B-0F9B-484A-BFD2-9DDC754AAA68 44FCC10B-D7F4-4842-9C7C-E79C60BE265C"},{"id":3796320835,"attribute":"mslabel","value":"7B397A3B-0F9B-484A-BFD2-9DDC754AAA68"},{"id":3796320835,"attribute":"label","value":"44FCC10B-D7F4-4842-9C7C-E79C60BE265C"},{"id":1884814991,"attribute":"cname","value":"Jw9TKuAD+QiX2am0"},{"id":1884814991,"attribute":"msid","value":"7B397A3B-0F9B-484A-BFD2-9DDC754AAA68 44FCC10B-D7F4-4842-9C7C-E79C60BE265C"},{"id":1884814991,"attribute":"mslabel","value":"7B397A3B-0F9B-484A-BFD2-9DDC754AAA68"},{"id":1884814991,"attribute":"label","value":"44FCC10B-D7F4-4842-9C7C-E79C60BE265C"}]},{"rtp":[],"fmtp":[],"type":"application","port":9,"protocol":"DTLS/SCTP","payloads":5000,"connection":{"version":4,"ip":"0.0.0.0"},"iceUfrag":"P3yX","icePwd":"eA6SbA09gMUOiFKG4leEmSeU","iceOptions":"trickle","fingerprint":{"type":"sha-256","hash":"91:0A:30:C9:3A:ED:8F:89:46:E9:5C:A7:79:CD:85:10:9E:7E:A7:BB:35:43:8B:61:45:8C:DB:BA:6F:BA:8F:0B"},"setup":"actpass","mid":"data","sctpmap":{"sctpmapNumber":5000,"app":"webrtc-datachannel","maxMessageSize":1024}}]}
flutter: 2020-04-19 22:25:44.345807 Publisher createOffer
flutter: 2020-04-19 22:26:24.235352 RTCIceGatheringStateComplete
flutter: 2020-04-19 22:26:24.290394 send: v=0
o=- 8760475895372397277 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video data
a=msid-semantic: WMS 7B397A3B-0F9B-484A-BFD2-9DDC754AAA68
m=audio 50925 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126
c=IN IP4 13.26.51.62
a=rtcp:9 IN IP4 0.0.0.0
a=candidate:186199869 1 udp 2122260223 192.168.1.101 50925 typ host generation 0 network-id 1 network-cost 10
a=candidate:3416339724 1 udp 2122194687 169.254.103.229 59595 typ host generation 0 network-id 2 network-cost 10
a=candidate:1927296287 1 udp 2122129151 10.160.198.49 52013 typ host generation 0 network-id 7 network-cost 900
a=candidate:3429200854 1 udp 2122063615 10.241.162.198 62424 typ host generation 0 network-id 8 network-cost 900
a=candidate:3429200854 1 udp 2121998079 10.241.162.198 62592 typ host generation 0 network-id 3 network-cost 50
a=candidate:3429200854 1 udp 2121932543 10.241.162.198 55208 typ host generation 0 network-id 4 network-cost 50
a=candidate:1167774669 1 tcp 1518280447 192.168.1.101 64518 typ host tcptype passive generation 0 network-id 1 network-cost 10
a=candidate:2233649660 1 tcp 1518214911 169.254.103.229 64519 typ host tcptype passive generation 0 network-id 2 network-cost 10
a=candidate:1013172719 1 tcp 1518149375 10.160.198.49 64520 typ host tcptype passive generation 0 network-id 7 network-cost 900
a=candidate:2196148006 1 tcp 1518083839 10.241.162.198 64521 typ host tcptype passive generation 0 network-id 8 network-cost 900
a=candidate:2196148006 1 tcp 1518018303 10.241.162.198 64522 typ host tcptype passive generation 0 network-id 3 network-cost 50
a=candidate:2196148006 1 tcp 1517952767 10.241.162.198 64523 typ host tcptype passive generation 0 network-id 4 network-cost 50
a=candidate:2320574857 1 udp 1686052607 13.26.51.62 50925 typ srflx raddr 192.168.1.101 rport 50925 generation 0 network-id 1 network-cost 10
a=candidate:4087886763 1 udp 1685921535 11.20.113.3 20047 typ srflx raddr 10.160.198.49 rport 52013 generation 0 network-id 7 network-cost 900
a=ice-ufrag:P3yX
a=ice-pwd:eA6SbA09gMUOiFKG4leEmSeU
a=ice-options:trickle
a=fingerprint:sha-256 91:0A:30:C9:3A:ED:8F:89:46:E9:5C:A7:79:CD:85:10:9E:7E:A7:BB:35:43:8B:61:45:8C:DB:BA:6F:BA:8F:0B
a=setup:actpass
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=sendrecv
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:102 ILBC/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:4129030591 cname:Jw9TKuAD+QiX2am0
a=ssrc:4129030591 msid:7B397A3B-0F9B-484A-BFD2-9DDC754AAA68 D2764890-A350-468D-AA4D-2266477172DE
a=ssrc:4129030591 mslabel:7B397A3B-0F9B-484A-BFD2-9DDC754AAA68
a=ssrc:4129030591 label:D2764890-A350-468D-AA4D-2266477172DE
m=video 57541 UDP/TLS/RTP/SAVPF 96 97
c=IN IP4 13.26.51.62
a=rtcp:9 IN IP4 0.0.0.0
a=candidate:186199869 1 udp 2122260223 192.168.1.101 57541 typ host generation 0 network-id 1 network-cost 10
a=candidate:3416339724 1 udp 2122194687 169.254.103.229 50072 typ host generation 0 network-id 2 network-cost 10
a=candidate:1927296287 1 udp 2122129151 10.160.198.49 50365 typ host generation 0 network-id 7 network-cost 900
a=candidate:3429200854 1 udp 2122063615 10.241.162.198 50121 typ host generation 0 network-id 8 network-cost 900
a=candidate:3429200854 1 udp 2121998079 10.241.162.198 62832 typ host generation 0 network-id 3 network-cost 50
a=candidate:3429200854 1 udp 2121932543 10.241.162.198 58263 typ host generation 0 network-id 4 network-cost 50
a=candidate:1167774669 1 tcp 1518280447 192.168.1.101 64530 typ host tcptype passive generation 0 network-id 1 network-cost 10
a=candidate:2233649660 1 tcp 1518214911 169.254.103.229 64531 typ host tcptype passive generation 0 network-id 2 network-cost 10
a=candidate:1013172719 1 tcp 1518149375 10.160.198.49 64532 typ host tcptype passive generation 0 network-id 7 network-cost 900
a=candidate:2196148006 1 tcp 1518083839 10.241.162.198 64533 typ host tcptype passive generation 0 network-id 8 network-cost 900
a=candidate:2196148006 1 tcp 1518018303 10.241.162.198 64534 typ host tcptype passive generation 0 network-id 3 network-cost 50
a=candidate:2196148006 1 tcp 1517952767 10.241.162.198 64535 typ host tcptype passive generation 0 network-id 4 network-cost 50
a=candidate:2320574857 1 udp 1686052607 13.26.51.62 57541 typ srflx raddr 192.168.1.101 rport 57541 generation 0 network-id 1 network-cost 10
a=candidate:4087886763 1 udp 1685921535 11.20.113.3 20048 typ srflx raddr 10.160.198.49 rport 50365 generation 0 network-id 7 network-cost 900
a=ice-ufrag:P3yX
a=ice-pwd:eA6SbA09gMUOiFKG4leEmSeU
a=ice-options:trickle
a=fingerprint:sha-256 91:0A:30:C9:3A:ED:8F:89:46:E9:5C:A7:79:CD:85:10:9E:7E:A7:BB:35:43:8B:61:45:8C:DB:BA:6F:BA:8F:0B
a=setup:actpass
a=mid:video
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:13 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:2 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07
a=extmap:9 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=sendrecv
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=ssrc-group:FID 3796320835 1884814991
a=ssrc:3796320835 cname:Jw9TKuAD+QiX2am0
a=ssrc:3796320835 msid:7B397A3B-0F9B-484A-BFD2-9DDC754AAA68 44FCC10B-D7F4-4842-9C7C-E79C60BE265C
a=ssrc:3796320835 mslabel:7B397A3B-0F9B-484A-BFD2-9DDC754AAA68
a=ssrc:3796320835 label:44FCC10B-D7F4-4842-9C7C-E79C60BE265C
a=ssrc:1884814991 cname:Jw9TKuAD+QiX2am0
a=ssrc:1884814991 msid:7B397A3B-0F9B-484A-BFD2-9DDC754AAA68 44FCC10B-D7F4-4842-9C7C-E79C60BE265C
a=ssrc:1884814991 mslabel:7B397A3B-0F9B-484A-BFD2-9DDC754AAA68
a=ssrc:1884814991 label:44FCC10B-D7F4-4842-9C7C-E79C60BE265C
m=application 57442 DTLS/SCTP 5000
c=IN IP4 13.26.51.62
a=candidate:186199869 1 udp 2122260223 192.168.1.101 57442 typ host generation 0 network-id 1 network-cost 10
a=candidate:3416339724 1 udp 2122194687 169.254.103.229 50902 typ host generation 0 network-id 2 network-cost 10
a=candidate:1927296287 1 udp 2122129151 10.160.198.49 57150 typ host generation 0 network-id 7 network-cost 900
a=candidate:3429200854 1 udp 2122063615 10.241.162.198 52106 typ host generation 0 network-id 8 network-cost 900
a=candidate:3429200854 1 udp 2121998079 10.241.162.198 59724 typ host generation 0 network-id 3 network-cost 50
a=candidate:3429200854 1 udp 2121932543 10.241.162.198 65029 typ host generation 0 network-id 4 network-cost 50
a=candidate:1167774669 1 tcp 1518280447 192.168.1.101 64524 typ host tcptype passive generation 0 network-id 1 network-cost 10
a=candidate:2233649660 1 tcp 1518214911 169.254.103.229 64525 typ host tcptype passive generation 0 network-id 2 network-cost 10
a=candidate:1013172719 1 tcp 1518149375 10.160.198.49 64526 typ host tcptype passive generation 0 network-id 7 network-cost 900
a=candidate:2196148006 1 tcp 1518083839 10.241.162.198 64527 typ host tcptype passive generation 0 network-id 8 network-cost 900
a=candidate:2196148006 1 tcp 1518018303 10.241.162.198 64528 typ host tcptype passive generation 0 network-id 3 network-cost 50
a=candidate:2196148006 1 tcp 1517952767 10.241.162.198 64529 typ host tcptype passive generation 0 network-id 4 network-cost 50
a=candidate:2320574857 1 udp 1686052607 13.26.51.62 57442 typ srflx raddr 192.168.1.101 rport 57442 generation 0 network-id 1 network-cost 10
a=candidate:4087886763 1 udp 1685921535 11.20.113.3 18101 typ srflx raddr 10.160.198.49 rport 57150 generation 0 network-id 7 network-cost 900
a=ice-ufrag:P3yX
a=ice-pwd:eA6SbA09gMUOiFKG4leEmSeU
a=ice-options:trickle
a=fingerprint:sha-256 91:0A:30:C9:3A:ED:8F:89:46:E9:5C:A7:79:CD:85:10:9E:7E:A7:BB:35:43:8B:61:45:8C:DB:BA:6F:BA:8F:0B
a=setup:actpass
a=mid:data
a=sctpmap:5000 webrtc-datachannel 1024
flutter: 2020-04-19 22:26:26.580308 Recivied data: v=0
o=- 637461510 1587306384 IN IP4 0.0.0.0
s=-
t=0 0
a=fingerprint:sha-256 D4:DC:2A:9F:9E:06:F6:A2:BD:76:E4:7D:AA:80:60:8B:50:00:39:0E:D2:66:E6:E3:F3:E4:6E:DD:7B:1D:5C:8F
a=group:BUNDLE audio video data
m=audio 9 UDP/TLS/RTP/SAVPF 111
c=IN IP4 0.0.0.0
a=setup:passive
a=mid:audio
a=ice-ufrag:OfYCCyAlDFgCwcxl
a=ice-pwd:ZmMvvNBXcEmKzJzKnUqsMtkkhkaLscPc
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10;useinbandfec=1
a=ssrc:1823804162 cname:BMgdqEaJBAnDCgAF
a=ssrc:1823804162 msid:BMgdqEaJBAnDCgAF hNEtnzMfdvYEZUSC
a=ssrc:1823804162 mslabel:BMgdqEaJBAnDCgAF
a=ssrc:1823804162 label:hNEtnzMfdvYEZUSC
a=sendrecv
a=candidate:foundation 1 udp 2130706431 1.134.240.200 55999 typ host generation 0
a=candidate:foundation 2 udp 2130706431 1.134.240.200 55999 typ host generation 0
a=candidate:foundation 1 udp 2130706431 172.17.0.1 36384 typ host generation 0
a=candidate:foundation 2 udp 2130706431 172.17.0.1 36384 typ host generation 0
a=candidate:foundation 1 udp 2130706431 172.18.0.1 34315 typ host generation 0
a=candidate:foundation 2 udp 2130706431 172.18.0.1 34315 typ host generation 0
a=candidate:foundation 1 udp 1694498815 1.134.240.200 54286 typ srflx raddr 0.0.0.0 rport 54286 generation 0
a=candidate:foundation 2 udp 1694498815 1.134.240.200 54286 typ srflx raddr 0.0.0.0 rport 54286 generation 0
a=candidate:foundation 1 udp 1694498815 2a02:4780:1:1::1:98b6 56258 typ srflx raddr :: rport 56258 generation 0
a=candidate:foundation 2 udp 1694498815 2a02:4780:1:1::1:98b6 56258 typ srflx raddr :: rport 56258 generation 0
a=end-of-candidates
m=video 9 UDP/TLS/RTP/SAVPF 96
c=IN IP4 0.0.0.0
a=setup:passive
a=mid:video
a=ice-ufrag:OfYCCyAlDFgCwcxl
a=ice-pwd:ZmMvvNBXcEmKzJzKnUqsMtkkhkaLscPc
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=ssrc:2949882636 cname:DSfpVEOxLXHSuDEd
a=ssrc:2949882636 msid:DSfpVEOxLXHSuDEd YSyyGExmoZBGSjjy
a=ssrc:2949882636 mslabel:DSfpVEOxLXHSuDEd
a=ssrc:2949882636 label:YSyyGExmoZBGSjjy
a=sendrecv
a=candidate:foundation 1 udp 2130706431 1.134.240.200 55999 typ host generation 0
a=candidate:foundation 2 udp 2130706431 1.134.240.200 55999 typ host generation 0
a=candidate:foundation 1 udp 2130706431 172.17.0.1 36384 typ host generation 0
a=candidate:foundation 2 udp 2130706431 172.17.0.1 36384 typ host generation 0
a=candidate:foundation 1 udp 2130706431 172.18.0.1 34315 typ host generation 0
a=candidate:foundation 2 udp 2130706431 172.18.0.1 34315 typ host generation 0
a=candidate:foundation 1 udp 1694498815 1.134.240.200 54286 typ srflx raddr 0.0.0.0 rport 54286 generation 0
a=candidate:foundation 2 udp 1694498815 1.134.240.200 54286 typ srflx raddr 0.0.0.0 rport 54286 generation 0
a=candidate:foundation 1 udp 1694498815 2a02:4780:1:1::1:98b6 56258 typ srflx raddr :: rport 56258 generation 0
a=candidate:foundation 2 udp 1694498815 2a02:4780:1:1::1:98b6 56258 typ srflx raddr :: rport 56258 generation 0
a=end-of-candidates
m=application 9 DTLS/SCTP 5000
c=IN IP4 0.0.0.0
a=setup:passive
a=mid:data
a=sendrecv
a=sctpmap:5000 webrtc-datachannel 1024
a=ice-ufrag:OfYCCyAlDFgCwcxl
a=ice-pwd:ZmMvvNBXcEmKzJzKnUqsMtkkhkaLscPc
a=candidate:foundation 1 udp 2130706431 1.134.240.200 55999 typ host generation 0
a=candidate:foundation 2 udp 2130706431 1.134.240.200 55999 typ host generation 0
a=candidate:foundation 1 udp 2130706431 172.17.0.1 36384 typ host generation 0
a=candidate:foundation 2 udp 2130706431 172.17.0.1 36384 typ host generation 0
a=candidate:foundation 1 udp 2130706431 172.18.0.1 34315 typ host generation 0
a=candidate:foundation 2 udp 2130706431 172.18.0.1 34315 typ host generation 0
a=candidate:foundation 1 udp 1694498815 1.134.240.200 54286 typ srflx raddr 0.0.0.0 rport 54286 generation 0
a=candidate:foundation 2 udp 1694498815 1.134.240.200 54286 typ srflx raddr 0.0.0.0 rport 54286 generation 0
a=candidate:foundation 1 udp 1694498815 2a02:4780:1:1::1:98b6 56258 typ srflx raddr :: rport 56258 generation 0
a=candidate:foundation 2 udp 1694498815 2a02:4780:1:1::1:98b6 56258 typ srflx raddr :: rport 56258 generation 0
a=end-of-candidates
flutter: 2020-04-19 22:26:26.585202 onMessage sdp: v=0
o=- 637461510 1587306384 IN IP4 0.0.0.0
s=-
t=0 0
a=fingerprint:sha-256 D4:DC:2A:9F:9E:06:F6:A2:BD:76:E4:7D:AA:80:60:8B:50:00:39:0E:D2:66:E6:E3:F3:E4:6E:DD:7B:1D:5C:8F
a=group:BUNDLE audio video data
m=audio 9 UDP/TLS/RTP/SAVPF 111
c=IN IP4 0.0.0.0
a=setup:passive
a=mid:audio
a=ice-ufrag:OfYCCyAlDFgCwcxl
a=ice-pwd:ZmMvvNBXcEmKzJzKnUqsMtkkhkaLscPc
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10;useinbandfec=1
a=ssrc:1823804162 cname:BMgdqEaJBAnDCgAF
a=ssrc:1823804162 msid:BMgdqEaJBAnDCgAF hNEtnzMfdvYEZUSC
a=ssrc:1823804162 mslabel:BMgdqEaJBAnDCgAF
a=ssrc:1823804162 label:hNEtnzMfdvYEZUSC
a=sendrecv
a=candidate:foundation 1 udp 2130706431 1.134.240.200 55999 typ host generation 0
a=candidate:foundation 2 udp 2130706431 1.134.240.200 55999 typ host generation 0
a=candidate:foundation 1 udp 2130706431 172.17.0.1 36384 typ host generation 0
a=candidate:foundation 2 udp 2130706431 172.17.0.1 36384 typ host generation 0
a=candidate:foundation 1 udp 2130706431 172.18.0.1 34315 typ host generation 0
a=candidate:foundation 2 udp 2130706431 172.18.0.1 34315 typ host generation 0
a=candidate:foundation 1 udp 1694498815 1.134.240.200 54286 typ srflx raddr 0.0.0.0 rport 54286 generation 0
a=candidate:foundation 2 udp 1694498815 1.134.240.200 54286 typ srflx raddr 0.0.0.0 rport 54286 generation 0
a=candidate:foundation 1 udp 1694498815 2a02:4780:1:1::1:98b6 56258 typ srflx raddr :: rport 56258 generation 0
a=candidate:foundation 2 udp 1694498815 2a02:4780:1:1::1:98b6 56258 typ srflx raddr :: rport 56258 generation 0
a=end-of-candidates
m=video 9 UDP/TLS/RTP/SAVPF 96
c=IN IP4 0.0.0.0
a=setup:passive
a=mid:video
a=ice-ufrag:OfYCCyAlDFgCwcxl
a=ice-pwd:ZmMvvNBXcEmKzJzKnUqsMtkkhkaLscPc
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=ssrc:2949882636 cname:DSfpVEOxLXHSuDEd
a=ssrc:2949882636 msid:DSfpVEOxLXHSuDEd YSyyGExmoZBGSjjy
a=ssrc:2949882636 mslabel:DSfpVEOxLXHSuDEd
a=ssrc:2949882636 label:YSyyGExmoZBGSjjy
a=sendrecv
a=candidate:foundation 1 udp 2130706431 1.134.240.200 55999 typ host generation 0
a=candidate:foundation 2 udp 2130706431 1.134.240.200 55999 typ host generation 0
a=candidate:foundation 1 udp 2130706431 172.17.0.1 36384 typ host generation 0
a=candidate:foundation 2 udp 2130706431 172.17.0.1 36384 typ host generation 0
a=candidate:foundation 1 udp 2130706431 172.18.0.1 34315 typ host generation 0
a=candidate:foundation 2 udp 2130706431 172.18.0.1 34315 typ host generation 0
a=candidate:foundation 1 udp 1694498815 1.134.240.200 54286 typ srflx raddr 0.0.0.0 rport 54286 generation 0
a=candidate:foundation 2 udp 1694498815 1.134.240.200 54286 typ srflx raddr 0.0.0.0 rport 54286 generation 0
a=candidate:foundation 1 udp 1694498815 2a02:4780:1:1::1:98b6 56258 typ srflx raddr :: rport 56258 generation 0
a=candidate:foundation 2 udp 1694498815 2a02:4780:1:1::1:98b6 56258 typ srflx raddr :: rport 56258 generation 0
a=end-of-candidates
m=application 9 DTLS/SCTP 5000
c=IN IP4 0.0.0.0
a=setup:passive
a=mid:data
a=sendrecv
a=sctpmap:5000 webrtc-datachannel 1024
a=ice-ufrag:OfYCCyAlDFgCwcxl
a=ice-pwd:ZmMvvNBXcEmKzJzKnUqsMtkkhkaLscPc
a=candidate:foundation 1 udp 2130706431 1.134.240.200 55999 typ host generation 0
a=candidate:foundation 2 udp 2130706431 1.134.240.200 55999 typ host generation 0
a=candidate:foundation 1 udp 2130706431 172.17.0.1 36384 typ host generation 0
a=candidate:foundation 2 udp 2130706431 172.17.0.1 36384 typ host generation 0
a=candidate:foundation 1 udp 2130706431 172.18.0.1 34315 typ host generation 0
a=candidate:foundation 2 udp 2130706431 172.18.0.1 34315 typ host generation 0
a=candidate:foundation 1 udp 1694498815 1.134.240.200 54286 typ srflx raddr 0.0.0.0 rport 54286 generation 0
a=candidate:foundation 2 udp 1694498815 1.134.240.200 54286 typ srflx raddr 0.0.0.0 rport 54286 generation 0
a=candidate:foundation 1 udp 1694498815 2a02:4780:1:1::1:98b6 56258 typ srflx raddr :: rport 56258 generation 0
a=candidate:foundation 2 udp 1694498815 2a02:4780:1:1::1:98b6 56258 typ srflx raddr :: rport 56258 generation 0
a=end-of-candidates
flutter: 2020-04-19 22:26:26.614078 Closed by server!
if I write this at the beginning it means I'm working on it. Below, I put the reproducible problem on an example with logs. here, I use the SIP module from janus.
I started to implement the trickle ice in the library in janus-go because at the moment, it doesn't have it and these are Unknown message type received!
, (but the library is really badly written, there are interfaces everywhere, it's horrible.). I wanted to do a PR once it works, but it doesn't, I put below the SDP I receive, but the peerConnection.ConnectionState() stay on 'new
.
FS SDP : {Type:answer SDP:v=0
o=FreeSWITCH 1614821593 1614821594 IN IP4 192.168.1.82
s=FreeSWITCH
t=0 0
a=group:BUNDLE 0
a=msid-semantic: WMS janus
m=audio 9 UDP/TLS/RTP/SAVPF 102
c=IN IP4 192.168.1.82
a=sendrecv
a=mid:0
a=rtcp-mux
a=ice-ufrag:ESi0
a=ice-pwd:KwjZQS/eM9t5+sKUcQy4mL
a=ice-options:trickle
a=fingerprint:sha-256 19:29:FB:01:8D:B1:D3:74:F8:B1:A7:22:CC:EA:FE:2B:7F:6C:6E:9F:90:3F:29:74:7F:19:78:33:F9:AE:F0:3B
a=setup:active
a=rtpmap:102 opus/48000/2
a=fmtp:102 useinbandfec=1; minptime=10; maxptime=40
a=ptime:20
a=msid:janus janusa0
a=ssrc:1412024179 cname:janus
a=ssrc:1412024179 msid:janus janusa0
a=ssrc:1412024179 mslabel:janus
a=ssrc:1412024179 label:janusa0
parsed:<nil>}
To keep my SIP connection as short as possible, I wanted to use janus-gateway since there were examples, everything was working until I realized that the connection was down after about 1 minute (sometimes 55 seconds). So I first thought of a SIP problem, then of Trickle-ice, then I wanted to test the example (test with streaming/main.go
), and here are the logs (I just replaced the fmt by log to get the hours). Output from main :
2021/03/04 09:45:26 Connection State has changed checking
2021/03/04 09:45:26 Connection State has changed connected
2021/03/04 09:45:26 EventMsg map[result:map[status:started] streaming:event]
2021/03/04 09:45:26 WebRTCUp type 3409908402048550
2021/03/04 09:45:26 Got Opus track, saving to disk as output.ogg
2021/03/04 09:45:26 Got VP8 track, saving to disk as output.ivf
2021/03/04 09:46:21 HangupEvent type 3409908402048550
2021/03/04 09:46:26 Connection State has changed disconnected
2021/03/04 09:46:50 Connection State has changed failed
On the output side of janus, I also put the logs, but all goes well until he makes tons of errors on ice.
Output from janus :
Creating new session: 415411785321720; 0x7f3b0c0013f0
Creating new handle in session 415411785321720: 3409908402048550; 0x7f3b0c0013f0 0x7f3b14001c80
[3409908402048550] Creating ICE agent (ICE Full mode, controlling)
[WARN] [3409908402048550] Failed to add some remote candidates (added 0, expected 1)
[3409908402048550] The DTLS handshake has been completed
[janus.plugin.streaming-0x7f3b0c006580] WebRTC media is now available
and after 1 minute :
[WARN] [3409908402048550] ICE failed for component 1 in stream 1, but let's give it some time... (trickle received, answer received, alert not set)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 58)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 46)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 58)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 784)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 740)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 823)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 766)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 734)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 785)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 816)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 743)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 842)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 755)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 752)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 817)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 791)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 745)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 753)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 58)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 46)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 58)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 789)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 745)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 781)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 757)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 728)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 772)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 775)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 790)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 763)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 780)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 766)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 816)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 776)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 779)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 766)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 58)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 46)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 58)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 776)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 732)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 828)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 775)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 737)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 778)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 835)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 732)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 825)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 748)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 782)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 772)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 772)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 762)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 793)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 58)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 46)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 58)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 748)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 737)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 819)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 759)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 756)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 763)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 807)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 759)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 841)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 775)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 746)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 787)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 747)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 776)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 794)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 58)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 46)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 58)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 783)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 736)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 851)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 785)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 770)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 778)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 810)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 745)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 788)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 731)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 757)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1133)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 762)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 735)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 1422)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 768)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 58)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 46)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4417] [3409908402048550] ... only sent -1 bytes? (was 58)
[ERR] [ice.c:janus_ice_outgoing_traffic_handle:4559] [3409908402048550] ... only sent -1 bytes? (was 84)
[ERR] [ice.c:janus_ice_check_failed:1829] [3409908402048550] ICE failed for component 1 in stream 1...
[ERR] [dtls-bio.c:janus_dtls_bio_agent_write:157] [3409908402048550] Error sending DTLS message on component 1 of stream 1 (-1)
[janus.plugin.streaming-0x7f3b0c006580] No WebRTC media anymore
[3409908402048550] WebRTC resources freed; 0x7f3b14001c80 0x7f3b0c0013f0
Timeout expired for session 415411785321720...
Detaching handle from JANUS Streaming plugin; 0x7f3b14001c80 0x7f3b0c006580 0x7f3b14001c80 0x7f3b14007600
Destroying session 415411785321720; 0x7f3b0c0013f0
[3409908402048550] Handle and related resources freed; 0x7f3b14001c80 0x7f3b0c0013f0
[WSS-0x7f3b0c00d240] Destroying WebSocket client
if anyone can help, that would be great.
just run the example and wait a minute
a connection that lasts more than a minute
I'm trying to change the gstreamer-receive example to use ffmpeg, can someone tell me what I'm doing wrong because I don't hear any audio when I run the software
package main
import (
"fmt"
"time"
"os"
"os/exec"
"github.com/pion/rtcp"
"github.com/pion/webrtc/v3"
//gst "gstreamer-sink"
)
func check(err error) {
if err != nil {
panic(err)
}
}
func main() {
// Prepare the configuration
config := webrtc.Configuration{
ICEServers: []webrtc.ICEServer{
{
URLs: []string{"stun:stun.l.google.com:19302"},
},
},
}
// Create a new RTCPeerConnection
peerConnection, err := webrtc.NewPeerConnection(config)
if err != nil {
panic(err)
}
// Set a handler for when a new remote track starts, this handler creates a gstreamer pipeline
// for the given codec
peerConnection.OnTrack(func(track *webrtc.TrackRemote, receiver *webrtc.RTPReceiver) {
// Send a PLI on an interval so that the publisher is pushing a keyframe every rtcpPLIInterval
go func() {
ticker := time.NewTicker(time.Second * 3)
for range ticker.C {
rtcpSendErr := peerConnection.WriteRTCP([]rtcp.Packet{&rtcp.PictureLossIndication{MediaSSRC: uint32(track.SSRC())}})
if rtcpSendErr != nil {
fmt.Println(rtcpSendErr)
}
}
}()
//codecName := strings.Split(track.Codec().RTPCodecCapability.MimeType, "/")[1]
//fmt.Printf("Track has started, of type %d: %s \n", track.PayloadType(), codecName)
//pipeline := gst.CreatePipeline(track.PayloadType(), strings.ToLower(codecName))
//pipeline.Start()
buf := make([]byte, 1400)
chBuff := make(chan []byte, 1400)
go playTrack(chBuff)
for {
i, _, readErr := track.Read(buf)
if readErr != nil {
panic(err)
}
chBuff <- buf[:i]
//pipeline.Push(buf[:i])
//fmt.Printf("%x", buf[:i])
//fmt.Println(track.PayloadType())
}
})
// Set the handler for ICE connection state
// This will notify you when the peer has connected/disconnected
peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) {
fmt.Printf("Connection State has changed %s \n", connectionState.String())
})
// Wait for the offer to be pasted
offer := webrtc.SessionDescription{}
Decode(MustReadStdin(), &offer)
// Set the remote SessionDescription
err = peerConnection.SetRemoteDescription(offer)
if err != nil {
panic(err)
}
// Create an answer
answer, err := peerConnection.CreateAnswer(nil)
if err != nil {
panic(err)
}
// Create channel that is blocked until ICE Gathering is complete
gatherComplete := webrtc.GatheringCompletePromise(peerConnection)
// Sets the LocalDescription, and starts our UDP listeners
err = peerConnection.SetLocalDescription(answer)
if err != nil {
panic(err)
}
// Block until ICE Gathering is complete, disabling trickle ICE
// we do this because we only can exchange one signaling message
// in a production application you should exchange ICE Candidates via OnICECandidate
<-gatherComplete
// Output the answer in base64 so we can paste it in browser
fmt.Println(Encode(*peerConnection.LocalDescription()))
// Block forever
select {}
}
func playTrack(ch <-chan []byte){
//cmd := exec.Command("ffmpeg", "-i", "pipe:0", "-f", "alsa", "default")
cmd:= exec.Command("ffmpeg", "-i", "pipe:0", "-c:a", "copy", "-sample_fmt", "s16p", "-ssrc", "1", "-payload_type", "111", "-b", "96k", "-f", "alsa", "default")
cmd.Stderr = os.Stderr // bind log stream to stderr
//cmd.Stdout = resultBuffer // stdout result will be written here
stdin, err := cmd.StdinPipe() // Open stdin pipe
check(err)
err = cmd.Start() // Start a process on another goroutine
check(err)
for {
_, err = stdin.Write(<-ch) // pump audio data to stdin pipe
check(err)
}
err = stdin.Close() // close the stdin, or ffmpeg will wait forever
check(err)
err = cmd.Wait() // wait until ffmpeg finish
check(err)
}
github.com/pion/webrtc/v2 not found
Hi! First of all, thank you for the great job implementing webrtc for go. And here is my issue.
//m.RegisterCodec(webrtc.NewRTPVP8Codec(webrtc.DefaultPayloadTypeVP8, 90000))
m.RegisterCodec(webrtc.NewRTPH264Codec(webrtc.DefaultPayloadTypeH264, 90000))
m.RegisterCodec(webrtc.NewRTPOpusCodec(webrtc.DefaultPayloadTypeOpus, 48000))
@Sean-Der Thanks for the hint.
browser webrtc log info:
Report type=inbound-rtp
id=RTCInboundRTPVideoStream_597189778
time=1617955656066.087
ssrc: 597189778
isRemote: false
mediaType: video
kind: video
trackId: RTCMediaStreamTrack_receiver_52
transportId: RTCTransport_0_1
codecId: RTCCodec_1_Inbound_102
firCount: 0
pliCount: 1680
nackCount: 0
packetsReceived: 37785
bytesReceived: 40068701
headerBytesReceived: 453420
packetsLost: 0
lastPacketReceivedTimestamp: 17640.963
framesReceived: 8525
framesPerSecond: 25
framesDecoded: 0
keyFramesDecoded: 140
framesDropped: 8474
totalDecodeTime: 0
totalInterFrameDelay: 0
totalSquaredInterFrameDelay: 0
decoderImplementation: FFmpeg
did i miss something?
Hey @cRuiTe
Thanks for checking out Pion. The example is hardcoded to always use x264enc
you can change the encoder here
Thanks for checking out Pion. If you run into anything else I am also available in Slack
Originally posted by @Sean-Der in #95 (comment)
I create simple publisher client that send rtsp stream data to sfu-ws signaling server, but OnTrack event in sfu-ws is not triggered.
SFU-WS log:
Here my code:
rtsp-client.zip
Environment: Ubuntu 20.04 server (x64)
Golang: 1.13.8 linux/amd64
Followed instructions to 'get' gstream-send repository
$ go get github.com/pion/example-webrtc-applications/gstreamer-send
A verification mentioning that the repository and its dependencies was fetched successfully.
cannot find package "github.com/pion/webrtc/v2" in any of:
/usr/lib/go-1.13/src/github.com/pion/webrtc/v2 (from $GOROOT)
/home/dpet/go/src/github.com/pion/webrtc/v2 (from $GOPATH)
package github.com/pion/webrtc/v2/pkg/media: cannot find package "github.com/pion/webrtc/v2/pkg/media" in any of:
/usr/lib/go-1.13/src/github.com/pion/webrtc/v2/pkg/media (from $GOROOT)
/home/dpet/go/src/github.com/pion/webrtc/v2/pkg/media (from $GOPATH)
The github.com/pion/webrtc/v2 folder does not exist. The Pion team has probably forgotten to update the dependencies of the examples.
I modified Janus' streaming example to use VP9 instead of VP8:
diff --git a/docker/etc/janus/janus.plugin.streaming.jcfg b/docker/etc/janus/janus.plugin.streaming.jcfg
index 1952fdce3..ffe1a82ad 100644
--- a/janus.plugin.streaming.jcfg
+++ b/janus.plugin.streaming.jcfg
@@ -93,7 +93,7 @@ general: {
gstreamer-sample: {
type = "rtp"
id = 1
- description = "Opus/VP8 live stream coming from gstreamer"
+ description = "Opus/VP9 live stream coming from gstreamer"
audio = true
video = true
audioport = 5002
@@ -101,7 +101,7 @@ gstreamer-sample: {
audiortpmap = "opus/48000/2"
videoport = 5004
videopt = 100
- videortpmap = "VP8/90000"
+ videortpmap = "VP9/90000"
secret = "adminpwd"
}
and
diff --git a/plugins/streams/test_gstreamer_1.sh b/plugins/streams/test_gstreamer_1.sh
index 772a6993..059f6cc2 100755
--- a/plugins/streams/test_gstreamer_1.sh
+++ b/plugins/streams/test_gstreamer_1.sh
@@ -1,11 +1,11 @@
#!/bin/sh
-gst-launch-1.0 \
+gst-launch-1.0 --verbose \
audiotestsrc ! \
audioresample ! audio/x-raw,channels=1,rate=16000 ! \
opusenc bitrate=20000 ! \
- rtpopuspay ! udpsink host=127.0.0.1 port=5002 \
+ rtpopuspay pt=111 ! udpsink host=127.0.0.1 port=5002 \
videotestsrc ! \
video/x-raw,width=320,height=240,framerate=15/1 ! \
videoscale ! videorate ! videoconvert ! timeoverlay ! \
vp8enc error-resilient=1 ! \
- rtpvp8pay ! udpsink host=127.0.0.1 port=5004
+ rtpvp8pay pt=100 ! udpsink host=127.0.0.1 port=5004
I confirmed that this was playable in the browser.
The pion streaming example to work with the stream (once modified to handle vp9):
diff --git a/janus-gateway/streaming/main.go b/janus-gateway/streaming/main.go
index 913d5f2..c41d10e 100644
--- a/janus-gateway/streaming/main.go
+++ b/janus-gateway/streaming/main.go
@@ -135,8 +135,8 @@ func main() {
panic(oggNewErr)
}
saveToDisk(i, track)
- } else if codec.Name == webrtc.VP8 {
- fmt.Println("Got VP8 track, saving to disk as output.ivf")
+ } else if codec.Name == webrtc.VP9 {
+ fmt.Println("Got VP9 track, saving to disk as output.ivf")
i, ivfNewErr := ivfwriter.New("output.ivf")
if ivfNewErr != nil {
panic(ivfNewErr)
panic: codec payloader not set
goroutine 1 [running]:
main.main()
When I use janus gateway videoroom example to connect janus-gateway 0.10.5 ,
Connection State has changed checking
Unknown message type received!
Unknown message type received!
Unknown message type received!
Unknown message type received!
Connection State has changed connected
2020/10/06 13:55:21 HangupEvent type 2767334169239943
Connection State has changed disconnected
I see janus gateway log said that wrong_certificate_type for dtls, What's the problem?
Hi!
How can I pass vp9 stream to ffmpeg?
Initially, I started working from saving to webm example with VP8. I modified the code to send samples to ffmpeg and it worked. Then I wanted to try with VP9 but I must be doing something wrong because ffmpeg decoder is unable to decode these samples and I'm only getting the following error "Not all references are available".
Here is my code for VP9:
sampleBuilder := samplebuilder.New(10, &codecs.VP9Packet{})
var videoTimestamp uint32
for !isCanceled {
packet := <- c.rtpChan
sampleBuilder.Push(packet)
sample := sampleBuilder.Pop()
if sample == nil {
continue
}
vp9Packet := codecs.VP9Packet{}
if _, err := vp9Packet.Unmarshal(packet.Payload); err != nil {
panic(err)
}
videoKeyframe := !vp9Packet.P
videoTimestamp += sample.Samples
if videoKeyframe {
width := int(vp9Packet.Width[0])
height := int(vp9Packet.Height[0])
c.writeInputInfoToMixer(inputCodecs.VP9, int32(width), int32(height))
}
if c.sentFirstKeyFrameToMixer || videoKeyframe {
c.writeSampleToMixer(videoTimestamp, videoKeyframe, sample.Data)
}
}
and the same for VP8:
sampleBuilder := samplebuilder.New(10, &codecs.VP8Packet{})
var videoTimestamp uint32
for !isCanceled {
sampleBuilder.Push(<- c.rtpChan)
sample := sampleBuilder.Pop()
if sample == nil {
continue
}
videoTimestamp += sample.Samples
videoKeyframe := sample.Data[0]&0x1 == 0
if videoKeyframe {
raw := uint(sample.Data[6]) | uint(sample.Data[7])<<8 | uint(sample.Data[8])<<16 | uint(sample.Data[9])<<24
width := int(raw & 0x3FFF)
height := int((raw >> 16) & 0x3FFF)
c.writeInputInfoToMixer(inputCodecs.VP8, int32(width), int32(height))
}
if c.sentFirstKeyFrameToMixer || videoKeyframe {
c.writeSampleToMixer(videoTimestamp, videoKeyframe, sample.Data)
}
}
Any idea what I'm doing wrong?
I wanted to try gstreamer-receive, and I had installation problems.
I found that the libopencv was updated on 17/05/2019, and that some dlls are missing.
I had:
GStreamer-WARNING **: 17:43:25.081: Failed to load plugin 'C:\msys64\mingw64\lib\gstreamer-1.0\libgstopencv.dll': 'C:\msys64\mingw64\lib\gstreamer-1.0\libgstopencv.dll': was not found. Error: Internal data stream error.
So i do :
ntldd /mingw64/lib/gstreamer-1.0/libgstopencv.dll
and I got :
KERNEL32.dll => C:\WINDOWS\SYSTEM32\KERNEL32.dll (0x0000000000c30000) msvcrt.dll => C:\WINDOWS\SYSTEM32\msvcrt.dll (0x0000000000c30000) libgcc_s_seh-1.dll => C:\msys64\mingw64\bin\libgcc_s_seh-1.dll (0x0000000000c30000) libstdc++-6.dll => C:\msys64\mingw64\bin\libstdc++-6.dll (0x0000000000c30000) libglib-2.0-0.dll => C:\msys64\mingw64\bin\libglib-2.0-0.dll (0x0000000000c30000) libgobject-2.0-0.dll => C:\msys64\mingw64\bin\libgobject-2.0-0.dll (0x0000000000c30000) libgstbase-1.0-0.dll => C:\msys64\mingw64\bin\libgstbase-1.0-0.dll (0x0000000000c30000) libgstreamer-1.0-0.dll => C:\msys64\mingw64\bin\libgstreamer-1.0-0.dll (0x0000000000cb0000) libgstvideo-1.0-0.dll => C:\msys64\mingw64\bin\libgstvideo-1.0-0.dll (0x0000000000c30000) libintl-8.dll => C:\msys64\mingw64\bin\libintl-8.dll (0x0000000000d50000) libopencv_bgsegm401.dll => not found libopencv_calib3d401.dll => not found libopencv_core401.dll => not found libopencv_features2d401.dll => not found libopencv_imgcodecs401.dll => not found libopencv_imgproc401.dll => not found libopencv_objdetect401.dll => not found libopencv_video401.dll => not found libgstopencv-1.0-0.dll => C:\msys64\mingw64\bin\libgstopencv-1.0-0.dll (0x0000000000020000)
To build, I did:
pacman -U http://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-opencv-4.0.1-1-any.pkg.tar.xz
then I had a:
Connection State has changed connected Track has started, of type 111: opus Track has started, of type 96: VP8 Error: Internal data stream error.
I see those lines of code (from line 38 to line 42) have duplicated code. I don't understand whether the duplicated part serves for a specific purpose but it seems that this is not necessary.
https://github.com/pion/example-webrtc-applications/blob/master/gstreamer-receive/main.go#L38
1522408cc9583551e53c327cfd4492144080ad68
Ubuntu (#836-Microsoft Mon May 05 16:04:00 PST 2020)
version go1.14.2 linux/amd64
go get github.com/pion/example-webrtc-applications/gocv-receive
or even
go build -i ./gocv-receive/
the build should succeed
can't load package: package ./gocv-receive: build constraints exclude all Go files in $GOPATH/github.com/pion/example-webrtc-applications/gocv-receive
remove // +build gocv
at the top of main.go, and build works. Am I missing something?
https://github.com/pions/webrtc/blob/master/examples/sfu-ws/web.go#L16
This generating the PEM and Key.
However the example uses the browser and so we need a way to inject the the PEM into your browser.
https://support.securly.com/hc/en-us/articles/206081828-How-to-manually-install-the-Securly-SSL-certificate-in-Chrome
Also it generates the new PEM on every run, and so you have to reinject it into the browser.
How about this ?
We need a common way for all he examples.
this might help:
https://github.com/FiloSottile/mkcert
how to go build janus-gateway example for windows
Connection State has changed connected
Track has started, of type 111: opus
Track has started, of type 96: VP8
WebM saver has started with video width=640, height=480
ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
built with Apple LLVM version 10.0.0 (clang-1000.11.45.5)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gpl --enable-libmp3lame --enable-libopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-opencl --enable-videotoolbox
libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
libpostproc 55. 3.100 / 55. 3.100
Input #0, matroska,webm, from 'pipe:0':
Metadata:
encoder : ebml-go.webm.BlockWriter
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
Metadata:
title : Audio
Stream #0:1(eng): Video: vp8, yuv420p(progressive), 640x480, SAR 1:1 DAR 4:3, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
Metadata:
title : Video
Stream mapping:
Stream #0:1 -> #0:0 (vp8 (native) -> h264 (libx264))
Stream #0:0 -> #0:1 (opus (native) -> aac (native))
[libx264 @ 0x7fe6bb80f800] using SAR=1/1
[libx264 @ 0x7fe6bb80f800] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0x7fe6bb80f800] profile High, level 3.0
[libx264 @ 0x7fe6bb80f800] 264 - core 152 r2854 e9a5903 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=1 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=2 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=1 keyint=50 keyint_min=5 scenecut=40 intra_refresh=0 rc_lookahead=10 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=3000 vbv_bufsize=6000 crf_max=0.0 nal_hrd=none filler=0 ip_ratio=1.40 aq=1:1.00
Output #0, flv, to 'rtmp://REDACTED_FOR_PRIVACY':
Metadata:
encoder : Lavf58.20.100
Stream #0:0(eng): Video: h264 (libx264) ([7][0][0][0] / 0x0007), yuv420p, 640x480 [SAR 1:1 DAR 4:3], q=-1--1, 30 fps, 1k tbn, 30 tbc (default)
Metadata:
title : Video
encoder : Lavc58.35.100 libx264
Side data:
cpb: bitrate max/min/avg: 3000000/0/0 buffer size: 6000000 vbv_delay: -1
Stream #0:1(eng): Audio: aac (LC) ([10][0][0][0] / 0x000A), 44100 Hz, stereo, fltp, 160 kb/s (default)
Metadata:
title : Audio
encoder : Lavc58.35.100 aac
**av_interleaved_write_frame(): End of fileB** time=00:00:46.39 bitrate= 473.6kbits/s speed=0.999x
Last message repeated 1 times
[flv @ 0x7fe6bb80e600] Failed to update header with correct duration.
[flv @ 0x7fe6bb80e600] Failed to update header with correct filesize.
**Error writing trailer of rtmp://REDACTED_FOR_PRIVACY: End of file**
frame= 575 fps= 12 q=27.0 Lsize= 2682kB time=00:00:46.71 bitrate= 470.3kbits/s speed=0.998x
video:1935kB audio:920kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
[libx264 @ 0x7fe6bb80f800] frame I:17 Avg QP:19.12 size: 16985
[libx264 @ 0x7fe6bb80f800] frame P:294 Avg QP:21.21 size: 4813
[libx264 @ 0x7fe6bb80f800] frame B:264 Avg QP:22.01 size: 1345
[libx264 @ 0x7fe6bb80f800] consecutive B-frames: 30.3% 20.9% 14.1% 34.8%
[libx264 @ 0x7fe6bb80f800] mb I I16..4: 28.2% 30.7% 41.0%
[libx264 @ 0x7fe6bb80f800] mb P I16..4: 13.3% 8.0% 2.8% P16..4: 25.6% 6.8% 3.0% 0.0% 0.0% skip:40.6%
[libx264 @ 0x7fe6bb80f800] mb B I16..4: 3.9% 1.7% 0.2% B16..8: 11.7% 3.4% 0.4% direct: 6.0% skip:72.8% L0:51.3% L1:42.3% BI: 6.4%
[libx264 @ 0x7fe6bb80f800] 8x8 transform intra:32.2% inter:38.0%
[libx264 @ 0x7fe6bb80f800] coded y,uvDC,uvAC intra: 45.2% 53.5% 21.3% inter: 9.0% 17.2% 0.9%
[libx264 @ 0x7fe6bb80f800] i16 v,h,dc,p: 27% 29% 40% 4%
[libx264 @ 0x7fe6bb80f800] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 30% 31% 23% 1% 3% 5% 3% 2% 3%
[libx264 @ 0x7fe6bb80f800] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 30% 38% 11% 3% 3% 5% 4% 4% 3%
[libx264 @ 0x7fe6bb80f800] i8c dc,h,v,p: 54% 26% 16% 3%
[libx264 @ 0x7fe6bb80f800] Weighted P-Frames: Y:3.7% UV:2.0%
[libx264 @ 0x7fe6bb80f800] kb/s:430.43
[aac @ 0x7fe6bc81aa00] Qavg: 9015.414
**Conversion failed!
panic: write |1: broken pipe
panic: write |1: broken pipe**
goroutine 65 [running]:
github.com/at-wat/ebml-go/mkvcore.NewSimpleBlockWriter.func1(0x1639600, 0xc0004bc1e0)
/Users/denoue/go/pkg/mod/github.com/at-wat/[email protected]/mkvcore/blockwriter.go:76 +0x3e
github.com/at-wat/ebml-go/mkvcore.NewSimpleBlockWriter.func4.1(0xc00010bea8, 0xc00010beb8, 0xc000110840, 0xc0001ec0e0, 0xc000465620)
/Users/denoue/go/pkg/mod/github.com/at-wat/[email protected]/mkvcore/blockwriter.go:178 +0x149
panic(0x1505440, 0xc0004bc180)
/usr/local/go/src/runtime/panic.go:969 +0x166
github.com/at-wat/ebml-go/mkvcore.NewSimpleBlockWriter.func1(0x1639600, 0xc0004bc180)
/Users/denoue/go/pkg/mod/github.com/at-wat/[email protected]/mkvcore/blockwriter.go:76 +0x3e
github.com/at-wat/ebml-go/mkvcore.NewSimpleBlockWriter.func4(0xc000110840, 0xc0001ec0e0, 0xc000465620, 0xc0004657a0, 0xc0004655c0, 0x7fff)
/Users/denoue/go/pkg/mod/github.com/at-wat/[email protected]/mkvcore/blockwriter.go:238 +0x475
created by github.com/at-wat/ebml-go/mkvcore.NewSimpleBlockWriter
/Users/denoue/go/pkg/mod/github.com/at-wat/[email protected]/mkvcore/blockwriter.go:156 +0x70a
exit status 2
I ran the twitch sample by sending my SDP using EXPORT SDP=... and then echo $SDP | go run main.go
I expect ffmpeg to keep converting the incoming RTP audio and video packets and pushing the converted audio/video to my RTMP endpoint.
Everything works for a few seconds (and I can see my stream for a little while, even though it's highly pixelated), but then it fails with the stack trace shown above.
I could connect to the janus video room successfully with your example, but is it possible to send the webcam (or video file) with audio to the janus video room? Could you put its code in golang please?
DOMException: Failed to execute 'setLocalDescription' on 'RTCPeerConnection': Failed to set local answer sdp:
. I'm not a WebRTC expert, but it seems like renegotiation doesn't happen when it needs to. I realize that this is not a production-ready example, but I don't understand what do I need to fix here.Thanks for your help!
git clone https://github.com/pion/example-webrtc-applications.git
cd example-webrtc-applications/sfu-ws
go run *.go
Then open 4 tabs of localhost:8080
Each tab displays all the remote streams.
Some tabs do not show all the remote streams. Any new tab over 3rd doesn't show remote streams at all.
Attempting to create an application that connects to an existing WebRTC platform, able to successfully create a connection locally (host), or without relaying (srflx) but unable to relay via a coTURN server that is known to be working.
ICE Configuration
ICEServers: []webrtc.ICEServer{
{
URLs: []string{"turn:relay.dev.haia.live:443?transport=tcp"},
Username: "swarm",
Credential: s.Source,
CredentialType: webrtc.ICECredentialTypePassword,
},
{
URLs: []string{"turn:relay.dev.haia.live:443?transport=udp"},
Username: "swarm",
Credential: s.Source,
CredentialType: webrtc.ICECredentialTypePassword,
},
{
URLs: []string{"turn:relay.dev.haia.live:80?transport=tcp"},
Username: "swarm",
Credential: s.Source,
CredentialType: webrtc.ICECredentialTypePassword,
},
{
URLs: []string{"turn:relay.dev.haia.live:80?transport=udp"},
Username: "swarm",
Credential: s.Source,
CredentialType: webrtc.ICECredentialTypePassword,
},
},
Example returned Candidates
candidate="{candidate:3312907880 1 udp 2130706431 192.168.1.205 56893 typ host 0xc000164210 0xc00009c13a <nil>}"
candidate="{candidate:750502208 1 udp 2130706431 10.0.251.6 65012 typ host 0xc00021a250 0xc0002480ca <nil>}"
candidate="{candidate:3178305033 1 udp 1694498815 <public-ip> 51635 typ srflx raddr 0.0.0.0 rport 51635 0xc0003237e0 0xc00038db5a <nil>}"
candidate="{candidate:3178305033 1 udp 1694498815 <public-ip> 62141 typ srflx raddr 0.0.0.0 rport 62141 0xc000268330 0xc00029235e <nil>}"
candidate="{candidate:3178305033 1 udp 1694498815 <public-ip> 64126 typ srflx raddr 0.0.0.0 rport 64126 0xc00021a000 0xc00026006e <nil>}"
candidate="{candidate:3178305033 1 udp 1694498815 <public-ip> 64007 typ srflx raddr 0.0.0.0 rport 64007 0xc00024c050 0xc00009c0aa <nil>}"
During Candidate Gathering to see Relay type candidates
Only Host and SRFLX type Candidates are provided
Not usre where exactly yo ask this, but I'm looking for some advise on processing a stream. Firstly, thank you for Pion, it's awesome!
We have it in a project that connects in to a call and monitors the users by doing some facial recognition and adult content detection. Everything is working really well, apart from when a user has a bad wifi connection.
We started building from the janus-gateway
example and to get the image so we can process it in gocv we use the example in gocv-receive
.
This uses ffmpeg with an input and output pipe. An ivfWriter sends it to the input, and we read it from the 'output' as per the example. We then open it as an opencv mat.
The problem:
When viewing the stream in a browser, when it get's choppy due to a bad wifi signal the browser drops the frames rather than showing garbled data. With pion -> ffmpeg -> gocv we get garbled frames as shown in the image below.
I've tried various ffmpeg commands to see if we can detect these bad fames/packets: "ffmpeg", "-err_detect", "buffer", "-fflags", "discardcorrupt"
but whatever I try, when we simulate a bad connection it destroys the image.
Is there a way of detecting when the image is bad? Is there a way of stopping or dropping these frames? I'm not 100% sure where the issue is so even pointing me in the right direction would be greatly appreciated!
When the signal is bad, for bad frames to be dropped.
I'm seeing garbled frames when the connection is bad, or just before it disconnects.
I tried to modify the given https://github.com/pion/example-webrtc-applications/tree/master/sfu-ws example to support trickleICE as below,
m := webrtc.MediaEngine{}
s := webrtc.SettingEngine{}
s.SetTrickle(true)
// Setup the codecs you want to use.
m.RegisterCodec(webrtc.NewRTPVP8Codec(webrtc.DefaultPayloadTypeVP8, 90000))
m.RegisterCodec(webrtc.NewRTPOpusCodec(webrtc.DefaultPayloadTypeOpus, 48000))
// Create the API object with the MediaEngine
api := webrtc.NewAPI(webrtc.WithMediaEngine(m), webrtc.WithSettingEngine(s))
func WsConn(w http.ResponseWriter, r *http.Request) {
// Websocket client
c, err := upgrader.Upgrade(w, r, nil)
lutil.CheckError(err)
// Make sure we close the connection when the function returns
defer c.Close()
for {
var msg JsonMsg
// Read in a new message as JSON and map it to a Message object
err := c.ReadJSON(&msg)
if err != nil {
log.Printf("error: %v", err)
delete(ConnMap, c)
break
}
if msg.PeerType == "pub" {
if msg.Sdp != "" {
// Create a new RTCPeerConnection
pubReceiverC, err = Api.NewPeerConnection(peerConnectionConfig)
lutil.CheckError(err)
_, err = pubReceiverC.AddTransceiverFromKind(webrtc.RTPCodecTypeAudio)
lutil.CheckError(err)
_, err = pubReceiverC.AddTransceiverFromKind(webrtc.RTPCodecTypeVideo)
lutil.CheckError(err)
pubReceiverC.OnTrack(func(remoteTrack *webrtc.Track, receiver *webrtc.RTPReceiver) {
if remoteTrack.PayloadType() == webrtc.DefaultPayloadTypeVP8 || remoteTrack.PayloadType() == webrtc.DefaultPayloadTypeVP9 || remoteTrack.PayloadType() == webrtc.DefaultPayloadTypeH264 {
// Create a local video track, all our SFU clients will be fed via this track
var err error
videoTrackLockC.Lock()
videoTrackC, err = pubReceiverC.NewTrack(remoteTrack.PayloadType(), remoteTrack.SSRC(), "video", "pion")
videoTrackLockC.Unlock()
lutil.CheckError(err)
// Send a PLI on an interval so that the publisher is pushing a keyframe every rtcpPLIInterval
go func() {
ticker := time.NewTicker(rtcpPLIInterval)
for range ticker.C {
lutil.CheckError(pubReceiverC.WriteRTCP([]rtcp.Packet{&rtcp.PictureLossIndication{MediaSSRC: videoTrackC.SSRC()}}))
}
}()
rtpBuf := make([]byte, 1400)
for {
i, err := remoteTrack.Read(rtpBuf)
lutil.CheckError(err)
videoTrackLockC.RLock()
_, err = videoTrackC.Write(rtpBuf[:i])
videoTrackLockC.RUnlock()
if err != io.ErrClosedPipe {
lutil.CheckError(err)
}
}
} else {
// Create a local audio track, all our SFU clients will be fed via this track
var err error
audioTrackLockC.Lock()
audioTrackC, err = pubReceiverC.NewTrack(remoteTrack.PayloadType(), remoteTrack.SSRC(), "audio", "pion")
audioTrackLockC.Unlock()
lutil.CheckError(err)
rtpBuf := make([]byte, 1400)
for {
i, err := remoteTrack.Read(rtpBuf)
lutil.CheckError(err)
audioTrackLockC.RLock()
_, err = audioTrackC.Write(rtpBuf[:i])
audioTrackLockC.RUnlock()
if err != io.ErrClosedPipe {
lutil.CheckError(err)
}
}
}
})
// Set the remote SessionDescription
lutil.CheckError(pubReceiverC.SetRemoteDescription(
webrtc.SessionDescription{
SDP: string(msg.Sdp),
Type: webrtc.SDPTypeOffer,
}))
// Create answer
answer, err := pubReceiverC.CreateAnswer(nil)
lutil.CheckError(err)
// Sets the LocalDescription, and starts our UDP listeners
lutil.CheckError(pubReceiverC.SetLocalDescription(answer))
// Send server sdp to publisher
var sdpMsg = JsonMsg{PeerId: msg.PeerId, Sdp: answer.SDP, PeerType: msg.PeerType, IceCandidate: struct {
Candidate string
SDPMid string
SDPMLineIndex uint16
}{Candidate: "", SDPMid: "", SDPMLineIndex: 0}}
lutil.CheckError(c.WriteJSON(sdpMsg))
// Register incoming channel
pubReceiverC.OnDataChannel(func(d *webrtc.DataChannel) {
d.OnMessage(func(msg webrtc.DataChannelMessage) {
// Broadcast the data to subSenders
broadcastHub.broadcastChannel <- msg.Data
})
})
// Register for ice candidate generation
pubReceiverC.OnICECandidate(func(candidate *webrtc.ICECandidate) {
var iceMsg = JsonMsg{PeerId: msg.PeerId, Sdp: "", IceCandidate: struct {
Candidate string
SDPMid string
SDPMLineIndex uint16
}{Candidate: candidate.ToJSON().Candidate, SDPMid: *candidate.ToJSON().SDPMid, SDPMLineIndex: *candidate.ToJSON().SDPMLineIndex},
PeerType: msg.PeerType}
lutil.CheckError(c.WriteJSON(iceMsg))
})
} else if &msg.IceCandidate != nil && msg.IceCandidate.Candidate != "" {
var iceCandidate = webrtc.ICECandidateInit{Candidate: msg.IceCandidate.Candidate, SDPMid: &msg.IceCandidate.SDPMid,
SDPMLineIndex: &msg.IceCandidate.SDPMLineIndex, UsernameFragment: ""}
pubReceiverC.AddICECandidate(iceCandidate)
} else {
fmt.Println("PUB: None of matching msg sdp or ice")
}
} else {
if msg.Sdp != "" {
// Create a new RTCPeerConnection
subSenderC, err = Api.NewPeerConnection(peerConnectionConfig)
lutil.CheckError(err)
_, err = subSenderC.AddTransceiverFromKind(webrtc.RTPCodecTypeAudio)
lutil.CheckError(err)
_, err = subSenderC.AddTransceiverFromKind(webrtc.RTPCodecTypeVideo)
lutil.CheckError(err)
// Waiting for publisher track finish
for {
videoTrackLockC.RLock()
if videoTrackC == nil {
videoTrackLockC.RUnlock()
fmt.Println("Waiting for local video track to come up...")
time.Sleep(100 * time.Millisecond)
} else {
videoTrackLockC.RUnlock()
break
}
}
// Add local video track
videoTrackLockC.RLock()
_, err = subSenderC.AddTrack(videoTrackC)
videoTrackLockC.RUnlock()
lutil.CheckError(err)
// Add local audio track
audioTrackLockC.RLock()
_, err = subSenderC.AddTrack(audioTrackC)
audioTrackLockC.RUnlock()
lutil.CheckError(err)
// Set the remote SessionDescription
lutil.CheckError(subSenderC.SetRemoteDescription(
webrtc.SessionDescription{
SDP: string(msg.Sdp),
Type: webrtc.SDPTypeOffer,
}))
// Create answer
answer, err := subSenderC.CreateAnswer(nil)
lutil.CheckError(err)
// Sets the LocalDescription, and starts our UDP listeners
lutil.CheckError(subSenderC.SetLocalDescription(answer))
// Send server sdp to publisher
var sdpMsg = JsonMsg{PeerId: msg.PeerId, Sdp: answer.SDP, PeerType: msg.PeerType, IceCandidate: struct {
Candidate string
SDPMid string
SDPMLineIndex uint16
}{Candidate: "", SDPMid: "", SDPMLineIndex: 0}}
lutil.CheckError(c.WriteJSON(sdpMsg))
// Register incoming channel
subSenderC.OnDataChannel(func(d *webrtc.DataChannel) {
d.OnMessage(func(msg webrtc.DataChannelMessage) {
// Broadcast the data to subSenders
broadcastHub.broadcastChannel <- msg.Data
})
})
// Register for ice candidate generation
subSenderC.OnICECandidate(func(candidate *webrtc.ICECandidate) {
var iceMsg = JsonMsg{PeerId: msg.PeerId, Sdp: "", IceCandidate: struct {
Candidate string
SDPMid string
SDPMLineIndex uint16
}{Candidate: candidate.ToJSON().Candidate, SDPMid: *candidate.ToJSON().SDPMid, SDPMLineIndex: *candidate.ToJSON().SDPMLineIndex},
PeerType: msg.PeerType}
lutil.CheckError(c.WriteJSON(iceMsg))
})
} else if &msg.IceCandidate != nil && msg.IceCandidate.Candidate != "" {
var iceCandidate = webrtc.ICECandidateInit{Candidate: msg.IceCandidate.Candidate, SDPMid: &msg.IceCandidate.SDPMid,
SDPMLineIndex: &msg.IceCandidate.SDPMLineIndex, UsernameFragment: ""}
subSenderC.AddICECandidate(iceCandidate)
} else {
fmt.Println("SUB: None of matching msg sdp or ice")
}
}
}
}
type JsonMsg struct {
PeerId string
Sdp string
IceCandidate struct {
Candidate string
SDPMid string
SDPMLineIndex uint16
}
PeerType string
}
Rest all is same with a set of variables
videoTrackC *webrtc.Track
audioTrackC *webrtc.Track
videoTrackLockC = sync.RWMutex{}
audioTrackLockC = sync.RWMutex{}
pubReceiverC *webrtc.PeerConnection
subSenderC *webrtc.PeerConnection
The behavior seen is when tried from Chrome Browser with 2 instances one as publisher and other as subscriber, the default Room function works fine
But for above written WsConn function with Trickle ICE
The only changes I did to given example is to modify websocket json a bit to support SDP and ICE with some extra info and apply the ICE messages as they arrive to respective peer connection
i want to use v4l2h264enc or omxh264enc for Hardware Acceleration, so use the example code "gstreamer-send gst.go",and use v4l2h264enc or omxh264enc instead x264enc in example code,like:
pipelineStr = pipelineSrc + " ! v4l2h264enc extra-controls=s,video_bitrate=2000000 ! video/x-h264,profile=constrained-baseline,level=(string)3.1 ! " + pipelineStr
or
pipelineStr = pipelineSrc + " ! omxh264enc control-rate=1 target-bitrate=1145000 ! " + pipelineStr
webrtc app with pion
browser can not see video,use ur example code x264enc work fine.
no error log and the browser-webrtc log like this:
Report type=inbound-rtp
id=RTCInboundRTPVideoStream_597189778
time=1617955656066.087
ssrc: 597189778
isRemote: false
mediaType: video
kind: video
trackId: RTCMediaStreamTrack_receiver_52
transportId: RTCTransport_0_1
codecId: RTCCodec_1_Inbound_102
firCount: 0
pliCount: 1680
nackCount: 0
packetsReceived: 37785
bytesReceived: 40068701
headerBytesReceived: 453420
packetsLost: 0
lastPacketReceivedTimestamp: 17640.963
framesReceived: 8525
framesPerSecond: 25
framesDecoded: 0
keyFramesDecoded: 140
framesDropped: 8474
totalDecodeTime: 0
totalInterFrameDelay: 0
totalSquaredInterFrameDelay: 0
decoderImplementation: FFmpeg
u can see the bytesReceived: 40068701 packetsReceived: 37785 framesReceived: 8525 but framesDropped: 8474 framesDecoded: 0
i use gst-launch-1.0 like:
gst-launch-1.0 -vvvv v4l2src ! image/jpeg,width=800,height=600,framerate=30/1 ! jpegparse ! jpegdec ! v4l2convert ! v4l2h264enc extra-controls=s,video_bitrate=2000000 ! 'video/x-h264,profile=constrained-baseline,level=(string)3.1' ! filesink location=a.mp4 sync=false
the file a.mp4 is fine.
Could u help me?
Installed sfu-ws on a remote server.
Basic cross-browser video conferencing
It worked like a charm on Chrome and Firefox but has its issues with Safari (both osx and ios). Please note Chrome perfect on osx, but is not supported on ios.
It seems that this is quite a known issue. I found articles and Bug reports claiming the problem to be with lack of Saffari's support for VP8.
Although there were no particular panics or warnings, yet every now and then is see the following error:
pc ERROR: 2021/02/11 13:42:50 Incoming unhandled RTP ssrc(741086092), OnTrack will not be fired. stream id RTP Extensions required for Simulcast
pc ERROR: 2021/02/11 13:24:26 Incoming unhandled RTP ssrc(1168873309), OnTrack will not be fired. incoming SSRC failed Simulcast probing
However, Safari triggers onTrack and adds a video element, but no stream is played on the added video element. Whereas Chrome or Firefox do not fire onTrack, when streamed from Safari. Hence, no video element is added to the remote-videos sector.
Should it be of interest, I can provide the Nginx Site-Config file.
Any idea where I'm going wrong?
Thanks in advance.
PS: I had to add wss
support on line 61 in main.go and in index.html to make it work remotely.
Can this lib support to receive rtsp by gocv and AI detect and cast a stream to webrtc or rtmp by ffmpeg?
Follow README and run.
Run without crash.
Crash
I think we can change that "null" to empty string, "", and the bug fixed
go_mod_info{name="../../dtls",program="sfu-ws",version=""} 1
go_mod_info{name="github.com/beorn7/perks",program="sfu-ws",version="v0.0.0-20180321164747-3a771d992973"} 1
go_mod_info{name="github.com/golang/protobuf",program="sfu-ws",version="v1.2.0"} 1
go_mod_info{name="github.com/gorilla/websocket",program="sfu-ws",version="v1.4.0"} 1
go_mod_info{name="github.com/matttproud/golang_protobuf_extensions",program="sfu-ws",version="v1.0.1"} 1
go_mod_info{name="github.com/pion/datachannel",program="sfu-ws",version="v1.3.0"} 1
go_mod_info{name="github.com/pion/ice",program="sfu-ws",version="v0.2.1"} 1
go_mod_info{name="github.com/pion/logging",program="sfu-ws",version="v0.2.1"} 1
go_mod_info{name="github.com/pion/rtcp",program="sfu-ws",version="v1.1.5"} 1
go_mod_info{name="github.com/pion/rtp",program="sfu-ws",version="v1.1.1"} 1
go_mod_info{name="github.com/pion/sctp",program="sfu-ws",version="v1.5.0"} 1
go_mod_info{name="github.com/pion/sdp/v2",program="sfu-ws",version="v2.1.1"} 1
go_mod_info{name="github.com/pion/srtp",program="sfu-ws",version="v1.2.1"} 1
go_mod_info{name="github.com/pion/stun",program="sfu-ws",version="v0.2.1"} 1
go_mod_info{name="github.com/pion/transport",program="sfu-ws",version="v0.6.0"} 1
go_mod_info{name="github.com/pion/webrtc/v2",program="sfu-ws",version="v2.0.5"} 1
go_mod_info{name="github.com/pkg/errors",program="sfu-ws",version="v0.8.1"} 1
go_mod_info{name="github.com/povilasv/prommod",program="sfu-ws",version="v0.0.11"} 1
go_mod_info{name="github.com/prometheus/client_golang",program="sfu-ws",version="v0.9.2"} 1
go_mod_info{name="github.com/prometheus/client_model",program="sfu-ws",version="v0.0.0-20180712105110-5c3871d89910"} 1
go_mod_info{name="github.com/prometheus/common",program="sfu-ws",version="v0.0.0-20181126121408-4724e9255275"} 1
go_mod_info{name="github.com/prometheus/procfs",program="sfu-ws",version="v0.0.0-20181204211112-1dc9a6cbc91a"} 1
go_mod_info{name="golang.org/x/crypto",program="sfu-ws",version="v0.0.0-20190404164418-38d8ce5564a5"} 1
run sfu-ws example, click publish
Do not crash
crashed
2019/04/10 19:42:17 http: panic serving 10.232.7.215:59926: TypeError: offer SDP semantics does not match configuration
goroutine 25 [running]:
net/http.(*conn).serve.func1(0xc000330140)
/home/jinlei1/os/go/src/net/http/server.go:1769 +0xc9
panic(0x9438e0, 0xc000399350)
/home/jinlei1/os/go/src/runtime/panic.go:522 +0x1b5
main.checkError(...)
/home/jinlei1/ksyun/src/github.com/pion/example-webrtc-applications/sfu-ws/main.go:16
main.room(0xaad8c0, 0xc0003561c0, 0xc00018a300)
/home/jinlei1/ksyun/src/github.com/pion/example-webrtc-applications/sfu-ws/room.go:142 +0x8f7
net/http.HandlerFunc.ServeHTTP(0xa0ff50, 0xaad8c0, 0xc0003561c0, 0xc00018a300)
/home/jinlei1/os/go/src/net/http/server.go:1995 +0x44
net/http.(*ServeMux).ServeHTTP(0xe8bf40, 0xaad8c0, 0xc0003561c0, 0xc00018a300)
/home/jinlei1/os/go/src/net/http/server.go:2375 +0x1d6
net/http.serverHandler.ServeHTTP(0xc00019e340, 0xaad8c0, 0xc0003561c0, 0xc00018a300)
/home/jinlei1/os/go/src/net/http/server.go:2774 +0xab
net/http.(*conn).serve(0xc000330140, 0xaaeb00, 0xc0001849c0)
/home/jinlei1/os/go/src/net/http/server.go:1878 +0x84c
created by net/http.(*Server).Serve
/home/jinlei1/os/go/src/net/http/server.go:2884 +0x2f4
API seems been changed
github.com/pion/example-webrtc-applications/janus-gateway/streaming
# github.com/pion/example-webrtc-applications/janus-gateway/streaming
janus-gateway/streaming/main.go:39:41: handle.Id undefined (type *janus.Handle has no field or method Id, but does have ID)
janus-gateway/streaming/main.go:43:38: handle.Id undefined (type *janus.Handle has no field or method Id, but does have ID)
janus-gateway/streaming/main.go:45:41: handle.Id undefined (type *janus.Handle has no field or method Id, but does have ID)
github.com/pion/example-webrtc-applications/janus-gateway/video-room
# github.com/pion/example-webrtc-applications/janus-gateway/video-room
janus-gateway/video-room/main.go:21:43: handle.Id undefined (type *janus.Handle has no field or method Id, but does have ID)
janus-gateway/video-room/main.go:25:40: handle.Id undefined (type *janus.Handle has no field or method Id, but does have ID)
janus-gateway/video-room/main.go:27:43: handle.Id undefined (type *janus.Handle has no field or method Id, but does have ID)
Running janus-gateway/plugins/streams$ ./test_gstreamer_1.sh
as per https://github.com/pion/example-webrtc-applications/blob/master/janus-gateway/README.md I've confirmed that the stream is present in the janus demo page:
VP8 video and Opus audio to be recorded.
When running the https://github.com/pion/example-webrtc-applications/blob/master/janus-gateway/streaming example, it only records Opus audio:
Connection State has changed checking
Connection State has changed connected
EventMsg map[result:map[status:started] streaming:event]WebRTCUp type 5260567037834835Got Opus track, saving to disk as output.opus
I'm not sure if this is an issue with Janus, pion, or both.
go get github.com/pion/example-webrtc-applications/play-from-disk-h264
Download play-from-disk-h264
go get github.com/pion/example-webrtc-applications/play-from-disk-h264
go: downloading github.com/pion/example-webrtc-applications v1.0.0
go get: module github.com/pion/example-webrtc-applications@upgrade found (v1.0.0), but does not contain package github.com/pion/example-webrtc-applications/play-from-disk-h264
The example should heavily use Go
for most parts, which means Go
should be used as a plugin. For simplicity, C
should be only called from the data channel's OnMessage
as a callback, https://godoc.org/github.com/pion/webrtc#DataChannel.OnMessage.
I've be trying to pass rtc media packet to ffmpeg, so i decide using unix socket but seems the frame is not valid!
I'm passing the frame bytes s.vCallback(s.width,s.height,videoKeyframe, int64(t), sample.Data);
via unix socket then use ffmpeg to convert it to mp4 by connecting to the socket but unfortunately the mp4 is always corrupted without displaying anything.
The command line
ffmpeg -vsync cfr -f rawvideo -c:v rawvideo -fflags nobuffer -s 320x180 -pix_fmt yuv420p -i unix:./video.sock -f s16le -ar 48k -ac 1 -fflags nobuffer -i unix:./audio.sock -flags +global_header -acodec libfdk_aac -vsync 1 -vcodec libx264 -r 25 -b:v 4000k -pix_fmt yuv420p -preset slow -qp 0 vid.mp4
Here is the code below which i strap scope from save-to-webm
package streamBuf
import (
"errors"
"fmt"
"github.com/pion/rtp"
"github.com/pion/rtp/codecs"
"github.com/pion/webrtc/v2"
"github.com/pion/webrtc/v2/pkg/media/samplebuilder"
)
var (
// ErrCodecNotSupported is returned when a rtp packed it pushed with an unsupported codec
ErrCodecNotSupported = errors.New("codec not supported")
)
type MediaBuf struct {
id string
typ string
audioBuilder, videoBuilder *samplebuilder.SampleBuilder
audioTimestamp, videoTimestamp uint32
audCallback AudCallback
vidCallback VidCallback
width int
height int
initVid bool
}
type AudCallback func(bool, int64, []byte)
type VidCallback func(int, int, bool, int64, []byte)
func NewMediaBuf(id, typ string, audCB AudCallback, vidCB VidCallback) *MediaBuf {
return &MediaBuf{
id: id,
typ: typ,
audCallback: audCB,
vidCallback: vidCB,
audioBuilder: samplebuilder.New(10, &codecs.OpusPacket{}),
videoBuilder: samplebuilder.New(10, &codecs.VP8Packet{}),
}
}
func (s *MediaBuf) ID() string {
return s.id
}
func (s *MediaBuf) PushRTP(pkt *rtp.Packet) error {
if s.typ == "video" && pkt.PayloadType == webrtc.DefaultPayloadTypeVP8 {
s.PushVP8(pkt)
} else if s.typ == "audio" && pkt.PayloadType == webrtc.DefaultPayloadTypeOpus {
s.PushOpus(pkt)
}
return ErrCodecNotSupported
}
func (s *MediaBuf) Stop() {
s.Close()
}
func (s *MediaBuf) Close() {
fmt.Printf("Finalizing media...\n")
}
func (s *MediaBuf) PushOpus(rtpPacket *rtp.Packet) {
s.audioBuilder.Push(rtpPacket)
for {
sample, timestamp := s.audioBuilder.PopWithTimestamp()
if sample == nil {
return
}
if s.audioTimestamp == 0 {
s.audioTimestamp = timestamp
}
t := (timestamp - s.audioTimestamp) / 48
s.aCallback(true, int64(t), sample.Data)
}
}
func (s *MediaBuf) PushVP8(rtpPacket *rtp.Packet) {
s.videoBuilder.Push(rtpPacket)
for {
sample, timestamp := s.videoBuilder.PopWithTimestamp()
if sample == nil {
return
}
// Read VP8 header.
videoKeyframe := (sample.Data[0]&0x1 == 0)
if videoKeyframe {
// Keyframe has frame information.
raw := uint(sample.Data[6]) | uint(sample.Data[7])<<8 | uint(sample.Data[8])<<16 | uint(sample.Data[9])<<24
width := int(raw & 0x3FFF)
height := int((raw >> 16) & 0x3FFF)
if !s.initVid {
// Initialize WebM saver using received frame size.
s.width = width
s.height = height
s.initVid = true
}
}
if s.initVid {
if s.videoTimestamp == 0 {
s.videoTimestamp = timestamp
}
t := (timestamp - s.videoTimestamp) / 90
s.vCallback(s.width,s.height,videoKeyframe, int64(t), sample.Data);
}
}
}
func (s *MediaBuf) vCallback(width, height int, keyframe bool, timestamp int64, b []byte) {
s.vidCallback(width, height, keyframe, timestamp, b)
}
func (s *MediaBuf) aCallback(keyframe bool, timestamp int64, b []byte) {
s.audCallback(keyframe, timestamp, b)
}
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.