Files
im-system/media-server-demo-node/lib/playback_1.js

134 lines
3.2 KiB
JavaScript

//Get the Medooze Media Server interface
const MediaServer = require("medooze-media-server");
const FileSystem = require("fs");
const Path = require("path");
//Get Semantic SDP objects
const SemanticSDP = require("semantic-sdp");
const SDPInfo = SemanticSDP.SDPInfo;
const MediaInfo = SemanticSDP.MediaInfo;
const CandidateInfo = SemanticSDP.CandidateInfo;
const DTLSInfo = SemanticSDP.DTLSInfo;
const ICEInfo = SemanticSDP.ICEInfo;
const StreamInfo = SemanticSDP.StreamInfo;
const TrackInfo = SemanticSDP.TrackInfo;
const Direction = SemanticSDP.Direction;
const CodecInfo = SemanticSDP.CodecInfo;
const Capabilities = {
audio : {
codecs : ["opus"],
extensions : [ "urn:ietf:params:rtp-hdrext:ssrc-audio-level", "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"]
},
video : {
codecs : ["vp9","vp8","h264;packetization-mode=1"],
rtx : true,
rtcpfbs : [
{ "id": "transport-cc"},
{ "id": "ccm", "params": ["fir"]},
{ "id": "nack"},
{ "id": "nack", "params": ["pli"]}
],
extensions : [ "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"]
}
};
module.exports = function(request,protocol,endpoint)
{
const connection = request.accept(protocol);
let player;
connection.on('message', (frame) =>
{
//Get cmd
var msg = JSON.parse(frame.utf8Data);
//Get cmd
if (msg.cmd==="OFFER")
{
let mp4;
//Get all files in recording dir
const files = FileSystem.readdirSync('recordings');
for(let i in files)
{
if (Path.extname(files[i])===".mp4")
{
//got ir
mp4 = files[i];
break;
}
}
//Check
if (!mp4)
{
console.error("no mp4 found");
return connection.close();
}
//Create player
player = MediaServer.createPlayer(Path.join("recordings",mp4));
//Process the sdp
var offer = SDPInfo.process(msg.offer);
//Create an DTLS ICE transport in that enpoint
const transport = endpoint.createTransport(offer);
//Set RTP remote properties
transport.setRemoteProperties(offer);
transport.dump("recordings/play-"+ Date.now()+".pcap",{
outgoing : true,
rtcp : true
});
//Set RTP remote properties
transport.setRemoteProperties(offer);
//Create local SDP info
const answer = offer.answer({
dtls : transport.getLocalDTLSInfo(),
ice : transport.getLocalICEInfo(),
candidates : endpoint.getLocalCandidates(),
capabilities : Capabilities
});
//Set RTP local properties
transport.setLocalProperties(answer);
//Create new local stream with only video
const outgoingStream = transport.createOutgoingStream({
audio: true,
video: true
});
//Copy incoming data from the broadcast stream to the local one
outgoingStream.attachTo(player);
//Get local stream info
const info = outgoingStream.getStreamInfo();
//Add local stream info it to the answer
answer.addStream(info);
//Send response
connection.sendUTF(JSON.stringify({
answer : answer.toString()
}));
//Close on disconnect
connection.on("close",() => {
//Stop
transport.stop();
//Stop playback too
player.stop();
});
} else if (msg.cmd==="PLAY") {
player.play({
repeat : true
});
}
});
};