Skip to content

@seydx/rtsp / AvSource

Class: AvSource ​

Defined in: sources/av.ts:297

A relay source backed by node-av's demuxer.

Because libav handles the input, a single instance covers RTSP, TCP, HTTP(S), local files and raw byte streams behind one uniform interface — the relay never sees the difference. When pointed at an RTSP camera, it can also expose the ONVIF backchannel so viewer audio can be sent back upstream, and it can pace or loop finite inputs to behave like a continuous live stream.

Examples ​

typescript
import { AvSource, Relay } from '@seydx/rtsp';

// Live RTSP camera over TCP with talkback enabled.
const source = new AvSource('rtsp://user:pass@camera.local/stream', {
  transport: 'tcp',
  backchannel: true,
});

const relay = new Relay({ source });
await relay.start();
typescript
import { AvSource } from '@seydx/rtsp';

// Serve a file as a looping live stream paced to real time.
const source = new AvSource('/media/clip.mp4', { readrate: 1, loop: true });

See ​

  • Source For the relay source contract
  • BackchannelSource For the talkback contract this source implements
  • Relay For wiring a source to one or more sinks

Implements ​

Constructors ​

Constructor ​

new AvSource(input, opts?): AvSource

Defined in: sources/av.ts:319

Create a source for the given input.

No I/O happens here; the input is opened lazily by AvSource.open.

Parameters ​

input ​

AvInput

URL, path, or in-memory buffer to demux

opts? ​

AvSourceOptions = {}

Options controlling transport, timeout, pacing, looping and the backchannel

Returns ​

AvSource

Accessors ​

backchannel ​

Get Signature ​

get backchannel(): BackchannelInfo | undefined

Defined in: sources/av.ts:339

The upstream talkback format, once known.

Populated by AvSource.open when AvSourceOptions.backchannel is enabled and the camera advertises a send-only stream; otherwise undefined.

Example ​
typescript
await source.open();
if (source.backchannel) {
  console.log('talkback codec:', source.backchannel.codec);
}
Returns ​

BackchannelInfo | undefined

The negotiated backchannel format, once known.

Present only after the upstream is open and has advertised a backchannel; remains undefined while closed or when the upstream offers no talkback.

Implementation of ​

BackchannelSource.backchannel

Methods ​

close() ​

close(): Promise<void>

Defined in: sources/av.ts:495

Release the input and all associated native resources.

Safe to call more than once and at any time, including before AvSource.open. After closing, the source can be reopened with a fresh AvSource.open call.

Returns ​

Promise<void>

A promise that resolves once the source is fully closed

Example ​

typescript
await source.close();

Implementation of ​

Source.close


open() ​

open(): Promise<StreamInfo>

Defined in: sources/av.ts:361

Open the input and resolve its stream layout.

Establishes the demuxer connection and, when the backchannel is requested, reads the camera's talkback descriptor. Must be called once before AvSource.packets.

Returns ​

Promise<StreamInfo>

The resolved stream info, including tracks and an optional backchannel descriptor

Throws ​

If node-av fails to open the input

Example ​

typescript
const source = new AvSource('rtsp://camera.local/stream');
const info = await source.open();
console.log(info.tracks.map((t) => t.codec));

Implementation of ​

Source.open


packets() ​

packets(signal): AsyncIterable<MediaPacket>

Defined in: sources/av.ts:421

Yield demuxed media packets until the signal aborts or the input ends.

Drives one read pass over the input; when AvSourceOptions.loop is enabled, the input is reopened on completion and streaming continues on the same wall clock until aborted. With AvSourceOptions.reconnect, read failures (and unexpected end-of-stream) reopen the input under an exponential backoff instead of ending iteration. AvSource.open must have been called first.

Parameters ​

signal ​

AbortSignal

Abort signal that stops iteration and aborts any in-flight pacing delay

Returns ​

AsyncIterable<MediaPacket>

Yields ​

Demuxed media packets (each must be freed by the caller)

Throws ​

If called before AvSource.open, or when a read fails and reconnecting is disabled or its retries are exhausted

Example ​

typescript
const ac = new AbortController();
await source.open();
for await (const packet of source.packets(ac.signal)) {
  handle(packet);
  packet.free();
}

Implementation of ​

Source.packets


sendBackchannel() ​

sendBackchannel(rtp): void

Defined in: sources/av.ts:386

Send one RTP packet of talkback audio back to the camera.

The payload must already be encoded in the backchannel codec described by AvSource.backchannel. The call is a no-op when the input is not open or no backchannel is available, and send failures are logged rather than thrown.

Parameters ​

rtp ​

Buffer

A single RTP packet in the backchannel codec

Returns ​

void

Example ​

typescript
if (source.backchannel) {
  source.sendBackchannel(rtpPacket);
}

Implementation of ​

BackchannelSource.sendBackchannel