Phase 1 spike: replace @dank074/discord-video-stream + node-datachannel +
node-av (1.3GB) with minimal libdatachannel N-API binding + native RTP
packetizers (H264 FU-A, RTCP SR/NACK, pacer) + pure-TS GoLive stack.
Binding v0.4: addTrack (m=audio/video SDP), TrackWrap w/ setPacketizer +
sendFrame (raw RTP to transport) + addTimestamp — verified by two-peer
handshake emitting SDP with audio(opus 120)+video(H264 101) and 8-frame
RTP roundtrip.
TS layer (src/goLive/, 21 files): CodecPayloadType, VoiceOpCodes,
GatewayOpCodes, utils, BaseMediaConnection (voice WS + DAVE + heartbeat),
VoiceConnection, StreamConnection, Streamer, WebRtcWrapper (SDP mungling,
DAVE encrypt, packetizer chain), BaseMediaStream (pacing/sync), VideoStream,
AudioStream, Demuxer (ffmpeg-spawn NUT/AnnexB, no node-av 114M binary),
Encoders, prepareStream/playStream.
Integration: screenShareController.ts now imports from ../../goLive/index.js —
prepareStream(prepared, ...) + playStream(prepared, streamer, {...}).
Tests: tests/goLive-port.test.ts (8/8 pass). tsc --noEmit clean. biome clean.
21 lines
581 B
TypeScript
21 lines
581 B
TypeScript
/**
|
|
* VideoStream — feeds encoded H264 frames into the WebRTC connection.
|
|
* Ported from @dank074/discord-video-stream VideoStream.js.
|
|
*/
|
|
|
|
import { BaseMediaStream } from "./BaseMediaStream.js";
|
|
import type { WebRtcConnWrapper } from "./WebRtcWrapper.js";
|
|
|
|
export class VideoStream extends BaseMediaStream {
|
|
_conn: WebRtcConnWrapper;
|
|
|
|
constructor(conn: WebRtcConnWrapper, noSleep = false) {
|
|
super("video", noSleep);
|
|
this._conn = conn;
|
|
}
|
|
|
|
async _sendFrame(frame: Buffer, frametime: number): Promise<void> {
|
|
this._conn.sendVideoFrame(frame, frametime);
|
|
}
|
|
}
|