server-sdk-go icon indicating copy to clipboard operation
server-sdk-go copied to clipboard

Why my rtp video track published to livekit by server-sdk-go is not display on flutter

Open xiangxud opened this issue 3 years ago • 6 comments

I use server-sdk-go create room and publish rtp track ,some h264 video can display ,but some h264 rtp packets not display on flutter sdk, use my js code run on web is ok,how can i debug? some config i mistake ?

follow is livekit debug info,

"participant": "kvs:50:9a:4c:3c:2d:b5"

  • no video play(use my device rv1126 video capture h264,
  • but use kvs example h264 file transfer is ok) ,
  • audio all is ok,
  • on my web js code client all is ok,use same rtp forward

2022-07-06T07:34:52.905+0800	INFO	livekit	service/rtcservice.go:211	new client WS connected	{"room": "50:9a:4c:3c:2d:b5", "participant": "user", "connID": "user", "roomID": "RM_e6gBu37aP4iM"}
2022-07-06T07:34:52.908+0800	INFO	livekit	rtc/room.go:276	new participant joined	{"room": "50:9a:4c:3c:2d:b5", "roomID": "RM_e6gBu37aP4iM", "pID": "PA_5JQYKWzKnU8F", "participant": "user", "protocol": 7, "options": {"AutoSubscribe":true}}
2022-07-06T07:35:33.057+0800	INFO	livekit	service/rtcservice.go:211	new client WS connected	{"room": "50:9a:4c:3c:2d:b5", "participant": "kvs:50:9a:4c:3c:2d:b5", "connID": "kvs:50:9a:4c:3c:2d:b5", "roomID": "RM_e6gBu37aP4iM"}
2022-07-06T07:35:33.058+0800	INFO	livekit	rtc/room.go:276	new participant joined	{"room": "50:9a:4c:3c:2d:b5", "roomID": "RM_e6gBu37aP4iM", "pID": "PA_vE4HgC9pzeXV", "participant": "kvs:50:9a:4c:3c:2d:b5", "protocol": 7, "options": {"AutoSubscribe":true}}
2022-07-06T07:35:34.294+0800	INFO	livekit	rtc/participant.go:1151	mediaTrack published	{"room": "50:9a:4c:3c:2d:b5", "roomID": "RM_e6gBu37aP4iM", "participant": "kvs:50:9a:4c:3c:2d:b5", "pID": "PA_vE4HgC9pzeXV", "kind": "audio", "trackID": "TR_AMJuQZmPPHCxh7", "rid": "", "SSRC": 745830919}
2022-07-06T07:35:34.294+0800	INFO	livekit	buffer/buffer.go:187	REMB not supported, RTCP feedback will not be generated	{"room": "50:9a:4c:3c:2d:b5", "roomID": "RM_e6gBu37aP4iM", "participant": "kvs:50:9a:4c:3c:2d:b5", "pID": "PA_vE4HgC9pzeXV", "trackID": "TR_VCGKbmpLww8AWY", "mime": "video/h264", "layer": 2}
2022-07-06T07:35:34.295+0800	INFO	livekit	rtc/participant.go:1151	mediaTrack published	{"room": "50:9a:4c:3c:2d:b5", "roomID": "RM_e6gBu37aP4iM", "participant": "kvs:50:9a:4c:3c:2d:b5", "pID": "PA_vE4HgC9pzeXV", "kind": "video", "trackID": "TR_VCGKbmpLww8AWY", "rid": "", "SSRC": 560412114}

"participant": "obstest:50:9a:4c:3c:2d:b5" is obs rtmp covert to webrtc all is ok

