Documentation ¶
Index ¶
- Constants
- Variables
- func Assert(ok bool)
- func Atoi(s string) (i int)
- func Before(s, sep string) string
- func Between(s, sub1, sub2 string) string
- func Caller() string
- func DecodeH264(fmtp string) (profile string, level byte)
- func FFmpegCodecName(name string) string
- func GetKind(name string) string
- func ID(v any) uint32deprecated
- func MarshalSDP(name string, medias []*Media) ([]byte, error)
- func MoveNode(dst, src *Node)
- func NewID() uint32
- func Now90000() uint32
- func RandString(size, base byte) string
- type Codec
- func (c *Codec) Clone() *Codec
- func (c *Codec) IsAudio() bool
- func (c *Codec) IsRTP() bool
- func (c *Codec) IsVideo() bool
- func (c *Codec) Kind() string
- func (c *Codec) MarshalJSON() ([]byte, error)
- func (c *Codec) Match(remote *Codec) bool
- func (c *Codec) PrintName() string
- func (c *Codec) String() (s string)
- type Connection
- func (c *Connection) Codecs() []*Codecdeprecated
- func (c *Connection) GetMedias() []*Media
- func (c *Connection) GetTrack(media *Media, codec *Codec) (*Receiver, error)
- func (c *Connection) SetProtocol(s string)
- func (c *Connection) SetRemoteAddr(s string)
- func (c *Connection) SetSource(s string)
- func (c *Connection) SetURL(s string)
- func (c *Connection) Stop() error
- func (c *Connection) WithRequest(r *http.Request)
- type Consumer
- type EventFunc
- type Filter
- type HandlerFunc
- type Info
- type Listener
- type Media
- func (m *Media) Clone() *Media
- func (m *Media) Equal(media *Media) bool
- func (m *Media) MarshalJSON() ([]byte, error)
- func (m *Media) MatchAll() bool
- func (m *Media) MatchCodec(remote *Codec) *Codec
- func (m *Media) MatchMedia(remote *Media) (codec, remoteCodec *Codec)
- func (m *Media) String() string
- type Mode
- type Node
- type OnceBuffer
- type Packet
- type Producer
- type ReadBuffer
- type Receiver
- type Sender
- func (s *Sender) Bind(parent *Receiver)deprecated
- func (s *Sender) Close()
- func (s *Sender) HandleRTP(parent *Receiver)deprecated
- func (s *Sender) MarshalJSON() ([]byte, error)
- func (s *Sender) Start()
- func (s *Sender) State() string
- func (s *Sender) Wait()
- func (s *Sender) WithParent(parent *Receiver) *Sender
- type Waiter
- type Worker
- type WriteBuffer
Constants ¶
const ( DirectionRecvonly = "recvonly" DirectionSendonly = "sendonly" DirectionSendRecv = "sendrecv" )
const ( KindVideo = "video" KindAudio = "audio" )
const ( CodecH264 = "H264" // payloadType: 96 CodecH265 = "H265" CodecVP8 = "VP8" CodecVP9 = "VP9" CodecAV1 = "AV1" CodecJPEG = "JPEG" // payloadType: 26 CodecRAW = "RAW" CodecPCMU = "PCMU" // payloadType: 0 CodecPCMA = "PCMA" // payloadType: 8 CodecAAC = "MPEG4-GENERIC" CodecOpus = "OPUS" // payloadType: 111 CodecG722 = "G722" CodecMP3 = "MPA" // payload: 14, aka MPEG-1 Layer III CodecPCM = "L16" // Linear PCM (big endian) CodecPCML = "PCML" // Linear PCM (little endian) CodecELD = "ELD" // AAC-ELD CodecFLAC = "FLAC" CodecAll = "ALL" CodecAny = "ANY" )
const ( BufferSize = 64 * 1024 // 64K ConnDialTimeout = time.Second * 3 ConnDeadline = time.Second * 5 ProbeTimeout = time.Second * 3 )
const ( BufferDisable = 0 BufferDrainAndClear = -1 )
const PayloadTypeRAW byte = 255
const ProbeSize = 5 * 1024 * 1024 // 5MB
ProbeSize in my tests MPEG-TS 40Mbit/s 4K-video require more than 1MB for probe
Variables ¶
var ErrCantGetTrack = errors.New("can't get track")
Functions ¶
func DecodeH264 ¶
func FFmpegCodecName ¶
func Now90000 ¶
func Now90000() uint32
Now90000 - timestamp for Video (clock rate = 90000 samples per second)
func RandString ¶
RandString base10 - numbers, base16 - hex, base36 - digits+letters base64 - URL safe symbols, base0 - crypto random
Types ¶
type Codec ¶
type Codec struct { Name string // H264, PCMU, PCMA, opus... ClockRate uint32 // 90000, 8000, 16000... Channels uint16 // 0, 1, 2 FmtpLine string PayloadType uint8 }
func UnmarshalCodec ¶
func (*Codec) MarshalJSON ¶
MarshalJSON - return FFprobe compatible output
type Connection ¶
type Connection struct { ID uint32 `json:"id,omitempty"` FormatName string `json:"format_name,omitempty"` // rtsp, webrtc, mp4, mjpeg, mpjpeg... Protocol string `json:"protocol,omitempty"` // tcp, udp, http, ws, pipe... RemoteAddr string `json:"remote_addr,omitempty"` // host:port other info Source string `json:"source,omitempty"` URL string `json:"url,omitempty"` SDP string `json:"sdp,omitempty"` UserAgent string `json:"user_agent,omitempty"` Medias []*Media `json:"medias,omitempty"` Receivers []*Receiver `json:"receivers,omitempty"` Senders []*Sender `json:"senders,omitempty"` Recv int `json:"bytes_recv,omitempty"` Send int `json:"bytes_send,omitempty"` Transport any `json:"-"` }
Connection just like webrtc.PeerConnection - ID and RemoteAddr used for building Connection(s) graph - FormatName, Protocol, RemoteAddr, Source, URL, SDP, UserAgent used for info about Connection - FormatName and Protocol has FFmpeg compatible names - Transport used for auto closing on Stop
func Create ¶
func Create(w io.Writer) (*Connection, error)
Create like os.Create, init Consumer with existing Transport
func Dial ¶
func Dial(rawURL string) (*Connection, error)
Dial like net.Dial, init Producer via Dialing
func Open ¶
func Open(r io.Reader) (*Connection, error)
Open like os.Open, init Producer from existing Transport
func (*Connection) Codecs
deprecated
func (c *Connection) Codecs() []*Codec
Deprecated:
func (*Connection) GetMedias ¶
func (c *Connection) GetMedias() []*Media
func (*Connection) GetTrack ¶
func (c *Connection) GetTrack(media *Media, codec *Codec) (*Receiver, error)
func (*Connection) SetProtocol ¶
func (c *Connection) SetProtocol(s string)
func (*Connection) SetRemoteAddr ¶
func (c *Connection) SetRemoteAddr(s string)
func (*Connection) SetSource ¶
func (c *Connection) SetSource(s string)
func (*Connection) SetURL ¶
func (c *Connection) SetURL(s string)
func (*Connection) Stop ¶
func (c *Connection) Stop() error
func (*Connection) WithRequest ¶
func (c *Connection) WithRequest(r *http.Request)
type Filter ¶
type Filter func(handler HandlerFunc) HandlerFunc
Filter - a decorator for any HandlerFunc
type HandlerFunc ¶
type HandlerFunc func(packet *Packet)
HandlerFunc - process input packets (just like http.HandlerFunc)
type Listener ¶
type Listener struct {
// contains filtered or unexported fields
}
Listener base struct for all classes with support feedback
type Media ¶
type Media struct { Kind string `json:"kind,omitempty"` // video or audio Direction string `json:"direction,omitempty"` // sendonly, recvonly Codecs []*Codec `json:"codecs,omitempty"` ID string `json:"id,omitempty"` // MID for WebRTC, Control for RTSP }
Media take best from: - deepch/vdk/format/rtsp/sdp.Media - pion/sdp.MediaDescription
func ParseQuery ¶
func UnmarshalMedia ¶
func UnmarshalMedia(md *sdp.MediaDescription) *Media
func (*Media) MarshalJSON ¶
func (*Media) MatchCodec ¶
func (*Media) MatchMedia ¶
type Node ¶
type Node struct { Codec *Codec Input HandlerFunc Output HandlerFunc // contains filtered or unexported fields }
Node - Receiver or Sender or Filter (transform)
func (*Node) AppendChild ¶
func (*Node) RemoveChild ¶
func (*Node) WithParent ¶
type OnceBuffer ¶
type OnceBuffer struct {
// contains filtered or unexported fields
}
OnceBuffer will catch only first message
func (*OnceBuffer) Buffer ¶
func (o *OnceBuffer) Buffer() []byte
func (*OnceBuffer) Len ¶
func (o *OnceBuffer) Len() int
type Producer ¶
type Producer interface { // GetMedias - return Media(s) with local Media.Direction: // - recvonly for Producer Video/Audio // - sendonly for Producer backchannel GetMedias() []*Media // GetTrack - return Receiver, that can only produce rtp.Packet(s) GetTrack(media *Media, codec *Codec) (*Receiver, error) // Deprecated: rename to Run() Start() error // Deprecated: rename to Close() Stop() error }
type ReadBuffer ¶
ReadBuffer support buffering and Seek over buffer positive BufferSize will enable buffering mode Seek to negative offset will clear buffer Seek with a positive BufferSize will continue buffering after the last read from the buffer Seek with a negative BufferSize will clear buffer after the last read from the buffer Read more than BufferSize will raise error
func NewReadBuffer ¶
func NewReadBuffer(rd io.Reader) *ReadBuffer
func (*ReadBuffer) Close ¶
func (r *ReadBuffer) Close() error
func (*ReadBuffer) Reset ¶
func (r *ReadBuffer) Reset()
type Receiver ¶
type Receiver struct { Node // Deprecated: should be removed Media *Media `json:"-"` // Deprecated: should be removed ID byte `json:"-"` // Channel for RTSP, PayloadType for MPEG-TS Bytes int `json:"bytes,omitempty"` Packets int `json:"packets,omitempty"` }
func NewReceiver ¶
func (*Receiver) MarshalJSON ¶
type Sender ¶
type Sender struct { Node // Deprecated: Media *Media `json:"-"` // Deprecated: Handler HandlerFunc `json:"-"` Bytes int `json:"bytes,omitempty"` Packets int `json:"packets,omitempty"` Drops int `json:"drops,omitempty"` // contains filtered or unexported fields }
func (*Sender) MarshalJSON ¶
func (*Sender) WithParent ¶
type Waiter ¶
Waiter support: - autotart on first Wait - block new waiters after last Done - safe Done after finish
type Worker ¶
type Worker struct {
// contains filtered or unexported fields
}
type WriteBuffer ¶
WriteBuffer by defaul Write(s) to bytes.Buffer. But after WriteTo to new io.Writer - calls Reset. Reset will flush current buffer data to new writer and starts to Write to new io.Writer WriteTo will be locked until Write fails or Close will be called.
func NewWriteBuffer ¶
func NewWriteBuffer(wr io.Writer) *WriteBuffer
func (*WriteBuffer) Close ¶
func (w *WriteBuffer) Close() error
func (*WriteBuffer) Reset ¶
func (w *WriteBuffer) Reset(wr io.Writer)