| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- const dgram = require('dgram');
- const client = dgram.createSocket({ type: 'udp4', reuseAddr: true });
- const sdp = require('./sdp');
- //config
- const addr = '10.10.1.100';
- const danteMulticast = '239.255.220.221';
- const aes67Multicast = '239.69.1.122';
- const samplerate = 48000;
- const channels = 2;
- const encoding = 'L24';
- const name = 'Dante Multicast Relay';
- const sessID = Math.round(Date.now() / 1000);
- const sessVersion = sessID;
- const ptpMaster = '08-00-00-ff-fe-00-00-1f:0';
- //rtp specific vars
- var seqNum = 0;
- client.on('listening', function() {
- client.addMembership(danteMulticast, addr);
- client.setMulticastInterface(addr);
- });
- client.on('message', function(buffer, remote) {
- //read values from buffer
- var channelCount = buffer.readUInt8(0);
- var timestampSeconds = buffer.readUInt32BE(1);
- //bytes 6 and 7 seem to be always 0x00, maybe reserved bytes
- var timestampMedia = buffer.readUInt16BE(7);
- var pcmData = buffer.slice(9);
- //calculate media timestamp for rtp
- var timestampRTP = ((timestampSeconds * samplerate) + timestampMedia) & 0xffffffff;
- //create RTP header
- var rtpHeader = Buffer.alloc(12);
- rtpHeader.writeUInt16BE(0x8061, 0);
- rtpHeader.writeUInt16BE(seqNum, 2);
- rtpHeader.writeInt32BE(timestampRTP, 4);
- rtpHeader.writeUInt32BE(0xaf12af34, 8);
- //create and send RTP packet
- var rtpBuffer = Buffer.concat([rtpHeader, pcmData]);
- client.send(rtpBuffer, 5004, aes67Multicast);
- //increase seqnum
- seqNum = (seqNum + 1) % 65536;
- });
- client.bind(4321);
- sdp.start(addr, aes67Multicast, samplerate, channels, encoding, name, sessID, sessVersion, ptpMaster);
|