2022-07-06T07:39:05.453+0800	INFO	livekit	service/rtcservice.go:211	new client WS connected	{"room": "50:9a:4c:3c:2d:b5", "participant": "obstest:50:9a:4c:3c:2d:b5", "connID": "obstest:50:9a:4c:3c:2d:b5", "roomID": "RM_e6gBu37aP4iM"}
2022-07-06T07:39:05.456+0800	INFO	livekit	rtc/room.go:276	new participant joined	{"room": "50:9a:4c:3c:2d:b5", "roomID": "RM_e6gBu37aP4iM", "pID": "PA_LiTqAuQrzHnr", "participant": "obstest:50:9a:4c:3c:2d:b5", "protocol": 7, "options": {"AutoSubscribe":true}}
2022-07-06T07:39:06.721+0800	INFO	livekit	buffer/buffer.go:187	REMB not supported, RTCP feedback will not be generated	{"room": "50:9a:4c:3c:2d:b5", "roomID": "RM_e6gBu37aP4iM", "participant": "obstest:50:9a:4c:3c:2d:b5", "pID": "PA_LiTqAuQrzHnr", "trackID": "TR_VCTnxmAftWjUpM", "mime": "video/h264", "layer": 2}
2022-07-06T07:39:06.722+0800	INFO	livekit	rtc/participant.go:1151	mediaTrack published	{"room": "50:9a:4c:3c:2d:b5", "roomID": "RM_e6gBu37aP4iM", "participant": "obstest:50:9a:4c:3c:2d:b5", "pID": "PA_LiTqAuQrzHnr", "kind": "audio", "trackID": "TR_AMgy7FXF2ctPap", "rid": "", "SSRC": 2974532577}
2022-07-06T07:39:06.722+0800	INFO	livekit	rtc/participant.go:1151	mediaTrack published	{"room": "50:9a:4c:3c:2d:b5", "roomID": "RM_e6gBu37aP4iM", "participant": "obstest:50:9a:4c:3c:2d:b5", "pID": "PA_LiTqAuQrzHnr", "kind": "video", "trackID": "TR_VCTnxmAftWjUpM", "rid": "", "SSRC": 882893420}

this is my published code:

	if t.VideoRTPTrack == nil {
		if strings.Contains(trackRemote.Codec().MimeType, "video") {
			videoRTPTrack, err := webrtc.NewTrackLocalStaticRTP(trackRemote.Codec().RTPCodecCapability, streamname+"-video", streamname)
			if err != nil {
				panic(err)
			}

			// r.RoomClient.MutePublishedTrack(r.Ctx,)
			// var local_video *lksdk.LocalTrackPublication
			if t.Videopub, err = t.RoomConnect.LocalParticipant.PublishTrack(videoRTPTrack, &lksdk.TrackPublicationOptions{Name: streamname + "-video"}); err != nil {
				log.Debug("Error publishing video RTP track->", err)
				return err
			}
			t.VideoRTPTrack = videoRTPTrack
			r.Localtracks[streamname] = t
			// r.Localtracks[streamname] = &LocalTrackPublication{p: local_video, Track: videoTrack, Trackname: streamname + "-video"}
			log.Debug("published video track -> ", streamname)
		}
	}
	if t.AudioRTPTrack == nil {
		if strings.Contains(trackRemote.Codec().MimeType, "audio") {
			audioRTPTrack, err := webrtc.NewTrackLocalStaticRTP(trackRemote.Codec().RTPCodecCapability, streamname+"-audio", streamname)
			//audioTrack, err := lksdk.NewLocalSampleTrack(webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeOpus})
			if err != nil {
				panic(err)
			}
			// var local_audio *lksdk.LocalTrackPublication

			if t.Audiopub, err = t.RoomConnect.LocalParticipant.PublishTrack(audioRTPTrack, &lksdk.TrackPublicationOptions{Name: streamname + "-audio"}); err != nil {
				log.Debug("Error publishing audio track", err)
				return err
			}
			t.AudioRTPTrack = audioRTPTrack
			r.Localtracks[streamname] = t
			log.Debug("published audio track -> ", streamname)
		}
	}

this is write rtp data:

func (r *Room) TrackSendRtpPackets(trackname, kind string, data []byte) (n int, err error) {
	if trackname == "" {
		log.Debug("Track name is null")
		return 0, fmt.Errorf("input trackname is null")
	}
	// var t *webrtc.TrackLocalStaticSample
	var t *webrtc.TrackLocalStaticRTP
	track := r.Localtracks[trackname]
	if track == nil {
		log.Debug("Track is nil ->", trackname, "<- no to publish")
		return 0, fmt.Errorf(" track is null,no to publish")
	}
	if kind == "video" {
		t = track.VideoRTPTrack
	} else if kind == "audio" {
		t = track.AudioRTPTrack
	}
	if t == nil {
		log.Debug("Track is nil ->", trackname, "<- no to publish")
		return 0, fmt.Errorf(" track is null,no to publish")
	}

	n, err = t.Write(data)
	return n, err

}

xiangxud avatar Jul 05 '22 15:07 xiangxud

which platform are you testing with for Flutter? It's probably due to the profile used for H.264. WebRTC spec only supports constrained baseline; While some browsers may render other profiles fine, mobile devices can be very limiting when it comes to decoding support.

Ensure your H.264 video is encoded like this

davidzhao avatar Jul 07 '22 06:07 davidzhao

thx,flutter for web edge ,i use h264 profile is 77 (main) not 66 baseline, let me try baseline

xiangxud avatar Jul 07 '22 06:07 xiangxud

always only audio play ,not video play,i set config my device h264 encode profile to baseline

time="2022-07-10T10:33:15+08:00" level=info msg="ICE state checking"
time="2022-07-10T10:33:15+08:00" level=info msg="ICE state connected"
------------------
10:33:15	DEBUG	current streamname:kvs
------------------
2022/07/10 10:33:15  "level"=0 "msg"="received offer for subscriber"
2022/07/10 10:33:15  "level"=0 "msg"="ICE connected"
10:33:15	DEBUG	track->kvs<-is nil ,Connect room&{0xc0003b8400 <nil> <nil> <nil> <nil> <nil> {<nil> <nil> <nil> <nil>} {<nil> <nil> <nil> <nil>} <nil> kvs} &{{true true true true ws://192.168.0.18:7880 192.168.0.18:5551 APINrg5cyLqPK3p yhmmq0BnW2kTTgGWvwdzwD7MhyEHO5RrDUpprGeBhxe 50:9a:4c:3c:2d:b5 50:9a:4c:3c:2d:b5   } context.Background.WithCancel 0xc0003e0510 sid:"RM_EQcVJuejETwV" name:"50:9a:4c:3c:2d:b5" empty_timeout:300 creation_time:1657364287 turn_password:"tHz76liFATUZQRGWyf3T8y5yAmuv0UaFDwhxYYBl3ZY" enabled_codecs:{mime:"audio/opus"} enabled_codecs:{mime:"video/VP8"} enabled_codecs:{mime:"video/H264"} num_participants:2 {9 0} {0 0} <nil> <nil> map[]}
2022/07/10 10:33:15  "level"=0 "msg"="published track" "name"="kvs-video" "source"="CAMERA"
10:33:15	DEBUG	[RTPTrackPublished]published video track -> kvs
time="2022-07-10T10:33:15+08:00" level=info msg="Got track video/H264, pt=125 tbn=90000, fmtp=level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f"
2022/07/10 10:33:15  "level"=0 "msg"="published track" "name"="kvs-audio" "source"="MICROPHONE"
time="2022-07-10T10:33:15+08:00" level=info msg="Got track audio/opus, pt=111 tbn=48000, channels=2"
10:33:15	DEBUG	[RTPTrackPublished]published audio track -> kvs
2022/07/10 10:33:15  "level"=0 "msg"="successfully set publisher answer"

xiangxud avatar Jul 09 '22 10:07 xiangxud

what do the client logs say? can you check chrome://webrtc-internals to see if the track exists?

davidzhao avatar Jul 12 '22 21:07 davidzhao

yes the track exists ,but not frame received ,the audio track is ok

xiangxud avatar Aug 11 '22 15:08 xiangxud

Unfortunately, we aren't able to reproduce this. Are you able to give us a small example that could reproduce this? Ideally with our flutter example app.

davidzhao avatar Aug 17 '22 01:08 davidzhao