### Server Example Source: https://github.com/bluenviron/gortmplib/blob/main/README.md Basic RTMP server implementation using gortmplib. Requires configuration from 'server.yml'. ```go package main import ( "fmt" "log" "os" "github.com/bluenviron/gortmplib/v2" "github.com/bluenviron/gortmplib/v2/pkg/configure" ) func main() { // parse configuration conf, err := configure.New("server.yml") if err != nil { panic(err) } // create server server, err := gortmplib.NewServer(conf.Server.Rtmp.Network, conf.Server.Rtmp.Address, conf.Server.Rtmp.Protocol, conf.Server.Rtmp.Path, conf.Server.Rtmp.ReadTimeout, conf.Server.Rtmp.WriteTimeout, conf.Server.Rtmp.WriteQueueSize, conf.Server.Rtmp.DisableConnClose, conf.Server.Rtmp.DisableReadLoop, conf.Server.Rtmp.DisableWriteLoop) if err != nil { panic(err) } // accept clients for { client, err := server.Accept() // accept clients if err != nil { log.Printf("error accepting client: %v", err) continue } // handle client go func() { defer func() { client.Close() // close client }() // read tracks tracks, err := client.Tracks() // read tracks if err != nil { log.Printf("error getting tracks: %v", err) return } fmt.Printf("client connected with %d tracks\n", len(tracks)) // read packets for { _, err := client.ReadPacket() // read packets if err != nil { log.Printf("error reading packet: %v", err) return } } }() } } ``` -------------------------------- ### Client Publish MPEG4 Audio Example Source: https://github.com/bluenviron/gortmplib/blob/main/README.md Example for publishing MPEG4 audio using gortmplib. Configuration is expected in 'client-publish-mpeg4audio.yml'. ```go package main import ( "fmt" "os" "github.com/bluenviron/gortmplib/v2" "github.com/bluenviron/gortmplib/v2/pkg/configure" "github.com/bluenviron/gortmplib/v2/pkg/format/mpeg4audio" "github.com/bluenviron/gortmplib/v2/pkg/io/reader" "github.com/bluenviron/gortmplib/v2/pkg/rtmp/message" ) func main() { // parse configuration conf, err := configure.New("client-publish-mpeg4audio.yml") if err != nil { panic(err) } // create client client, err := gortmplib.NewClient(conf.Client.Rtmp.Network, conf.Client.Rtmp.Address, conf.Client.Rtmp.Protocol, conf.Client.Rtmp.Path, conf.Client.Rtmp.DisableConnClose, conf.Client.Rtmp.DisableReadLoop, conf.Client.Rtmp.DisableWriteLoop) if err != nil { panic(err) } // create MPEG4-audio format format := &mpeg4audio.Format{ SampleRate: 44100, Channels: 2, AVCPrivateData: []byte{0x12, 0x10}, // ADTS header without first 7 bytes } // create track track := &gortmplib.Track{Format: format} // publish err = client.Publish(track) if err != nil { panic(err) } // read AAC data from file and send it file, err := os.Open("audio.m4a") if err != nil { panic(err) } r := reader.NewAAC(file) for { frame, err := r.ReadFrame() if err != nil { panic(err) } // send frame err = client.WritePacket(track, &message.Packet{Type: message.TypeAudio, Data: frame}) if err != nil { panic(err) } } } ``` -------------------------------- ### Client Publish H264 Example Source: https://github.com/bluenviron/gortmplib/blob/main/README.md Example of publishing an H264 stream using the gortmplib client. Requires configuration from 'client-publish-h264.yml'. ```go package main import ( "fmt" "os" "github.com/bluenviron/gortmplib/v2" "github.com/bluenviron/gortmplib/v2/pkg/configure" "github.com/bluenviron/gortmplib/v2/pkg/format/rtmpv2" "github.com/bluenviron/gortmplib/v2/pkg/io/reader" "github.com/bluenviron/gortmplib/v2/pkg/io/writer" "github.com/bluenviron/gortmplib/v2/pkg/rtmp/message" ) func main() { // parse configuration conf, err := configure.New("client-publish-h264.yml") if err != nil { panic(err) } // create client client, err := gortmplib.NewClient(conf.Client.Rtmp.Network, conf.Client.Rtmp.Address, conf.Client.Rtmp.Protocol, conf.Client.Rtmp.Path, conf.Client.Rtmp.DisableConnClose, conf.Client.Rtmp.DisableReadLoop, conf.Client.Rtmp.DisableWriteLoop) if err != nil { panic(err) } // create H264 format format := &rtmpv2.FormatH264{ SequenceParameterSet: []byte{0x00, 0x00, 0x00, 0x01, 0x64, 0x00, 0x0c, 0x28, 0xc4, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0xc0, 0xf0, 0xd9, 0x01, 0x00, 0x04, 0x64, 0x08, 0xd0, 0x8f, 0x00, 0x00, 0x00, 0x05, 0x68, 0xce, 0x38, 0x80, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05}, PictureParameterSet: []byte{0x00, 0x00, 0x00, 0x01, 0x68, 0xca, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, } // create track track := &gortmplib.Track{Format: format} // publish err = client.Publish(track) if err != nil { panic(err) } // read H264 data from file and send it file, err := os.Open("video.h264") if err != nil { panic(err) } r := reader.NewH264(file) for { nal, err := r.ReadNAL() if err != nil { panic(err) } // send NALU err = client.WritePacket(track, &message.Packet{Type: message.TypeVideo, Data: nal}) if err != nil { panic(err) } } } ``` -------------------------------- ### Client Read Example Source: https://github.com/bluenviron/gortmplib/blob/main/README.md Demonstrates how to use the gortmplib client to read RTMP streams. Ensure you have the necessary imports. ```go package main import ( "fmt" "os" "github.com/bluenviron/gortmplib/v2" "github.com/bluenviron/gortmplib/v2/pkg/configure" ) func main() { // parse configuration conf, err := configure.New("client-read.yml") if err != nil { panic(err) } // create client client, err := gortmplib.NewClient(conf.Client.Rtmp.Network, conf.Client.Rtmp.Address, conf.Client.Rtmp.Protocol, conf.Client.Rtmp.Path, conf.Client.Rtmp.DisableConnClose, conf.Client.Rtmp.DisableReadLoop, conf.Client.Rtmp.DisableWriteLoop) if err != nil { panic(err) } // connect to server err = client.Start() // connect to server if err != nil { panic(err) } // wait until the client is closed client.Wait() // wait until the client is closed } ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.