mirror of
https://github.com/bluenviron/mediamtx.git
synced 2025-12-25 12:32:01 -08:00
support RTCP streaming via TCP
This commit is contained in:
parent
b77ae3a947
commit
dab15e898d
3 changed files with 21 additions and 11 deletions
2
main.go
2
main.go
|
|
@ -117,7 +117,7 @@ func main() {
|
|||
|
||||
p, err := newProgram(*rtspPort, *rtpPort, *rtcpPort)
|
||||
if err != nil {
|
||||
log.Fatal("ERR:", err)
|
||||
log.Fatal("ERR: ", err)
|
||||
}
|
||||
|
||||
p.run()
|
||||
|
|
|
|||
14
rtsp/conn.go
14
rtsp/conn.go
|
|
@ -43,33 +43,33 @@ func (c *Conn) WriteResponse(res *Response) error {
|
|||
return responseEncode(c.c, res)
|
||||
}
|
||||
|
||||
func (c *Conn) ReadInterleavedFrame(frame []byte) (int, error) {
|
||||
func (c *Conn) ReadInterleavedFrame(frame []byte) (int, int, error) {
|
||||
var header [4]byte
|
||||
_, err := io.ReadFull(c.c, header[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
return 0, 0, err
|
||||
}
|
||||
|
||||
// connection terminated
|
||||
if header[0] == 0x54 {
|
||||
return 0, io.EOF
|
||||
return 0, 0, io.EOF
|
||||
}
|
||||
|
||||
if header[0] != 0x24 {
|
||||
return 0, fmt.Errorf("wrong magic byte (0x%.2x)", header[0])
|
||||
return 0, 0, fmt.Errorf("wrong magic byte (0x%.2x)", header[0])
|
||||
}
|
||||
|
||||
framelen := binary.BigEndian.Uint16(header[2:])
|
||||
if framelen > 2048 {
|
||||
return 0, fmt.Errorf("frame length greater than 2048")
|
||||
return 0, 0, fmt.Errorf("frame length greater than 2048")
|
||||
}
|
||||
|
||||
_, err = io.ReadFull(c.c, frame[:framelen])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
return 0, 0, err
|
||||
}
|
||||
|
||||
return int(framelen), nil
|
||||
return int(header[1]), int(framelen), nil
|
||||
}
|
||||
|
||||
func (c *Conn) WriteInterleavedFrame(frame []byte) error {
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ func (c *rtspClient) run() {
|
|||
if c.rtpProto == "tcp" {
|
||||
buf := make([]byte, 2048)
|
||||
for {
|
||||
_, err := c.rconn.ReadInterleavedFrame(buf)
|
||||
_, _, err := c.rconn.ReadInterleavedFrame(buf)
|
||||
if err != nil {
|
||||
if err != io.EOF {
|
||||
c.log("ERR: %s", err)
|
||||
|
|
@ -161,7 +161,7 @@ func (c *rtspClient) run() {
|
|||
if c.rtpProto == "tcp" {
|
||||
buf := make([]byte, 2048)
|
||||
for {
|
||||
n, err := c.rconn.ReadInterleavedFrame(buf)
|
||||
channel, n, err := c.rconn.ReadInterleavedFrame(buf)
|
||||
if err != nil {
|
||||
if err != io.EOF {
|
||||
c.log("ERR: %s", err)
|
||||
|
|
@ -169,7 +169,17 @@ func (c *rtspClient) run() {
|
|||
return
|
||||
}
|
||||
|
||||
c.p.handleRtp(buf[:n])
|
||||
switch channel {
|
||||
case 0:
|
||||
c.p.handleRtp(buf[:n])
|
||||
|
||||
case 1:
|
||||
c.p.handleRtcp(buf[:n])
|
||||
|
||||
default:
|
||||
c.log("ERR: unsupported channel '%d'", channel)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue