feat: Video receiver (1/n)

This commit is contained in:
Elysia
2024-07-25 19:18:47 +07:00
parent c193116100
commit 24e151805d
3 changed files with 37 additions and 1 deletions

View File

@@ -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

View File

@@ -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() {

View File

@@ -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.