media

package
v0.8.10 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 10, 2026 License: MIT Imports: 40 Imported by: 0

Documentation

Index

Constants

View Source
const (
	MediaMTXWebrtcSession = "webrtcsession"
	MediaMTXRtmpConn      = "rtmpconn"
)
View Source
const WhepDefaultPlaybacks = 5
View Source
const WhepUnlimitedPlaybacks = -1

Variables

View Source
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 GenICELinkHeaders(iceServers []webrtc.ICEServer) []string

func MediamtxSourceTypeToString added in v0.8.2

func MediamtxSourceTypeToString(s string) (string, error)

func NoopReader

func NoopReader(reader CloneableReader)

func StartFileCleanup added in v0.8.3

func StartFileCleanup(ctx context.Context, workDir string)

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

func (*EOSReader) Read

func (r *EOSReader) Read(p []byte) (n int, err error)

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 (*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

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

func (*MediaReader) Read added in v0.8.2

func (mr *MediaReader) Read(p []byte) (int, error)

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

func (*MediaWriter) Write added in v0.8.2

func (mw *MediaWriter) Write(data []byte) (int, error)

type MpegtsWriter added in v0.8.5

type MpegtsWriter interface {
	WriteH264(*mpegts.Track, int64, int64, [][]byte) error
	WriteOpus(*mpegts.Track, int64, [][]byte) error
}

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 PeerConnStats struct {
	ID            string
	BytesReceived uint64
	BytesSent     uint64
}

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

func (*RingBuffer) Write added in v0.8.6

func (rb *RingBuffer) Write(data []byte) (int, error)

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

func (*RingBufferReader) Read added in v0.8.6

func (rbr *RingBufferReader) Read(p []byte) (int, 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

type SegmenterTrack interface {
	RTPTrack
	LastMpegtsTS() int64
	SetLastMpegtsTS(ts int64)
}

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

func (t TrackType) MarshalJSON() ([]byte, error)

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

handleCreate implements the POST that creates a new resource.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL