diff --git a/client.go b/client.go index 8449fd8..d0b89de 100644 --- a/client.go +++ b/client.go @@ -7,6 +7,8 @@ import ( "encoding/binary" "errors" "fmt" + . "github.com/Monibuca/engine/v2" + . "github.com/Monibuca/plugin-rtp" "io" "net" "net/url" @@ -14,13 +16,11 @@ import ( "strconv" "strings" "time" - - . "github.com/Monibuca/engine/v2" ) // PullStream 从外部拉流 func (rtsp *RTSP) PullStream(streamPath string, rtspUrl string) (err error) { - if result := rtsp.Publisher.Publish(streamPath); result { + if result := rtsp.Publish(streamPath); result { rtsp.Stream.Type = "RTSP" rtsp.RTSPInfo.StreamInfo = &rtsp.Stream.StreamInfo rtsp.TransType = TRANS_TYPE_TCP @@ -192,8 +192,8 @@ func (client *RTSP) requestStream() (err error) { if videoInfo, ok := client.SDPMap["video"]; ok { client.VControl = videoInfo.Control client.VCodec = videoInfo.Codec - client.SPS = videoInfo.SpropParameterSets[0] - client.PPS = videoInfo.SpropParameterSets[1] + client.WriteSPS(videoInfo.SpropParameterSets[0]) + client.WritePPS(videoInfo.SpropParameterSets[1]) var _url = "" if strings.Index(strings.ToLower(client.VControl), "rtsp://") == 0 { _url = client.VControl @@ -229,7 +229,7 @@ func (client *RTSP) requestStream() (err error) { if audioInfo, ok := client.SDPMap["audio"]; ok { client.AControl = audioInfo.Control client.ACodec = audioInfo.Codec - client.AudioSpecificConfig = audioInfo.Config + client.WriteASC(audioInfo.Config) var _url = "" if strings.Index(strings.ToLower(client.AControl), "rtsp://") == 0 { _url = client.AControl @@ -349,7 +349,7 @@ func (client *RTSP) startStream() { //} client.InBytes += int(length + 4) - client.HandleRTP(pack) + client.PushPack(pack) default: // rtsp builder := bytes.Buffer{} diff --git a/go.mod b/go.mod index 74b11a6..8ee1f80 100644 --- a/go.mod +++ b/go.mod @@ -3,14 +3,8 @@ module github.com/Monibuca/plugin-rtsp go 1.13 require ( - github.com/Monibuca/engine/v2 v2.0.1 - github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee // indirect - github.com/gobwas/pool v0.2.0 // indirect - github.com/gobwas/ws v1.0.3 // indirect - github.com/jinzhu/gorm v1.9.12 // indirect - github.com/pion/rtcp v1.2.2 // indirect - github.com/pion/rtp v1.5.4 - github.com/pixelbender/go-sdp v1.0.0 // indirect - github.com/reactivex/rxgo v1.0.0 // indirect + github.com/Monibuca/engine/v2 v2.1.0 + github.com/Monibuca/plugin-rtp v0.0.0-20200531014802-504413c0dfcb + github.com/pion/rtp v1.5.4 // indirect github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf ) diff --git a/go.sum b/go.sum index 43f05b0..9fdaced 100644 --- a/go.sum +++ b/go.sum @@ -1,69 +1,31 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/EasyDarwin/EasyDarwin v8.1.0+incompatible h1:Rr8dRbZtcJhiJvGx5Vs7IENM6RUUwGkZiIj5+WrNhm8= -github.com/EasyDarwin/EasyDarwin v8.1.0+incompatible/go.mod h1:xnmC+Q2+wugEDpQGxivSFNYPOhmNlIQHBfl0hMeriSU= -github.com/Monibuca/engine v1.2.1 h1:TJmC6eZA1lR1MScWgempZLiEZD4T6aY/nn/rlQ9UdK8= -github.com/Monibuca/engine v1.2.1/go.mod h1:WbDkXENLjcPjyjCR1Mix1GA+uAlwORkv/+8aMVrDX2g= -github.com/Monibuca/engine v1.2.2 h1:hNjsrZpOmui8lYhgCJ5ltJU8g/k0Rrdysx2tHNGGnbI= -github.com/Monibuca/engine/v2 v2.0.0 h1:8FjaScrtN8QdbcxO9zZYABMC0Re3I1O1T4p94zAXYb0= -github.com/Monibuca/engine/v2 v2.0.0/go.mod h1:34EYjjV15G6myuHOKaJkO7y5tJ1Arq/NfC9Weacr2mc= -github.com/Monibuca/engine/v2 v2.0.1 h1:z27YwXVSelYgGfbrx5RmJ+ROveIf5QWGnwZqfOdqhM0= -github.com/Monibuca/engine/v2 v2.0.1/go.mod h1:34EYjjV15G6myuHOKaJkO7y5tJ1Arq/NfC9Weacr2mc= +github.com/Monibuca/engine/v2 v2.1.0 h1:pHeDCEFDusKFsZLpconYj8U5LCaWApnjd+yQRHYgQsQ= +github.com/Monibuca/engine/v2 v2.1.0/go.mod h1:34EYjjV15G6myuHOKaJkO7y5tJ1Arq/NfC9Weacr2mc= +github.com/Monibuca/plugin-rtp v0.0.0-20200531014802-504413c0dfcb h1:CnmoQ8XsWxs/6mulbQfTGUa8cPr6c/3bkkTsNozRBwE= +github.com/Monibuca/plugin-rtp v0.0.0-20200531014802-504413c0dfcb/go.mod h1:8HxBilkF835Lepe/DLUCjaw1mRiu3MxTDsG7g9UcfZA= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM= -github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= -github.com/falconray0704/gortmp v0.0.0-20170613085150-e3f9bb02c7c8 h1:Bkx+0neYCcHW7BUeVCbR2GOn47NesdImh8nHHOKccD4= -github.com/falconray0704/gortmp v0.0.0-20170613085150-e3f9bb02c7c8/go.mod h1:/JBZajtCDe9Z4j84v5QWo4PLn1K6jcBHh6qXN/bm/vw= github.com/funny/slab v0.0.0-20180511031532-b1fad5e5d478 h1:Db9StoJ6RZN3YttC0Pm0I4Y5izITRYch3RMbT59BYN0= github.com/funny/slab v0.0.0-20180511031532-b1fad5e5d478/go.mod h1:0j1+svBH8ABEIPdUP0AIg4qedsybnXGJBakCEw8cfoo= github.com/funny/utest v0.0.0-20161029064919-43870a374500 h1:Z0r1CZnoIWFB/Uiwh1BU5FYmuFe6L5NPi6XWQEmsTRg= github.com/funny/utest v0.0.0-20161029064919-43870a374500/go.mod h1:mUn39tBov9jKnTWV1RlOYoNzxdBFHiSzXWdY1FoNGGg= github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= -github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.3 h1:ZOigqf7iBxkA4jdQ3am7ATzdlOFp9YzA6NmuvEEZc9g= -github.com/gobwas/ws v1.0.3/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/jinzhu/gorm v1.9.12 h1:Drgk1clyWT9t9ERbzHza6Mj/8FY/CqMyVzOiHviMo6Q= -github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M= -github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381 h1:bqDmpDG49ZRnB5PcgP0RXtQvnMSgIF14M7CBd2shtXs= github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-sqlite3 v2.0.1+incompatible h1:xQ15muvnzGBHpIpdrNi1DA5x0+TcBZzsIDwmw9uTHzw= -github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/pion/rtcp v1.2.2 h1:q0aGpfC8ahggd4ASrLudlecf99BUOGKk8IUrQvHY42Y= -github.com/pion/rtcp v1.2.2/go.mod h1:zGhIv0RPRF0Z1Wiij22pUt5W/c9fevqSzT4jje/oK7I= github.com/pion/rtp v1.5.4 h1:PuNg6xqV3brIUihatcKZj1YDUs+M45L0ZbrZWYtkDxY= github.com/pion/rtp v1.5.4/go.mod h1:bg60AL5GotNOlYZsqycbhDtEV3TkfbpXG0KBiUq29Mg= -github.com/pixelbender/go-sdp v1.0.0 h1:hLP2ALBN4sLpgp2r3EDcFUSN3AyOkg1jonuWEJniotY= -github.com/pixelbender/go-sdp v1.0.0/go.mod h1:6IBlz9+BrUHoFTea7gcp4S54khtOhjCW/nVDLhmZBAs= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/reactivex/rxgo v1.0.0 h1:qpT8/kVwAJDSeGsqx4oUXxgk3UCtAq/EreBGWYRxEcA= -github.com/reactivex/rxgo v1.0.0/go.mod h1:/S1ygE20oE1BvZGIwd3fXx/m6s6pOX5G6zmXg9ninlQ= github.com/shirou/gopsutil v2.20.1+incompatible h1:oIq9Cq4i84Hk8uQAUOG3eNdI/29hBawGrD5YRl6JRDY= github.com/shirou/gopsutil v2.20.1+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= @@ -72,22 +34,9 @@ github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf h1:Z2X3Os7oRzpdJ75iPqWZc0HeJWFYNCvKsfpQwFpRNTA= github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= -github.com/zhangpeihao/goamf v0.0.0-20140409082417-3ff2c19514a8/go.mod h1:RZd/IqzNpFANwOB9rVmsnAYpo/6KesK4PqrN1a5cRgg= -github.com/zhangpeihao/log v0.0.0-20170117094621-62e921e41859/go.mod h1:OAvmouyIV28taMw4SC4+hSnouObQqQkTQNOhU3Zowl0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd h1:GGJVjV8waZKRHrgwvtH66z9ZGVurTD1MT0n1Bb+q4aM= -golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= diff --git a/main.go b/main.go index 4fd0c8d..ab50dfc 100644 --- a/main.go +++ b/main.go @@ -2,7 +2,6 @@ package rtsp import ( "bufio" - "bytes" "fmt" "log" "net" @@ -12,12 +11,12 @@ import ( "time" . "github.com/Monibuca/engine/v2" - . "github.com/Monibuca/engine/v2/avformat" "github.com/Monibuca/engine/v2/util" + . "github.com/Monibuca/plugin-rtp" "github.com/teris-io/shortid" ) -var collection = sync.Map{} +var collection sync.Map var config = struct { ListenAddr string AutoPull bool @@ -118,7 +117,7 @@ func ListenRtsp(addr string) error { } type RTSP struct { - Publisher + RTP RTSPInfo RTSPClientInfo ID string @@ -135,22 +134,16 @@ type RTSP struct { VControl string ACodec string VCodec string - avcsent bool aacsent bool Timeout int - // stats info - fuBuffer []byte //tcp channels - aRTPChannel int - aRTPControlChannel int - vRTPChannel int - vRTPControlChannel int - UDPServer *UDPServer - UDPClient *UDPClient - SPS []byte - PPS []byte - AudioSpecificConfig []byte - Auth func(string) string + aRTPChannel int + aRTPControlChannel int + vRTPChannel int + vRTPControlChannel int + UDPServer *UDPServer + UDPClient *UDPClient + Auth func(string) string } type RTSPClientInfo struct { Agent string @@ -159,12 +152,10 @@ type RTSPClientInfo struct { Seq int } type RTSPInfo struct { - URL string - SyncCount int64 - SDPRaw string - InBytes int - OutBytes int - + URL string + SDPRaw string + InBytes int + OutBytes int StreamInfo *StreamInfo } @@ -192,114 +183,3 @@ func (conn *RichConn) Write(b []byte) (n int, err error) { } return conn.Conn.Write(b) } -func (rtsp *RTSP) handleNALU(nalType byte, payload []byte, ts uint32) { - rtsp.SyncCount++ - vl := len(payload) - switch nalType { - case NALU_SPS: - rtsp.SPS = append([]byte{}, payload...) - case NALU_PPS: - rtsp.PPS = append([]byte{}, payload...) - case NALU_Access_Unit_Delimiter: - - case NALU_IDR_Picture: - if !rtsp.avcsent { - if rtsp.SPS == nil || rtsp.PPS == nil { - break - } - r := bytes.NewBuffer([]byte{}) - r.Write(RTMP_AVC_HEAD) - spsHead := []byte{0xE1, 0, 0} - util.BigEndian.PutUint16(spsHead[1:], uint16(len(rtsp.SPS))) - r.Write(spsHead) - r.Write(rtsp.SPS) - ppsHead := []byte{0x01, 0, 0} - util.BigEndian.PutUint16(ppsHead[1:], uint16(len(rtsp.PPS))) - r.Write(ppsHead) - r.Write(rtsp.PPS) - rtsp.PushVideo(0, r.Bytes()) - rtsp.avcsent = true - } - r := rtsp.GetBuffer() - iframeHead := []byte{0x17, 0x01, 0, 0, 0} - util.BigEndian.PutUint24(iframeHead[2:], 0) - r.Write(iframeHead) - nalLength := []byte{0, 0, 0, 0} - util.BigEndian.PutUint32(nalLength, uint32(vl)) - r.Write(nalLength) - r.Write(payload) - rtsp.PushVideo(ts, r.Bytes()) - case NALU_Non_IDR_Picture: - if rtsp.avcsent { - r := rtsp.GetBuffer() - pframeHead := []byte{0x27, 0x01, 0, 0, 0} - util.BigEndian.PutUint24(pframeHead[2:], 0) - r.Write(pframeHead) - nalLength := []byte{0, 0, 0, 0} - util.BigEndian.PutUint32(nalLength, uint32(vl)) - r.Write(nalLength) - r.Write(payload) - rtsp.PushVideo(ts, r.Bytes()) - } - default: - Println(nalType) - } - -} -func (rtsp *RTSP) HandleRTP(pack *RTPPack) { - switch pack.Type { - case RTP_TYPE_AUDIO: - if !rtsp.aacsent { - rtsp.PushAudio(0, append([]byte{0xAF, 0x00}, rtsp.AudioSpecificConfig...)) - rtsp.aacsent = true - } - payload := pack.Payload - auHeaderLen := (int16(payload[0]) << 8) + int16(payload[1]) - auHeaderLen = auHeaderLen >> 3 - auHeaderCount := int(auHeaderLen / 2) - var auLenArray []int - for iIndex := 0; iIndex < int(auHeaderCount); iIndex++ { - auHeaderInfo := (int16(payload[2+2*iIndex]) << 8) + int16(payload[2+2*iIndex+1]) - auLen := auHeaderInfo >> 3 - auLenArray = append(auLenArray, int(auLen)) - } - startOffset := 2 + 2*auHeaderCount - for _, auLen := range auLenArray { - endOffset := startOffset + auLen - addHead := []byte{0xAF, 0x01} - rtsp.PushAudio(0, append(addHead, payload[startOffset:endOffset]...)) - startOffset = startOffset + auLen - } - case RTP_TYPE_VIDEO: - ts := pack.Timestamp - data := pack.Payload - Println(len(data)) - nalType := data[0] & 0x1F - if nalType >= 1 && nalType <= 23 { - rtsp.handleNALU(nalType, data, ts) - } else if nalType == 28 { //FU-A - isStart := data[1]&0x80 != 0 - isEnd := data[1]&0x40 != 0 - nalType := data[1] & 0x1F - //nri := (data[1]&0x60)>>5 - nal := data[0]&0xE0 | data[1]&0x1F - if isStart { - rtsp.fuBuffer = []byte{0} - } - rtsp.fuBuffer = append(rtsp.fuBuffer, data[2:]...) - if isEnd { - rtsp.fuBuffer[0] = nal - rtsp.handleNALU(nalType, rtsp.fuBuffer, ts) - } - } else if nalType == 24 { //STAP-A - var naluLen uint16 - for data = data[1:]; len(data) > 3; data = data[naluLen+2:] { - naluLen = (uint16(data[0]) << 8) + uint16(data[1]) - nalType = data[2] & 0x1F - rtsp.handleNALU(nalType, data[3:naluLen+2], ts) - } - } else { - Println("not support yet ", nalType) - } - } -} diff --git a/session.go b/session.go index aab552e..8c488d6 100644 --- a/session.go +++ b/session.go @@ -13,15 +13,10 @@ import ( "time" . "github.com/Monibuca/engine/v2" - "github.com/pion/rtp" + . "github.com/Monibuca/plugin-rtp" "github.com/teris-io/shortid" ) -type RTPPack struct { - Type RTPType - rtp.Packet -} - type SessionType int const ( @@ -39,29 +34,6 @@ func (st SessionType) String() string { return "unknow" } -type RTPType int - -const ( - RTP_TYPE_AUDIO RTPType = iota - RTP_TYPE_VIDEO - RTP_TYPE_AUDIOCONTROL - RTP_TYPE_VIDEOCONTROL -) - -func (rt RTPType) String() string { - switch rt { - case RTP_TYPE_AUDIO: - return "audio" - case RTP_TYPE_VIDEO: - return "video" - case RTP_TYPE_AUDIOCONTROL: - return "audio control" - case RTP_TYPE_VIDEOCONTROL: - return "video control" - } - return "unknow" -} - type TransType int const ( @@ -163,7 +135,7 @@ func (session *RTSP) AcceptPush() { continue } session.InBytes += rtpLen + 4 - session.HandleRTP(pack) + session.PushPack(pack) } else { // rtsp cmd reqBuf := bytes.NewBuffer(nil) reqBuf.WriteByte(buf1) @@ -349,17 +321,17 @@ func (session *RTSP) handleRequest(req *Request) { if ok { session.AControl = sdp.Control session.ACodec = sdp.Codec - session.AudioSpecificConfig = sdp.Config + session.WriteASC(sdp.Config) Printf("audio codec[%s]\n", session.ACodec) } if sdp, ok = session.SDPMap["video"]; ok { session.VControl = sdp.Control session.VCodec = sdp.Codec - session.SPS = sdp.SpropParameterSets[0] - session.PPS = sdp.SpropParameterSets[1] + session.WriteSPS(sdp.SpropParameterSets[0]) + session.WritePPS(sdp.SpropParameterSets[1]) Printf("video codec[%s]\n", session.VCodec) } - if session.Publisher.Publish(streamPath) { + if session.Publish(streamPath) { session.Stream.Type = "RTSP" session.RTSPInfo.StreamInfo = &session.Stream.StreamInfo collection.Store(streamPath, session) diff --git a/udp-client.go b/udp-client.go index 79d11db..693d298 100644 --- a/udp-client.go +++ b/udp-client.go @@ -2,10 +2,10 @@ package rtsp import ( "fmt" + . "github.com/Monibuca/engine/v2" + . "github.com/Monibuca/plugin-rtp" "net" "strings" - - . "github.com/Monibuca/engine/v2" ) type UDPClient struct { diff --git a/udp-server.go b/udp-server.go index 701de62..3f7866a 100644 --- a/udp-server.go +++ b/udp-server.go @@ -2,13 +2,13 @@ package rtsp import ( "fmt" + . "github.com/Monibuca/engine/v2" + . "github.com/Monibuca/plugin-rtp" "net" "strconv" "strings" "sync" "time" - - . "github.com/Monibuca/engine/v2" ) type UDPServer struct { @@ -29,7 +29,7 @@ func (s *UDPServer) HandleRTP(pack *RTPPack) { s.Lock() defer s.Unlock() if s.Session != nil { - s.Session.HandleRTP(pack) + s.Session.PushPack(pack) } }