mediasoup-client-node [WIP]
Node.js client side (not browser,just node.js) library for building mediasoup based applications.
Using werift-webrtc for webrtc protocol stack
Installation
npm install msc-node
requires at least Node.js 14
Usage Example
import {
Device,
RTCRtpCodecParameters,
useAbsSendTime,
useFIR,
useNACK,
usePLI,
useREMB,
useSdesMid,
MediaStreamTrack,
} from "msc-node";
import { exec } from "child_process";
import { createSocket } from "dgram";
import mySignaling from "./my-signaling";
const device = new Device({
headerExtensions: {
video: [useSdesMid(), useAbsSendTime()],
},
codecs: {
video: [
new RTCRtpCodecParameters({
mimeType: "video/VP8",
clockRate: 90000,
payloadType: 98,
rtcpFeedback: [useFIR(), useNACK(), usePLI(), useREMB()],
}),
],
},
});
const routerRtpCapabilities = await mySignaling.request(
"getRouterCapabilities"
);
await device.load({ routerRtpCapabilities });
if (!device.canProduce("video")) {
console.warn("cannot produce video");
}
const { id, iceParameters, iceCandidates, dtlsParameters, sctpParameters } =
await mySignaling.request("createTransport", {
sctpCapabilities: device.sctpCapabilities,
});
const sendTransport = device.createSendTransport({
id,
iceParameters,
iceCandidates,
dtlsParameters,
sctpParameters,
});
sendTransport.on("connect", async ({ dtlsParameters }, callback, errback) => {
try {
await mySignaling.request("transport-connect", {
transportId: sendTransport.id,
dtlsParameters,
});
callback();
} catch (error) {
errback(error);
}
});
sendTransport.on(
"produce",
async ({ kind, rtpParameters, appData }, callback, errback) => {
try {
const { id } = await mySignaling.request("produce", {
transportId: sendTransport.id,
kind,
rtpParameters,
appData,
});
callback({ id });
} catch (error) {
errback(error);
}
}
);
sendTransport.on(
"producedata",
async (
{ sctpStreamParameters, label, protocol, appData },
callback,
errback
) => {
try {
const { id } = await mySignaling.request("produceData", {
transportId: sendTransport.id,
sctpStreamParameters,
label,
protocol,
appData,
});
callback({ id });
} catch (error) {
errback(error);
}
}
);
exec(
"ffmpeg -re -f lavfi -i testsrc=size=640x480:rate=30 -vcodec libvpx -cpu-used 5 -deadline 1 -g 10 -error-resilient 1 -auto-alt-ref 1 -f rtp rtp://127.0.0.1:5030"
);
const udp = createSocket("udp4");
udp.bind(5030);
const rtpTrack = new MediaStreamTrack({ kind: "video" });
udp.addListener("message", (data) => {
rtpTrack.writeRtp(data);
});
const rtpProducer = await sendTransport.produce({ track: rtpTrack });
const dataProducer = await sendTransport.produceData({
ordered: true,
label: "foo",
});
Authors
Original Authors
License
ISC
Original License
ISC License
Copyright © 2015, Iñaki Baz Castillo <ibc@aliax.net>