Giter Site home page Giter Site logo

pion / example-webrtc-applications Goto Github PK

View Code? Open in Web Editor NEW
949.0 949.0 235.0 417 KB

Examples of WebRTC applications that are large, or use 3rd party libraries

Home Page: https://pion.ly/

License: MIT License

HTML 6.64% Go 76.62% CSS 0.66% JavaScript 5.29% C 7.09% Makefile 0.21% Dart 3.50%
go golang pion

example-webrtc-applications's Introduction

Examples WebRTC Applications

The following are a collection of example applications built by Pion users. These applications show real world usage of Pion, and should serve as a good starting point for your next project. For more minimal examples check out examples in the Pion WebRTC repository

If you have a request please make an issue, we also love contributions more examples are always welcome.

Have any questions? Join the Slack channel to follow development and speak with the maintainers.

Examples

  • GoCV Receive: Example gocv-receive shows how to receive media using Pion and then do motion detection with GoCV.
  • Gstreamer Receive: Example gstreamer-receive shows how to receive media from the browser and play it live. This example uses GStreamer for rendering.
  • Gstreamer Send: Example gstreamer-send shows how to send video to your browser. This example uses GStreamer to process the video.
  • Gstreamer Send Offer: Example gstreamer-send-offer is a variant of gstreamer-send that initiates the WebRTC connection by sending an offer.
  • Janus Gateway: Example janus-gateway is a collection of examples showing how to use Pion WebRTC with janus-gateway.
  • SFU Websocket: The SFU example demonstrates a conference system that uses WebSocket for signaling. It also includes a flutter client for Android, iOS and Native.
  • Save to WebM: Example save-to-webm shows how to receive audio and video using Pion and then save to WebM container.
  • Twitch: Example twitch shows how to send audio/video from WebRTC to https://www.twitch.tv/ via RTMP.
  • C DataChannels Example c-data-channels shows how you can use Pion WebRTC from a C program
  • Snapshot Example snapshot shows how you can convert incoming video frames to jpeg and serve them via HTTP.
  • SIP to WebRTC Example sip-to-webrtc shows how to bridge WebRTC and SIP traffic.

Usage

We've made it easy to run the browser based examples on your local machine.

  1. Build and run the example server:

    go get github.com/pion/example-webrtc-applications
    cd $GOPATH/src/github.com/pion/example-webrtc-applications
    go run examples.go
  2. Browse to localhost to browse through the examples.

Note that you can change the port of the server using the --address flag.

Contributing

Check out the contributing wiki to join the group of amazing people making this project possible

License

MIT License - see LICENSE for full text

example-webrtc-applications's People

Contributors

adwpc avatar alexey-kravtsov avatar alfonsocv12 avatar antonito avatar at-wat avatar backkem avatar cameron-elliott avatar cgojin avatar cloudwebrtc avatar edaniels avatar hkirat avatar jamiegood avatar jinleileiking avatar kc5nra avatar lherman-cs avatar maxhawkins avatar mjmac avatar nicolai86 avatar oleglab avatar phvhoang avatar pionbot avatar renovate[bot] avatar rob-deutsch avatar sean-der avatar stevedenman avatar tarrencev avatar tmatth avatar trivigy avatar wdouglass avatar xsbchen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

example-webrtc-applications's Issues

sfu-ws/flutter/main.dart can't run on iOS

Your environment.

  • Version: d5f669a
  • iPhone6s, iOS14.4

What did you do?

Follow README and run.

What did you expect?

Run without crash.

What happened?

Crash

截圖 2021-06-04 上午11 21 28
截圖 2021-06-04 上午11 22 25

I think we can change that "null" to empty string, "", and the bug fixed

SFU - WS Multiple Rooms

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.

Passing VP9 to ffmpeg

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?

mDNS: failed to join multicast group goroutine 299

Your environment.

  • Version: Ubuntu 18 in WSL
  • Browser: Chrome 77.0.3865.90

What did you do?

-Run the server
-Go to browser and publish

Then in other PC via local network
-Go to browser and subscribe

What did you expect?

-The video and audio from the publisher

What happened?

-Nothing happen
-Error: mDNS: failed to join multicast group goroutine 299

janus-gateway/streaming fails on VP9

Your environment.

What did you do?

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.

What did you expect?

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)

What happened?

panic: codec payloader not set

goroutine 1 [running]:
main.main()

gocv-receive exits immediately with exit status 3221225781

Your environment.

  • Version: 1522408
  • OS: Windows 10 Pro 64bit 1903
  • go version go1.14.4 windows/amd64

What did you do?

go run ./gocv-receive

I even removed all code from main(), but nothing changed.

