feat: Video receiver (1/n)
This commit is contained in:
@@ -106,7 +106,7 @@ class VoiceConnection extends EventEmitter {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Map SSRC values to user IDs
|
* Map SSRC values to user IDs
|
||||||
* @type {Map<number, Snowflake>}
|
* @type {Map<number, { userId: Snowflake, speaking: boolean, hasVideo: boolean }>}
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
this.ssrcMap = new Map();
|
this.ssrcMap = new Map();
|
||||||
@@ -513,6 +513,7 @@ class VoiceConnection extends EventEmitter {
|
|||||||
ws.on('ready', this.onReady.bind(this));
|
ws.on('ready', this.onReady.bind(this));
|
||||||
ws.on('sessionDescription', this.onSessionDescription.bind(this));
|
ws.on('sessionDescription', this.onSessionDescription.bind(this));
|
||||||
ws.on('startSpeaking', this.onStartSpeaking.bind(this));
|
ws.on('startSpeaking', this.onStartSpeaking.bind(this));
|
||||||
|
ws.on('startStreaming', this.onStartStreaming.bind(this));
|
||||||
|
|
||||||
this.sockets.ws.connect();
|
this.sockets.ws.connect();
|
||||||
}
|
}
|
||||||
@@ -569,6 +570,32 @@ class VoiceConnection extends EventEmitter {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onStartStreaming({ video_ssrc, user_id, audio_ssrc }) {
|
||||||
|
this.ssrcMap.set(+audio_ssrc, {
|
||||||
|
...(this.ssrcMap.get(+audio_ssrc) || {}),
|
||||||
|
userId: user_id,
|
||||||
|
hasVideo: Boolean(video_ssrc), // Maybe ?
|
||||||
|
});
|
||||||
|
/**
|
||||||
|
{
|
||||||
|
video_ssrc: 0,
|
||||||
|
user_id: 'uid',
|
||||||
|
streams: [
|
||||||
|
{
|
||||||
|
ssrc: 27734,
|
||||||
|
rtx_ssrc: 27735,
|
||||||
|
rid: '100',
|
||||||
|
quality: 100,
|
||||||
|
max_resolution: [Object],
|
||||||
|
max_framerate: 60,
|
||||||
|
active: false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
audio_ssrc: 27733
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invoked when a speaking event is received.
|
* Invoked when a speaking event is received.
|
||||||
* @param {Object} data The received data
|
* @param {Object} data The received data
|
||||||
|
|||||||
@@ -255,6 +255,7 @@ class BaseDispatcher extends Writable {
|
|||||||
* Discord seems to send this extension on every video packet
|
* Discord seems to send this extension on every video packet
|
||||||
* @see https://webrtc.googlesource.com/src/+/refs/heads/main/docs/native-code/rtp-hdrext/playout-delay
|
* @see https://webrtc.googlesource.com/src/+/refs/heads/main/docs/native-code/rtp-hdrext/playout-delay
|
||||||
* @returns {Buffer} playout-delay extension
|
* @returns {Buffer} playout-delay extension
|
||||||
|
* Buffer <be de 00 01 51 00 00 00>
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
createHeaderExtension() {
|
createHeaderExtension() {
|
||||||
|
|||||||
@@ -214,6 +214,14 @@ class VoiceWebSocket extends EventEmitter {
|
|||||||
*/
|
*/
|
||||||
this.emit('startSpeaking', packet.d);
|
this.emit('startSpeaking', packet.d);
|
||||||
break;
|
break;
|
||||||
|
case VoiceOpcodes.SOURCES:
|
||||||
|
/**
|
||||||
|
* Emitted whenever a streaming packet is received.
|
||||||
|
* @param {Object} data
|
||||||
|
* @event VoiceWebSocket#startStreaming
|
||||||
|
*/
|
||||||
|
this.emit('startStreaming', packet.d);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
/**
|
/**
|
||||||
* Emitted when an unhandled packet is received.
|
* Emitted when an unhandled packet is received.
|
||||||
|
|||||||
Reference in New Issue
Block a user