Browse Source

support RTCP streaming via TCP

pull/2/head
aler9 6 years ago
parent
commit
dab15e898d
  1. 14
      rtsp/conn.go
  2. 14
      rtsp_client.go

14
rtsp/conn.go

@ -43,33 +43,33 @@ func (c *Conn) WriteResponse(res *Response) error {
return responseEncode(c.c, res) 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 var header [4]byte
_, err := io.ReadFull(c.c, header[:]) _, err := io.ReadFull(c.c, header[:])
if err != nil { if err != nil {
return 0, err return 0, 0, err
} }
// connection terminated // connection terminated
if header[0] == 0x54 { if header[0] == 0x54 {
return 0, io.EOF return 0, 0, io.EOF
} }
if header[0] != 0x24 { 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:]) framelen := binary.BigEndian.Uint16(header[2:])
if framelen > 2048 { 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]) _, err = io.ReadFull(c.c, frame[:framelen])
if err != nil { 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 { func (c *Conn) WriteInterleavedFrame(frame []byte) error {

14
rtsp_client.go

@ -132,7 +132,7 @@ func (c *rtspClient) run() {
if c.rtpProto == "tcp" { if c.rtpProto == "tcp" {
buf := make([]byte, 2048) buf := make([]byte, 2048)
for { for {
_, err := c.rconn.ReadInterleavedFrame(buf) _, _, err := c.rconn.ReadInterleavedFrame(buf)
if err != nil { if err != nil {
if err != io.EOF { if err != io.EOF {
c.log("ERR: %s", err) c.log("ERR: %s", err)
@ -161,7 +161,7 @@ func (c *rtspClient) run() {
if c.rtpProto == "tcp" { if c.rtpProto == "tcp" {
buf := make([]byte, 2048) buf := make([]byte, 2048)
for { for {
n, err := c.rconn.ReadInterleavedFrame(buf) channel, n, err := c.rconn.ReadInterleavedFrame(buf)
if err != nil { if err != nil {
if err != io.EOF { if err != io.EOF {
c.log("ERR: %s", err) c.log("ERR: %s", err)
@ -169,7 +169,17 @@ func (c *rtspClient) run() {
return return
} }
switch channel {
case 0:
c.p.handleRtp(buf[:n]) c.p.handleRtp(buf[:n])
case 1:
c.p.handleRtcp(buf[:n])
default:
c.log("ERR: unsupported channel '%d'", channel)
return
}
} }
} }

Loading…
Cancel
Save