This is a SRT library for Go. This is based on the SRT C library.
This library is internally binding SRT C API, but it exposes Go net package like API so that Go programmers can easy to integrate SRT into their application.
This is a simple example that receive SRT packets from port 5000 and forwards them to localhost port 5001.
l, _ := srt.Listen("srt", ":5000")
defer l.Close()
for {
conn, _ := l.Accept()
go func(sc net.Conn) {
defer sc.Close()
tc, _ := srt.Dial("srt", "127.0.0.1:5001")
for {
b := make([]byte, 1316)
n, _ := sc.Read(b)
tc.Write(b[:n])
}
}(conn)
}There are several SRT socket options. You can configure those options with a context.
For example, following code creates a context with options payloadsize to 1316 and latency to 400, then listen and dial with the options.
ctx := srt.WithOptions(context.Background(), srt.Options("payloadsize", "1316", "latency", "400"))
l, err := srt.ListenContext(ctx, "srt", ":5000")
var d srt.Dialer
tc, err := d.DialContext(ctx, "srt", "127.0.0.1:5001")Following table show how gosrt option corresponds to SRT C API options.
| gosrt option | SRT C API option |
|---|---|
| transtype | SRTO_TRANSTYPE |
| maxbw | SRTO_MAXBW |
| pbkeylen | SRTO_PBKEYLEN |
| passphrase | SRTO_PASSPHRASE |
| mss | SRTO_MSS |
| fc | SRTO_FC |
| sndbuf | SRTO_SNDBUF |
| rcvbuf | SRTO_RCVBUF |
| ipttl | SRTO_IPTTL |
| iptos | SRTO_IPTOS |
| inputbw | SRTO_INPUTBW |
| oheadbw | SRTO_OHEADBW |
| latency | SRTO_LATENCY |
| tsbpdmode | SRTO_TSBPDMODE |
| tlpktdrop | SRTO_TLPKTDROP |
| snddropdelay | SRTO_SNDDROPDELAY |
| nakreport | SRTO_NAKREPORT |
| conntimeo | SRTO_CONNTIMEO |
| lossmaxttl | SRTO_LOSSMAXTTL |
| rcvlatency | SRTO_RCVLATENCY |
| peerlatency | SRTO_PEERLATENCY |
| minversion | SRTO_MINVERSION |
| streamid | SRTO_STREAMID |
| congestion | SRTO_CONGESTION |
| messageapi | SRTO_MESSAGEAPI |
| payloadsize | SRTO_PAYLOADSIZE |
| kmrefreshrate | SRTO_KMREFRESHRATE |
| kmpreannounce | SRTO_KMPREANNOUNCE |
| enforcedencryption | SRTO_ENFORCEDENCRYPTION |
| peeridletimeo | SRTO_PEERIDLETIMEO |
| packetfilter | SRTO_PACKETFILTER |
The example app receives SRT packets and sends them to the target address specified in .env file. In the following steps, you can send a test stream from ffmpeg to the gosrt example app, and ffplay play it.
- Install ffmpeg with srt support
$ brew tap homebrew-ffmpeg/ffmpeg
$ brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-srt- Run ffplay
$ ffplay -probesize 32000 -sync ext 'srt://0.0.0.0:5001?mode=listener'- Run gosrt Example app
$ cp .env.sample .env
$ docker-compose up- Run ffmpeg
$ ffmpeg -re -f lavfi -i testsrc=size=1280x720:rate=30 -f lavfi -i sine \
-vf drawtext="text='%{localtime\:%X}':fontsize=20:fontcolor=white:x=7:y=7" \
-vcodec libx264 -vb 2000k -preset ultrafast -x264-params keyint=60 \
-acodec aac -f mpegts 'srt://127.0.0.1:5000?streamid=#!::u=user,t=file,m=publish,r=results.csv&passphrase=verylongpassword'