|
|
|
@ -14,49 +14,43 @@ import (
@@ -14,49 +14,43 @@ import (
|
|
|
|
|
"github.com/stretchr/testify/require" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
func TestWebRTCServer(t *testing.T) { |
|
|
|
|
p, ok := newInstance("paths:\n" + |
|
|
|
|
" all:\n") |
|
|
|
|
require.Equal(t, true, ok) |
|
|
|
|
defer p.Close() |
|
|
|
|
|
|
|
|
|
medi := &media.Media{ |
|
|
|
|
Type: media.TypeVideo, |
|
|
|
|
Formats: []format.Format{&format.H264{ |
|
|
|
|
PayloadTyp: 96, |
|
|
|
|
PacketizationMode: 1, |
|
|
|
|
}}, |
|
|
|
|
type webRTCTestClient struct { |
|
|
|
|
wc *websocket.Conn |
|
|
|
|
pc *webrtc.PeerConnection |
|
|
|
|
track chan *webrtc.TrackRemote |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
v := gortsplib.TransportTCP |
|
|
|
|
source := gortsplib.Client{ |
|
|
|
|
Transport: &v, |
|
|
|
|
func newWebRTCTestClient(addr string) (*webRTCTestClient, error) { |
|
|
|
|
wc, _, err := websocket.DefaultDialer.Dial(addr, nil) //nolint:bodyclose
|
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
err := source.StartRecording("rtsp://localhost:8554/stream", media.Medias{medi}) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
defer source.Close() |
|
|
|
|
|
|
|
|
|
c, _, err := websocket.DefaultDialer.Dial("ws://localhost:8889/stream/ws", nil) //nolint:bodyclose
|
|
|
|
|
require.NoError(t, err) |
|
|
|
|
defer c.Close() |
|
|
|
|
|
|
|
|
|
_, msg, err := c.ReadMessage() |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
_, msg, err := wc.ReadMessage() |
|
|
|
|
if err != nil { |
|
|
|
|
wc.Close() |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var iceServers []webrtc.ICEServer |
|
|
|
|
err = json.Unmarshal(msg, &iceServers) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
if err != nil { |
|
|
|
|
wc.Close() |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pc, err := newPeerConnection(webrtc.Configuration{ |
|
|
|
|
ICEServers: iceServers, |
|
|
|
|
}) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
defer pc.Close() |
|
|
|
|
if err != nil { |
|
|
|
|
wc.Close() |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pc.OnICECandidate(func(i *webrtc.ICECandidate) { |
|
|
|
|
if i != nil { |
|
|
|
|
enc, _ := json.Marshal(i.ToJSON()) |
|
|
|
|
c.WriteMessage(websocket.TextMessage, enc) |
|
|
|
|
wc.WriteMessage(websocket.TextMessage, enc) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
@ -67,39 +61,71 @@ func TestWebRTCServer(t *testing.T) {
@@ -67,39 +61,71 @@ func TestWebRTCServer(t *testing.T) {
|
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
track := make(chan *webrtc.TrackRemote) |
|
|
|
|
track := make(chan *webrtc.TrackRemote, 1) |
|
|
|
|
pc.OnTrack(func(trak *webrtc.TrackRemote, recv *webrtc.RTPReceiver) { |
|
|
|
|
track <- trak |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
_, err = pc.AddTransceiverFromKind(webrtc.RTPCodecTypeVideo) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
if err != nil { |
|
|
|
|
wc.Close() |
|
|
|
|
pc.Close() |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
localOffer, err := pc.CreateOffer(nil) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
if err != nil { |
|
|
|
|
wc.Close() |
|
|
|
|
pc.Close() |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
enc, err := json.Marshal(localOffer) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
if err != nil { |
|
|
|
|
wc.Close() |
|
|
|
|
pc.Close() |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err = c.WriteMessage(websocket.TextMessage, enc) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
err = wc.WriteMessage(websocket.TextMessage, enc) |
|
|
|
|
if err != nil { |
|
|
|
|
wc.Close() |
|
|
|
|
pc.Close() |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err = pc.SetLocalDescription(localOffer) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
if err != nil { |
|
|
|
|
wc.Close() |
|
|
|
|
pc.Close() |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
_, msg, err = c.ReadMessage() |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
_, msg, err = wc.ReadMessage() |
|
|
|
|
if err != nil { |
|
|
|
|
wc.Close() |
|
|
|
|
pc.Close() |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var remoteOffer webrtc.SessionDescription |
|
|
|
|
err = json.Unmarshal(msg, &remoteOffer) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
if err != nil { |
|
|
|
|
wc.Close() |
|
|
|
|
pc.Close() |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err = pc.SetRemoteDescription(remoteOffer) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
if err != nil { |
|
|
|
|
wc.Close() |
|
|
|
|
pc.Close() |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
go func() { |
|
|
|
|
for { |
|
|
|
|
_, msg, err := c.ReadMessage() |
|
|
|
|
_, msg, err := wc.ReadMessage() |
|
|
|
|
if err != nil { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
@ -116,6 +142,44 @@ func TestWebRTCServer(t *testing.T) {
@@ -116,6 +142,44 @@ func TestWebRTCServer(t *testing.T) {
|
|
|
|
|
|
|
|
|
|
<-connected |
|
|
|
|
|
|
|
|
|
return &webRTCTestClient{ |
|
|
|
|
wc: wc, |
|
|
|
|
pc: pc, |
|
|
|
|
track: track, |
|
|
|
|
}, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (c *webRTCTestClient) close() { |
|
|
|
|
c.pc.Close() |
|
|
|
|
c.wc.Close() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestWebRTCServer(t *testing.T) { |
|
|
|
|
p, ok := newInstance("paths:\n" + |
|
|
|
|
" all:\n") |
|
|
|
|
require.Equal(t, true, ok) |
|
|
|
|
defer p.Close() |
|
|
|
|
|
|
|
|
|
medi := &media.Media{ |
|
|
|
|
Type: media.TypeVideo, |
|
|
|
|
Formats: []format.Format{&format.H264{ |
|
|
|
|
PayloadTyp: 96, |
|
|
|
|
PacketizationMode: 1, |
|
|
|
|
}}, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
v := gortsplib.TransportTCP |
|
|
|
|
source := gortsplib.Client{ |
|
|
|
|
Transport: &v, |
|
|
|
|
} |
|
|
|
|
err := source.StartRecording("rtsp://localhost:8554/stream", media.Medias{medi}) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
defer source.Close() |
|
|
|
|
|
|
|
|
|
c, err := newWebRTCTestClient("ws://localhost:8889/stream/ws") |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
defer c.close() |
|
|
|
|
|
|
|
|
|
time.Sleep(500 * time.Millisecond) |
|
|
|
|
|
|
|
|
|
source.WritePacketRTP(medi, &rtp.Packet{ |
|
|
|
@ -130,7 +194,7 @@ func TestWebRTCServer(t *testing.T) {
@@ -130,7 +194,7 @@ func TestWebRTCServer(t *testing.T) {
|
|
|
|
|
Payload: []byte{0x01, 0x02, 0x03, 0x04}, |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
trak := <-track |
|
|
|
|
trak := <-c.track |
|
|
|
|
|
|
|
|
|
pkt, _, err := trak.ReadRTP() |
|
|
|
|
require.NoError(t, err) |
|
|
|
|