feat: Video receiver (1/n)
This commit is contained in:
@@ -106,7 +106,7 @@ class VoiceConnection extends EventEmitter {
|
||||
|
||||
/**
|
||||
* Map SSRC values to user IDs
|
||||
* @type {Map<number, Snowflake>}
|
||||
* @type {Map<number, { userId: Snowflake, speaking: boolean, hasVideo: boolean }>}
|
||||
* @private
|
||||
*/
|
||||
this.ssrcMap = new Map();
|
||||
@@ -513,6 +513,7 @@ class VoiceConnection extends EventEmitter {
|
||||
ws.on('ready', this.onReady.bind(this));
|
||||
ws.on('sessionDescription', this.onSessionDescription.bind(this));
|
||||
ws.on('startSpeaking', this.onStartSpeaking.bind(this));
|
||||
ws.on('startStreaming', this.onStartStreaming.bind(this));
|
||||
|
||||
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.
|
||||
* @param {Object} data The received data
|
||||
|
||||
@@ -255,6 +255,7 @@ class BaseDispatcher extends Writable {
|
||||
* 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
|
||||
* @returns {Buffer} playout-delay extension
|
||||
* Buffer <be de 00 01 51 00 00 00>
|
||||
* @private
|
||||
*/
|
||||
createHeaderExtension() {
|
||||
|
||||
@@ -214,6 +214,14 @@ class VoiceWebSocket extends EventEmitter {
|
||||
*/
|
||||
this.emit('startSpeaking', packet.d);
|
||||
break;
|
||||
case VoiceOpcodes.SOURCES:
|
||||
/**
|
||||
* Emitted whenever a streaming packet is received.
|
||||
* @param {Object} data
|
||||
* @event VoiceWebSocket#startStreaming
|
||||
*/
|
||||
this.emit('startStreaming', packet.d);
|
||||
break;
|
||||
default:
|
||||
/**
|
||||
* Emitted when an unhandled packet is received.
|
||||
|
||||
Reference in New Issue
Block a user