What did you expect?

should run

What happened?

immediately finished with single message

exit status 3221225781

What am I doing wrong?

Add example of WebRTC -> HLS

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)

Receive audio with ffmpeg

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)
}

sfu-ws crashed for sdp mismatch

Your environment.

  • Version: From promods:
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
  • Browser: Chrome 71.0.3578.98
  • Other Information - stacktraces, related issues, suggestions how to fix, links for us to have context

What did you do?

run sfu-ws example, click publish

What did you expect?

Do not crash

What happened?

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

gocv-receive build fails due to `// +build gocv`

Your environment.

  • Version: 1522408cc9583551e53c327cfd4492144080ad68
  • OS: Ubuntu (#836-Microsoft Mon May 05 16:04:00 PST 2020)
  • go version go1.14.2 linux/amd64

What did you do?

go get github.com/pion/example-webrtc-applications/gocv-receive

or even

go build -i ./gocv-receive/

What did you expect?

the build should succeed

What happened?

can't load package: package ./gocv-receive: build constraints exclude all Go files in $GOPATH/github.com/pion/example-webrtc-applications/gocv-receive

Workaround:

remove // +build gocv at the top of main.go, and build works. Am I missing something?

Payload negotiation problem in sfu-ws example with flutter.

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.

Your environment.

  • Version: pion/webrtc@b4bc479
  • Browser: Chrome 72.0.3626.121 (x64 / macOs 10.14.4)
    Flutter environment:
  • WebRTC framework: GoogleWebRTC-1.1.26791 iOS
  • Flutter version: (Channel dev, v1.4.1, on Mac OS X 10.14.4 18E226, locale zh-Hans-CN)
  • OS: iOS 12.1.2
  • Device: iPhone 8

What did you do?

1, Run sfu-ws
2. Start publish use Chrome.
pc.createOfferprovides 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

What did you expect?

Video should be available on iOS

What happened?

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 found a strange phenomenon

Your environment.

  • Version: v3
  • Browser: chmore

What did you do?

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。

Making a screen sharing example via Android

Summary

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.

Problem using sfu-ws example with h264 only

Hi! First of all, thank you for the great job implementing webrtc for go. And here is my issue.

Your environment.

  • Version: 79d29886d9dd508badb0610bf687ff2f78be25bf
  • Browser: Chromium Version 73.0.3683.75 (Official Build) Built on Ubuntu , running on Ubuntu 18.10 (64-bit)

What did you do?

  • clone latest pions/webrtc
  • install dependencies for sfu-ws
  • replace registering vp8 codec for h264
//m.RegisterCodec(webrtc.NewRTPVP8Codec(webrtc.DefaultPayloadTypeVP8, 90000))
m.RegisterCodec(webrtc.NewRTPH264Codec(webrtc.DefaultPayloadTypeH264, 90000))
m.RegisterCodec(webrtc.NewRTPOpusCodec(webrtc.DefaultPayloadTypeOpus, 48000))
  • run sfu-ws server
  • open sfu page in browser
  • publish stream
  • subscribe in new tab

What did you expect?

  • stream with video and audio after subscription

What happened?

  • stream with no video and audio
  • no errors in browser console
  • iceConnectionState is completed
  • chrome://webrtc-internals graphs shows that packets are recieving but no frames are decoded
  • "full buffer" error on server side after minute of streaming

Peer Connection Candidates are never Relay type

Your environment.

  • Version: v3
  • Browser: Chrome 91.0.4472.164

What did you do?

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>}"

What did you expect?

During Candidate Gathering to see Relay type candidates

What happened?

Only Host and SRFLX type Candidates are provided

SFU example always print "Closed by server!"

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!

Hardware Acceleration didn't work,it can't decode.

@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)

Got a problem with janus and ICE in janus-gateway example.

Where am I and what i'm doing now :

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>}

The problem with the example :

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.

Your environment:

  • Version: latest
  • Browser: no browser
  • Other Information - Go on windows, janus on VM in debian

What did you do?

just run the example and wait a minute

What did you expect?

a connection that lasts more than a minute

janus gateway video room example

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?

use v4l2h264enc or omxh264enc with gstreamer for Hardware Acceleration

Your environment.

  • Version: pion v3.0.13
  • Browser: firefox or chromium
  • Other Information - gstreamer 1.14, raspberry 4b

What did you do?

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

What did you expect?

webrtc app with pion

What happened?

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?

sfu-ws doesn't work with TURN

Your environment.

  • Version: v3.0.2
  • Browser: Firefox on macos, ubuntu and android
  • Other Information - Server and both clients were all on different networks
  • Turn Server - coturn

