diff --git a/services/discord-gateway/src/goLive/Demuxer.ts b/services/discord-gateway/src/goLive/Demuxer.ts index 22f76fd..a2b5c9d 100644 --- a/services/discord-gateway/src/goLive/Demuxer.ts +++ b/services/discord-gateway/src/goLive/Demuxer.ts @@ -161,6 +161,11 @@ export async function demux( // stderr and are parsed for dimensions/fps. "-loglevel", "info", + // Input format hint: prepareStream always emits raw AnnexB H264 on + // pipe:0. Raw H264 has NO magic header, so ffmpeg's auto-detection + // fails with "Invalid data found when processing input" whenever the + // first bytes arrive late/buffered. Pin the demuxer input format. + ...(isStream ? ["-f", "h264"] : []), "-i", isStream ? "pipe:0" : input, "-c:v", diff --git a/services/discord-gateway/src/goLive/Streamer.ts b/services/discord-gateway/src/goLive/Streamer.ts index 844642e..d6779cb 100644 --- a/services/discord-gateway/src/goLive/Streamer.ts +++ b/services/discord-gateway/src/goLive/Streamer.ts @@ -302,16 +302,15 @@ export class Streamer { channelId: channel_id, botId: user_id, } = this.voiceConnection; - // Mimic the real Discord client when starting Go Live: flip the voice - // state to video-enabled (and un-deafen) BEFORE requesting the stream. - // Discord's gateway silently ignores STREAM_CREATE while the user's - // voice state still has self_video: false. + // Un-deafen before requesting the stream (mimic real client). Do NOT + // set self_video: true — that flips on the bot's camera in Discord + // (visible to everyone); screen share should not enable the camera. this.sendOpcode(GatewayOpCodes.VOICE_STATE_UPDATE, { guild_id, channel_id, self_mute: false, self_deaf: false, - self_video: true, + self_video: false, }); this.sendOpcode(GatewayOpCodes.STREAM_CREATE, { type, diff --git a/services/discord-gateway/src/modules/voice-recording/screenShareController.ts b/services/discord-gateway/src/modules/voice-recording/screenShareController.ts index 2916aad..62bbada 100644 --- a/services/discord-gateway/src/modules/voice-recording/screenShareController.ts +++ b/services/discord-gateway/src/modules/voice-recording/screenShareController.ts @@ -105,7 +105,11 @@ export class ScreenShareController { frameRate: 30, bitrateVideo: 2500, bitrateVideoMax: 4000, - includeAudio: true, + // Video-only GoLive: the -f h264 output muxer cannot carry audio + // ("h264 muxer does not support any stream of type audio" → header + // write fails → empty stdout → demux 'Invalid data' → black tile). + // Audio is not delivered by the GoLive demux path anyway. + includeAudio: false, videoCodec: normalizeVideoCodec("H264"), }); const { command } = prepared;