mirror of
https://github.com/aler9/gortsplib
synced 2025-10-04 23:02:45 +08:00

RFC7587 mandates 48khz as sample rate and 2 channels inside the SDP. These values can be dynamically adjusted by the stream, but they must not be touched inside the SDP.
77 lines
1.7 KiB
Go
77 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"net"
|
|
|
|
"github.com/aler9/gortsplib/v2"
|
|
"github.com/aler9/gortsplib/v2/pkg/format"
|
|
"github.com/aler9/gortsplib/v2/pkg/media"
|
|
"github.com/pion/rtp"
|
|
)
|
|
|
|
// This example shows how to
|
|
// 1. generate RTP/Opus packets with GStreamer
|
|
// 2. connect to a RTSP server, announce an Opus media
|
|
// 3. route the packets from GStreamer to the server
|
|
|
|
func main() {
|
|
// open a listener to receive RTP/Opus packets
|
|
pc, err := net.ListenPacket("udp", "localhost:9000")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer pc.Close()
|
|
|
|
log.Println("Waiting for a RTP/Opus stream on UDP port 9000 - you can send one with GStreamer:\n" +
|
|
"gst-launch-1.0 audiotestsrc freq=300 ! audioconvert ! audioresample ! audio/x-raw,rate=48000" +
|
|
" ! opusenc ! rtpopuspay ! udpsink host=127.0.0.1 port=9000")
|
|
|
|
// wait for first packet
|
|
buf := make([]byte, 2048)
|
|
n, _, err := pc.ReadFrom(buf)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
log.Println("stream connected")
|
|
|
|
// create a media that contains a Opus format
|
|
medi := &media.Media{
|
|
Type: media.TypeAudio,
|
|
Formats: []format.Format{&format.Opus{
|
|
PayloadTyp: 96,
|
|
IsStereo: false,
|
|
}},
|
|
}
|
|
|
|
c := gortsplib.Client{}
|
|
|
|
// connect to the server and start recording the media
|
|
err = c.StartRecording("rtsp://localhost:8554/mystream", media.Medias{medi})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer c.Close()
|
|
|
|
var pkt rtp.Packet
|
|
for {
|
|
// parse RTP packet
|
|
err = pkt.Unmarshal(buf[:n])
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// route RTP packet to the server
|
|
err = c.WritePacketRTP(medi, &pkt)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// read another RTP packet from source
|
|
n, _, err = pc.ReadFrom(buf)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
}
|