Skip to content

Commit c9724e2

Browse files
committedMar 9, 2025
Fix RTMP server handshake for FFmpeg #1318
1 parent 830e476 commit c9724e2

File tree

1 file changed

+45
-7
lines changed

1 file changed

+45
-7
lines changed
 

‎pkg/rtmp/server.go

+45-7
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ package rtmp
22

33
import (
44
"bufio"
5+
"crypto/rand"
56
"encoding/binary"
7+
"errors"
68
"fmt"
79
"io"
810
"net"
11+
"time"
912

1013
"github.com/AlexxIT/go2rtc/pkg/core"
1114
"github.com/AlexxIT/go2rtc/pkg/flv/amf"
@@ -34,23 +37,54 @@ func NewServer(conn net.Conn) (*Conn, error) {
3437
}
3538

3639
func (c *Conn) serverHandshake() error {
37-
b := make([]byte, 1+1536)
38-
// read C0+C1
40+
// based on https://rtmp.veriskope.com/docs/spec/
41+
_ = c.conn.SetDeadline(time.Now().Add(core.ConnDeadline))
42+
43+
// read C0
44+
b := make([]byte, 1)
3945
if _, err := io.ReadFull(c.rd, b); err != nil {
4046
return err
4147
}
42-
// write S0+S1, skip random
48+
49+
if b[0] != 3 {
50+
return errors.New("rtmp: wrong handshake")
51+
}
52+
53+
// write S0
54+
if _, err := c.conn.Write([]byte{3}); err != nil {
55+
return err
56+
}
57+
58+
b = make([]byte, 1536)
59+
60+
// write S1
61+
tsS1 := nowMS()
62+
binary.BigEndian.PutUint32(b, tsS1)
63+
binary.BigEndian.PutUint32(b[4:], 0)
64+
_, _ = rand.Read(b[8:])
4365
if _, err := c.conn.Write(b); err != nil {
4466
return err
4567
}
46-
// read S1, skip check
47-
if _, err := io.ReadFull(c.rd, make([]byte, 1536)); err != nil {
68+
69+
// read C1
70+
if _, err := io.ReadFull(c.rd, b); err != nil {
4871
return err
4972
}
50-
// write C1
51-
if _, err := c.conn.Write(b[1:]); err != nil {
73+
74+
// write S2
75+
tsS2 := nowMS()
76+
binary.BigEndian.PutUint32(b, tsS1)
77+
binary.BigEndian.PutUint32(b[4:], tsS2)
78+
if _, err := c.conn.Write(b); err != nil {
5279
return err
5380
}
81+
82+
// read C2
83+
if _, err := io.ReadFull(c.rd, b); err != nil {
84+
return err
85+
}
86+
87+
_ = c.conn.SetDeadline(time.Time{})
5488
return nil
5589
}
5690

@@ -161,3 +195,7 @@ func (c *Conn) WriteStart() error {
161195
payload := amf.EncodeItems("onStatus", 0, nil, map[string]any{"code": code})
162196
return c.writeMessage(3, TypeCommand, 0, payload)
163197
}
198+
199+
func nowMS() uint32 {
200+
return uint32(time.Now().UnixNano() / int64(time.Millisecond))
201+
}

0 commit comments

Comments
 (0)
Please sign in to comment.