diff --git a/.gitignore b/.gitignore
new file mode 100755
index 0000000..9f11b75
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.idea/
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 86f9578..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 94a25f7..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vdk.iml b/.idea/vdk.iml
deleted file mode 100644
index 5e764c4..0000000
--- a/.idea/vdk.iml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml
deleted file mode 100644
index 27aa2e8..0000000
--- a/.idea/watcherTasks.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
deleted file mode 100644
index 68bd5f2..0000000
--- a/.idea/workspace.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/format/webrtc/adapter.go b/format/webrtc/adapter.go
index 4834bd8..43568cc 100644
--- a/format/webrtc/adapter.go
+++ b/format/webrtc/adapter.go
@@ -4,11 +4,12 @@ import (
"encoding/base64"
"errors"
"fmt"
+ "math/rand"
+
"github.com/deepch/vdk/av"
"github.com/deepch/vdk/codec/h264parser"
"github.com/pion/webrtc/v3"
"github.com/pion/webrtc/v3/pkg/media"
- "math/rand"
)
type Muxer struct {
@@ -18,24 +19,26 @@ type Stream struct {
codec av.CodecData
track *webrtc.Track
}
+
func NewMuxer() *Muxer {
return &Muxer{streams: make(map[int8]*Stream)}
}
+
func (self *Muxer) WriteHeader(streams []av.CodecData, sdp64 string) (string, error) {
if len(streams) == 0 {
- return "",errors.New("No Stream Forund")
+ return "", errors.New("No Stream Forund")
}
mediaEngine := webrtc.MediaEngine{}
sdpB, err := base64.StdEncoding.DecodeString(sdp64)
if err != nil {
- return "",err
+ return "", err
}
offer := webrtc.SessionDescription{
Type: webrtc.SDPTypeOffer,
SDP: string(sdpB),
}
if err = mediaEngine.PopulateFromSDP(offer); err != nil {
- return "",err
+ return "", err
}
api := webrtc.NewAPI(webrtc.WithMediaEngine(mediaEngine))
peerConnection, err := api.NewPeerConnection(webrtc.Configuration{
@@ -46,19 +49,19 @@ func (self *Muxer) WriteHeader(streams []av.CodecData, sdp64 string) (string, er
},
})
if err != nil {
- return "",err
+ return "", err
}
for i, i2 := range streams {
var track *webrtc.Track
if i2.Type().IsVideo() {
track, err = peerConnection.NewTrack(getPayloadType(mediaEngine, webrtc.RTPCodecTypeVideo, i2.Type().String()), rand.Uint32(), "video", "pion")
if err != nil {
- return "",err
+ return "", err
}
} else if i2.Type().IsAudio() {
track, err = peerConnection.NewTrack(getPayloadType(mediaEngine, webrtc.RTPCodecTypeAudio, i2.Type().String()), rand.Uint32(), "audio", "pion")
if err != nil {
- return "",err
+ return "", err
}
}
_, err = peerConnection.AddTransceiverFromTrack(track,
@@ -69,35 +72,35 @@ func (self *Muxer) WriteHeader(streams []av.CodecData, sdp64 string) (string, er
if err != nil {
return "", err
}
- _, err = peerConnection.AddTrack(track);
+ _, err = peerConnection.AddTrack(track)
if err != nil {
- return "",err
+ return "", err
}
- self.streams[int8(i)] = &Stream{track: track , codec: i2}
+ self.streams[int8(i)] = &Stream{track: track, codec: i2}
}
//iceConnectedCtx, iceConnectedCtxCancel := context.WithCancel(context.Background())
peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) {
fmt.Printf("Connection State has changed %s \n", connectionState.String())
if connectionState == webrtc.ICEConnectionStateConnected {
- // iceConnectedCtxCancel()
+ // iceConnectedCtxCancel()
}
})
if err = peerConnection.SetRemoteDescription(offer); err != nil {
- return "",err
+ return "", err
}
answer, err := peerConnection.CreateAnswer(nil)
if err != nil {
- return "",err
+ return "", err
}
//gatherComplete := webrtc.GatheringCompletePromise(peerConnection)
if err = peerConnection.SetLocalDescription(answer); err != nil {
- return "",err
+ return "", err
}
//<-gatherComplete
-
- return base64.StdEncoding.EncodeToString([]byte(answer.SDP)), nil
+ return base64.StdEncoding.EncodeToString([]byte(answer.SDP)), nil
}
+
func (self *Muxer) WritePacket(pkt av.Packet) (err error) {
if tmp, ok := self.streams[pkt.Idx]; ok {
switch tmp.codec.Type() {
@@ -116,6 +119,7 @@ func (self *Muxer) WritePacket(pkt av.Packet) (err error) {
}
return errors.New("Media Track Not Found")
}
+
func getPayloadType(m webrtc.MediaEngine, codecType webrtc.RTPCodecType, codecName string) uint8 {
for _, codec := range m.GetCodecsByKind(codecType) {
if codec.Name == codecName {
@@ -124,96 +128,3 @@ func getPayloadType(m webrtc.MediaEngine, codecType webrtc.RTPCodecType, codecNa
}
panic(fmt.Sprintf("Remote peer does not support %s", codecName))
}
-
-/*
-//MuxerRTC muxer
-type MuxerRTC struct {
- Peer *webrtc.PeerConnection
- Muxer string
- Track []*webrtc.Track
-}
-
-//NewWebRT adapter
-func NewWebRT() *MuxerRTC {
- peerConnection, err := webrtc.NewPeerConnection(webrtc.Configuration{
- ICEServers: []webrtc.ICEServer{
- {
- URLs: []string{"stun:stun.l.google.com:19302"},
- },
- },
- })
- if err != nil {
- panic(err)
- }
- log.Println(peerConnection)
- return &MuxerRTC{Peer: peerConnection}
-}
-
-//AddTrackVideo video
-func (element *MuxerRTC) AddTrackVideo() error {
- Track, err := element.Peer.NewTrack(webrtc.DefaultPayloadTypeH264, rand.Uint32(), "video", "video")
- if err != nil {
- return err
- }
- _, err = element.Peer.AddTrack(Track)
- if err != nil {
- return err
- }
- element.Track = append(element.Track, Track)
- return nil
-}
-
-//AddTrackAudio audio
-func (element *MuxerRTC) AddTrackAudio() error {
- Track, err := element.Peer.NewTrack(webrtc.DefaultPayloadTypePCMA, rand.Uint32(), "audio", "audio")
- if err != nil {
- return err
- }
- _, err = element.Peer.AddTrack(Track)
- if err != nil {
- return err
- }
- _, err = element.Peer.AddTransceiverFromTrack(Track, webrtc.RtpTransceiverInit{Direction: webrtc.RTPTransceiverDirectionSendonly})
- if err != nil {
- return err
- }
- element.Track = append(element.Track, Track)
- return nil
-}
-
-//CreateAnswer func
-func (element *MuxerRTC) CreateAnswer(data string) ([]byte, error) {
- // log.Println(string(data))
-
- // sd, err := base64.StdEncoding.DecodeString(data)
- // if err != nil {
- // log.Println("DecodeString", err)
- // return nil, err
- // }
- offer := webrtc.SessionDescription{
- Type: webrtc.SDPTypeOffer,
- SDP: data,
- }
- if err := element.Peer.SetRemoteDescription(offer); err != nil {
- log.Println("SetRemoteDescription", err)
-
- return nil, err
- }
- answer, err := element.Peer.CreateAnswer(nil)
- if err != nil {
- log.Println("CreateAnswer", err)
-
- return nil, err
- }
- return []byte(answer.SDP), nil
-}
-
-//WritePacket to stream
-func (element *MuxerRTC) WritePacket(id int, data []byte, smaple uint32) error {
- err := element.Track[id].WriteSample(media.Sample{Data: data, Samples: smaple})
- return err
-}
-func (element *MuxerRTC) Close() {
- return
-}
-*/