What did you do?

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.

What did you expect?

The video call to work using TURN

What happened?

"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!

Better way to handle Security using PEM & Key

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.

  1. Have a cmd to gen the PEM and Key
  2. Have a cert to inject it into the key store
  3. Then the examples can use that PEM and KEY.

this might help:
https://github.com/FiloSottile/mkcert

sfu-ws Chrome fails to generate local description with multiple peers

Your environment.

  • Version: d9ca384
  • Browser: chrome Version 88.0.4324.146 (Official Build) (x86_64)
  • Other Information-
    Seeing this on some tabs: 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!

What did you do?

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

What did you expect?

Each tab displays all the remote streams.

What happened?

Some tabs do not show all the remote streams. Any new tab over 3rd doesn't show remote streams at all.

Not contain package github.com/pion/example-webrtc-applications/play-from-disk-h264

Your environment.

  • Version: Release or SHA
  • Browser: include version
  • Other Information - stacktraces, related issues, suggestions how to fix, links for us to have context

What did you do?

go get github.com/pion/example-webrtc-applications/play-from-disk-h264

What did you expect?

Download play-from-disk-h264

What happened?

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

sfu-ws flutter on Android 10 would crash (Need update flutter_webrtc version)

Your environment.

  • Version: d5f669a
  • Android: Galaxy A20, Android 10.

What did you do?

Follow README and run.

What did you expect?

Run without crash

What happened?

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.
**

截圖 2021-06-04 上午11 28 11

After I change version from 0.5.7 to 0.6.4 , bug fixed.

gstreamer-send "go get" requesting webrtc/v2

Environment: Ubuntu 20.04 server (x64)
Golang: 1.13.8 linux/amd64

What did you do?

Followed instructions to 'get' gstream-send repository
$ go get github.com/pion/example-webrtc-applications/gstreamer-send

What did you expect?

A verification mentioning that the repository and its dependencies was fetched successfully.

What happened?

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.

Stream Webcam video to janus

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?

Can't build with new version of opencv

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.

Your environment.

  • Other Information - windows 10 with msys2

What did you expect?

  • How I can run this without Stream Error

Browser vs Pion and Ffmpeg stream

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!

What did you expect?

When the signal is bad, for bad frames to be dropped.

What happened?

I'm seeing garbled frames when the connection is bad, or just before it disconnects.

image

sfu-ws example with trickle ICE not able to send rtp out to browser

I tried to modify the given https://github.com/pion/example-webrtc-applications/tree/master/sfu-ws example to support trickleICE as below,

  1. Changes for trickle enable
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))
  1. Below WsConn Method is similar to Room with Trickle ICE support for a single pubReceiverC and subSenderC
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")
			}
		}
	}
}
  1. I have small JSON wrapper struct to handle JSON Message for SDP and ICE Messages as below, which is used in above function
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

  1. pubReceiverC ICE is connected and RTP packets are seen sent from browser and received at remoteTrack.Read(rtpBuf)
  2. subSenderC ICE is connected fine, Added with local tracks, is not sending any RTP, to browser

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

Trying to pass rtc media packet to ffmpeg

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)
}

sfu-ws - Safari Issue

Your environment.

  • OS: Ubuntu 18 with Nginx
  • Version: webrtc V3
  • Browser: Safari 13.1.2

What did you do?

Installed sfu-ws on a remote server.

What did you expect?

Basic cross-browser video conferencing

What happened?

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.

Twitch "Conversion failed!" with panic: write |1: broken pipe

Your environment.

  • Version: v3
  • Browser: Chrome or Firefox
  • Other Information
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

What did you do?

I ran the twitch sample by sending my SDP using EXPORT SDP=... and then echo $SDP | go run main.go

What did you expect?

I expect ffmpeg to keep converting the incoming RTP audio and video packets and pushing the converted audio/video to my RTMP endpoint.

What happened?

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.

Build of janus-gateway/* is failing

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)

Unable to build

Your environment.

  • Version: OS X 10.15.4
  • Browser: N/A
  • Other Information -
$ 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)

What did you do?

I ran go get github.com/pion/example-webrtc-applications/gstreamer-send

What did you expect?

I expected the demo to build and run.

What happened?

It failed with the error output above.

No video available with Janus streaming demo

Your environment.

What did you do?

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:

test_gstreamer_1

What did you expect?

VP8 video and Opus audio to be recorded.

What happened?

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.

sfu-ws remote

Summary

One paragraph explanation of the feature.

Motivation

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?

Describe alternatives you've considered

A clear and concise description of the alternative solutions you've considered.

Additional context

Add any other context or screenshots about the feature request here.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.