Documentation
¶
Index ¶
- Constants
- Variables
- func ClearOutputStats(requestID string)
- func GenICELinkHeaders(iceServers []webrtc.ICEServer) []string
- func MediamtxSourceTypeToString(s string) (string, error)
- func NoopReader(reader CloneableReader)
- func StartFileCleanup(ctx context.Context, workDir string)
- type CloneableReader
- type ConnQuality
- type EOSReader
- type IncomingTrack
- type LocalTrack
- func (s *LocalTrack) Bind(trackContext webrtc.TrackLocalContext) (webrtc.RTPCodecParameters, error)
- func (s *LocalTrack) ID() string
- func (s *LocalTrack) Kind() webrtc.RTPCodecType
- func (s *LocalTrack) RID() string
- func (s *LocalTrack) StreamID() string
- func (s *LocalTrack) Unbind(t webrtc.TrackLocalContext) error
- func (s *LocalTrack) WriteSample(au [][]byte, pts int64) error
- type MediaMTXClient
- type MediaReader
- type MediaSegmenter
- type MediaState
- type MediaStats
- type MediaWriter
- type MpegtsWriter
- type OutputStatsData
- type PeerConnStats
- type RTPSegmenter
- func (s *RTPSegmenter) CloseSegment()
- func (s *RTPSegmenter) IsReady() bool
- func (s *RTPSegmenter) ShouldStartSegment(pts int64, tb uint32) bool
- func (s *RTPSegmenter) StartSegment(startTs int64)
- func (s *RTPSegmenter) WriteAudio(source SegmenterTrack, pts int64, au [][]byte) error
- func (s *RTPSegmenter) WriteVideo(source SegmenterTrack, pts, dts int64, au [][]byte) error
- type RTPTrack
- type RingBuffer
- type RingBufferConfig
- type RingBufferReader
- type SegmentHandler
- type SegmentReader
- type SegmentReaderConfig
- type SegmentWriter
- type SegmenterTrack
- type SwitchableSegmentReader
- type TimestampCorrector
- type TimestampCorrectorConfig
- type TrackStats
- type TrackType
- type WHEPServer
- type WHIPConnection
- type WHIPPeerConnection
- type WHIPServer
Constants ¶
const ( MediaMTXWebrtcSession = "webrtcsession" MediaMTXRtmpConn = "rtmpconn" )
const WhepDefaultPlaybacks = 5
const WhepUnlimitedPlaybacks = -1
Variables ¶
var WebrtcConfig = webrtc.Configuration{ ICEServers: []webrtc.ICEServer{ {URLs: []string{"stun:stun.l.google.com:19302"}}, }, }
ICE server configuration. TODO make this configurable
Functions ¶
func ClearOutputStats ¶ added in v0.8.9
func ClearOutputStats(requestID string)
Remove any stored output statistics. Safe to call multiple times.
func GenICELinkHeaders ¶ added in v0.8.4
func MediamtxSourceTypeToString ¶ added in v0.8.2
func NoopReader ¶
func NoopReader(reader CloneableReader)
func StartFileCleanup ¶ added in v0.8.3
StartFileCleanup starts a goroutine to periodically remove any old temporary files accidentally left behind
Types ¶
type CloneableReader ¶ added in v0.8.2
type CloneableReader interface {
io.Reader
Clone() CloneableReader
}
type ConnQuality ¶ added in v0.8.6
type ConnQuality int
const ( ConnQualityGood ConnQuality = iota ConnQualityBad )
func (ConnQuality) MarshalJSON ¶ added in v0.8.6
func (c ConnQuality) MarshalJSON() ([]byte, error)
func (ConnQuality) String ¶ added in v0.8.6
func (c ConnQuality) String() string
type EOSReader ¶
type EOSReader struct{}
func (*EOSReader) Clone ¶ added in v0.8.2
func (r *EOSReader) Clone() CloneableReader
type IncomingTrack ¶ added in v0.8.4
type IncomingTrack struct {
// contains filtered or unexported fields
}
func (*IncomingTrack) ClockRate ¶ added in v0.8.4
func (t *IncomingTrack) ClockRate() int
ClockRate returns the clock rate. Needed by rtptime.GlobalDecoder
func (*IncomingTrack) PTSEqualsDTS ¶ added in v0.8.4
func (*IncomingTrack) PTSEqualsDTS(*rtp.Packet) bool
PTSEqualsDTS returns whether PTS equals DTS. Needed by rtptime.GlobalDecoder TODO handle bframes; look at mediamtx
type LocalTrack ¶ added in v0.8.9
type LocalTrack struct {
// contains filtered or unexported fields
}
Implements the TrackLocal interface in Pion https://github.com/pion/webrtc/blob/7a94394db0b429b0136265f4556512d5f4a05a0b/track_local.go#L102-L105 This mostly borrows from TrackLocalStaticRTP *except* WriteSample takes a timestamp instead of a duration
func NewLocalTrack ¶ added in v0.8.9
func NewLocalTrack( c webrtc.RTPCodecCapability, id, streamID string, options ...func(*webrtc.TrackLocalStaticRTP), ) (*LocalTrack, error)
func (*LocalTrack) Bind ¶ added in v0.8.9
func (s *LocalTrack) Bind(trackContext webrtc.TrackLocalContext) (webrtc.RTPCodecParameters, error)
func (*LocalTrack) ID ¶ added in v0.8.9
func (s *LocalTrack) ID() string
ID is the unique identifier for this Track. This should be unique for the stream, but doesn't have to globally unique. A common example would be 'audio' or 'video' and StreamID would be 'desktop' or 'webcam'.
func (*LocalTrack) Kind ¶ added in v0.8.9
func (s *LocalTrack) Kind() webrtc.RTPCodecType
Kind controls if this TrackLocal is audio or video.
func (*LocalTrack) RID ¶ added in v0.8.9
func (s *LocalTrack) RID() string
RID is the RTP stream identifier.
func (*LocalTrack) StreamID ¶ added in v0.8.9
func (s *LocalTrack) StreamID() string
StreamID is the group this track belongs too. This must be unique.
func (*LocalTrack) Unbind ¶ added in v0.8.9
func (s *LocalTrack) Unbind(t webrtc.TrackLocalContext) error
Unbind implements the teardown logic when the track is no longer needed. This happens because a track has been stopped.
func (*LocalTrack) WriteSample ¶ added in v0.8.9
func (s *LocalTrack) WriteSample(au [][]byte, pts int64) error
WriteSample writes a video / audio Sample to PeerConnections via RTP If one PeerConnection fails the packets will still be sent to all PeerConnections. The error message will contain the ID of the failed PeerConnections so you can remove them.
type MediaMTXClient ¶ added in v0.8.1
type MediaMTXClient struct {
// contains filtered or unexported fields
}
func NewMediaMTXClient ¶ added in v0.8.1
func NewMediaMTXClient(host, apiPassword, sourceID, sourceType string) *MediaMTXClient
func (*MediaMTXClient) KickInputConnection ¶ added in v0.8.1
func (mc *MediaMTXClient) KickInputConnection(ctx context.Context) error
func (*MediaMTXClient) StreamExists ¶ added in v0.8.1
func (mc *MediaMTXClient) StreamExists() (bool, error)
type MediaReader ¶ added in v0.8.2
type MediaReader struct {
// contains filtered or unexported fields
}
func (*MediaReader) Clone ¶ added in v0.8.2
func (mr *MediaReader) Clone() CloneableReader
type MediaSegmenter ¶
type MediaSegmenter struct {
Workdir string
MediaMTXClient *MediaMTXClient
}
func (*MediaSegmenter) RunSegmentation ¶
func (ms *MediaSegmenter) RunSegmentation(ctx context.Context, in string, segmentHandler SegmentHandler)
type MediaState ¶ added in v0.8.4
type MediaState struct {
// contains filtered or unexported fields
}
MediaState manages the lifecycle of a media connection
func NewMediaState ¶ added in v0.8.4
func NewMediaState(pc WHIPPeerConnection) *MediaState
NewMediaState creates a new MediaState with the given peerconnection
func NewMediaStateError ¶ added in v0.8.5
func NewMediaStateError(err error) *MediaState
Returns a mediastate that is already closed with an error
func (*MediaState) AwaitClose ¶ added in v0.8.4
func (m *MediaState) AwaitClose() error
AwaitClose blocks until the connection is closed
func (*MediaState) Close ¶ added in v0.8.4
func (m *MediaState) Close()
Close closes the underlying connection and signals any waiters
func (*MediaState) CloseError ¶ added in v0.8.5
func (m *MediaState) CloseError(err error)
func (*MediaState) IsClosed ¶ added in v0.8.5
func (m *MediaState) IsClosed() bool
func (*MediaState) SetTracks ¶ added in v0.8.5
func (m *MediaState) SetTracks(getter stats.Getter, tracks []SegmenterTrack)
func (*MediaState) Stats ¶ added in v0.8.5
func (m *MediaState) Stats() (*MediaStats, error)
type MediaStats ¶ added in v0.8.5
type MediaStats struct {
PeerConnStats PeerConnStats `json:"peer_conn_stats"`
TrackStats []TrackStats `json:"track_stats,omitempty"`
ConnQuality ConnQuality `json:"conn_quality"`
}
type MediaWriter ¶ added in v0.8.2
type MediaWriter struct {
// contains filtered or unexported fields
}
func NewMediaWriter ¶ added in v0.8.2
func NewMediaWriter() *MediaWriter
func (*MediaWriter) Close ¶ added in v0.8.2
func (mw *MediaWriter) Close() error
func (*MediaWriter) MakeReader ¶ added in v0.8.2
func (mw *MediaWriter) MakeReader() CloneableReader
type MpegtsWriter ¶ added in v0.8.5
type OutputStatsData ¶ added in v0.8.9
type OutputStatsData struct {
// contains filtered or unexported fields
}
OutputStatsData is an opaque struct that holds output statistics for a request. It is concurrency-safe and only ever increases per requestID.
func GetOutputStats ¶ added in v0.8.9
func GetOutputStats(requestID string) *OutputStatsData
Returns the output statistics for the given requestID. If no statistics exist, a new one is created and returned. Returns nil if requestID is empty.
func (*OutputStatsData) GetLastOutputTS ¶ added in v0.8.9
func (o *OutputStatsData) GetLastOutputTS() int64
Return the latest recorded output timestampin 90khz MPEG-TS timebase units.
func (*OutputStatsData) UpdateLastOutputTS ¶ added in v0.8.9
func (o *OutputStatsData) UpdateLastOutputTS(ts int64)
Record the latest output timestamp in 90khz MPEG-TS timebase units
type PeerConnStats ¶ added in v0.8.5
type RTPSegmenter ¶ added in v0.8.4
type RTPSegmenter struct {
// contains filtered or unexported fields
}
func NewRTPSegmenter ¶ added in v0.8.4
func NewRTPSegmenter(tracks []SegmenterTrack, ssr *SwitchableSegmentReader, segDur time.Duration) *RTPSegmenter
func (*RTPSegmenter) CloseSegment ¶ added in v0.8.4
func (s *RTPSegmenter) CloseSegment()
func (*RTPSegmenter) IsReady ¶ added in v0.8.4
func (s *RTPSegmenter) IsReady() bool
func (*RTPSegmenter) ShouldStartSegment ¶ added in v0.8.5
func (s *RTPSegmenter) ShouldStartSegment(pts int64, tb uint32) bool
func (*RTPSegmenter) StartSegment ¶ added in v0.8.4
func (s *RTPSegmenter) StartSegment(startTs int64)
func (*RTPSegmenter) WriteAudio ¶ added in v0.8.4
func (s *RTPSegmenter) WriteAudio(source SegmenterTrack, pts int64, au [][]byte) error
func (*RTPSegmenter) WriteVideo ¶ added in v0.8.4
func (s *RTPSegmenter) WriteVideo(source SegmenterTrack, pts, dts int64, au [][]byte) error
type RTPTrack ¶ added in v0.8.4
type RTPTrack interface {
Codec() webrtc.RTPCodecParameters
Kind() webrtc.RTPCodecType
SSRC() webrtc.SSRC
}
type RingBuffer ¶ added in v0.8.6
type RingBuffer struct {
// contains filtered or unexported fields
}
func NewRingBuffer ¶ added in v0.8.6
func NewRingBuffer(config *RingBufferConfig) (*RingBuffer, error)
func (*RingBuffer) Close ¶ added in v0.8.6
func (rb *RingBuffer) Close()
func (*RingBuffer) MakeReader ¶ added in v0.8.6
func (rb *RingBuffer) MakeReader() *RingBufferReader
type RingBufferConfig ¶ added in v0.8.6
type RingBufferConfig struct {
// Ringbuffer size, in bytes
BufferLen int
}
type RingBufferReader ¶ added in v0.8.6
type RingBufferReader struct {
// contains filtered or unexported fields
}
func (*RingBufferReader) Close ¶ added in v0.8.9
func (rbr *RingBufferReader) Close() error
type SegmentHandler ¶
type SegmentHandler func(reader CloneableReader)
type SegmentReader ¶ added in v0.8.7
type SegmentReader struct {
// contains filtered or unexported fields
}
func (*SegmentReader) Next ¶ added in v0.8.7
func (rr *SegmentReader) Next() (*readerWrapper, error)
Return a reader for the next segment (per‐reader cursor).
type SegmentReaderConfig ¶ added in v0.8.7
type SegmentReaderConfig struct{}
type SegmentWriter ¶ added in v0.8.7
type SegmentWriter struct {
// contains filtered or unexported fields
}
func NewSegmentWriter ¶ added in v0.8.7
func NewSegmentWriter(n int) *SegmentWriter
NewSegmentWriter makes a ring of n MediaWriters.
func (*SegmentWriter) Close ¶ added in v0.8.7
func (rb *SegmentWriter) Close() error
Close shuts the SegmentWriter and all its underlying MediaWriters. After Close, all future Next() calls on writer or readers will error.
func (*SegmentWriter) MakeReader ¶ added in v0.8.7
func (rb *SegmentWriter) MakeReader(_ SegmentReaderConfig) *SegmentReader
MakeReader returns a new reader positioned at the currently active segment.
func (*SegmentWriter) Next ¶ added in v0.8.7
func (rb *SegmentWriter) Next() (io.WriteCloser, error)
Return a fresh writer, pre-creating the next writer.
type SegmenterTrack ¶ added in v0.8.9
func NewSegmenterTrack ¶ added in v0.8.9
func NewSegmenterTrack(tr RTPTrack) SegmenterTrack
type SwitchableSegmentReader ¶
type SwitchableSegmentReader struct {
// contains filtered or unexported fields
}
func NewSwitchableSegmentReader ¶
func NewSwitchableSegmentReader() *SwitchableSegmentReader
func (*SwitchableSegmentReader) Close ¶
func (sr *SwitchableSegmentReader) Close()
func (*SwitchableSegmentReader) Read ¶
func (sr *SwitchableSegmentReader) Read(reader CloneableReader)
func (*SwitchableSegmentReader) SwitchReader ¶
func (sr *SwitchableSegmentReader) SwitchReader(newReader SegmentHandler)
type TimestampCorrector ¶ added in v0.8.6
type TimestampCorrector struct {
// contains filtered or unexported fields
}
TimestampCorrector detects a bug with iOS 18.4.1+ where timestamps come in with microsecond frequency - 1000khz rather than the 90khz that RTP requires If needed, divides incoming timestamps by 90_000 / 1_000_000. https://bugs.webkit.org/show_bug.cgi?id=292273
func NewTimestampCorrector ¶ added in v0.8.6
func NewTimestampCorrector(conf TimestampCorrectorConfig) *TimestampCorrector
NewTimestampCorrector creates a detector based on your target fps.
func (*TimestampCorrector) Process ¶ added in v0.8.6
func (c *TimestampCorrector) Process(ctx context.Context, ts int64) int64
Process inspects the supplied timestamp against wall‐clock arrival time, decides whether the iOS bug is present, and if so converts to 90khz from 1000khz (1000khz == microsecond time base) Returns the (possibly corrected) timestamp.
type TimestampCorrectorConfig ¶ added in v0.8.6
type TimestampCorrectorConfig struct {
// Estimated frame rate.
FPS float64
// Threshold in Hz to trigger correction
ThresholdFreq int
// current user agent to check for inclusion
UserAgent string
// function to obtain current time, injected for testing
Clock func() time.Time
// Kill switch
Disable bool
}
type TrackStats ¶ added in v0.8.5
type TrackStats struct {
Type TrackType `json:"type"`
Jitter float64 `json:"jitter"`
PacketsLost int64 `json:"packets_lost"`
PacketsReceived int64 `json:"packets_received"`
PacketLossPct float64 `json:"packet_loss_pct"`
RTT time.Duration `json:"rtt"`
LastInputTS float64 `json:"last_input_ts"`
LastOutputTS float64 `json:"last_output_ts"`
Latency float64 `json:"latency"`
Warnings []string `json:"warnings,omitempty"`
}
type TrackType ¶ added in v0.8.5
type TrackType struct {
webrtc.RTPCodecType
}
func (TrackType) MarshalJSON ¶ added in v0.8.5
type WHEPServer ¶ added in v0.8.9
type WHEPServer struct {
// contains filtered or unexported fields
}
func NewWHEPServer ¶ added in v0.8.9
func NewWHEPServer() *WHEPServer
func (*WHEPServer) CreateWHEP ¶ added in v0.8.9
func (s *WHEPServer) CreateWHEP(ctx context.Context, w http.ResponseWriter, r *http.Request, mediaReader io.ReadCloser, streamName string)
type WHIPConnection ¶ added in v0.8.4
type WHIPConnection struct {
// contains filtered or unexported fields
}
use this to set peerconnection state when we need it kinda convoluted because the peerconnection gets created async separate from the goroutines where it might be closed from
func NewWHIPConnection ¶ added in v0.8.4
func NewWHIPConnection() *WHIPConnection
func (*WHIPConnection) AwaitClose ¶ added in v0.8.4
func (w *WHIPConnection) AwaitClose() error
func (*WHIPConnection) Close ¶ added in v0.8.4
func (w *WHIPConnection) Close()
func (*WHIPConnection) SetWHIPConnection ¶ added in v0.8.4
func (w *WHIPConnection) SetWHIPConnection(p *MediaState)
func (*WHIPConnection) Stats ¶ added in v0.8.5
func (w *WHIPConnection) Stats() (*MediaStats, error)
type WHIPPeerConnection ¶ added in v0.8.4
type WHIPPeerConnection interface {
io.Closer
GetStats() webrtc.StatsReport
}
type WHIPServer ¶ added in v0.8.4
type WHIPServer struct {
// contains filtered or unexported fields
}
func NewWHIPServer ¶ added in v0.8.4
func NewWHIPServer() *WHIPServer
func (*WHIPServer) CreateWHIP ¶ added in v0.8.4
func (s *WHIPServer) CreateWHIP(ctx context.Context, ssr *SwitchableSegmentReader, whepURL string, w http.ResponseWriter, r *http.Request) *MediaState
handleCreate implements the POST that creates a new resource.