From b285c4a11e568ec1bef0f01bc54a7aff6e4cf697 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Thu, 28 Jul 2022 14:17:23 -0700 Subject: [PATCH] webrtc: fix always transcode bug --- plugins/webrtc/src/ffmpeg-to-wrtc.ts | 26 ++++++++------- plugins/webrtc/src/rtp-forwarders.ts | 50 +++++++++++++--------------- 2 files changed, 37 insertions(+), 39 deletions(-) diff --git a/plugins/webrtc/src/ffmpeg-to-wrtc.ts b/plugins/webrtc/src/ffmpeg-to-wrtc.ts index 33766613c..0db9111b4 100644 --- a/plugins/webrtc/src/ffmpeg-to-wrtc.ts +++ b/plugins/webrtc/src/ffmpeg-to-wrtc.ts @@ -198,7 +198,7 @@ export async function createRTCPeerConnectionSink( videoTranscodeArguments.push(...(ffmpegInput.h264FilterArguments || [])); if (transcode) { - const conservativeDefaultBitrate = 500000; + const conservativeDefaultBitrate = isPrivate ? 1000000 : 500000; const bitrate = maximumCompatibilityMode ? conservativeDefaultBitrate : (ffmpegInput.destinationVideoBitrate || conservativeDefaultBitrate); videoTranscodeArguments.push( // this seems to cause issues with presets i think. @@ -236,17 +236,19 @@ export async function createRTCPeerConnectionSink( const audioTranscodeArguments = getFFmpegRtpAudioOutputArguments(ffmpegInput.mediaStreamOptions?.audio?.codec, audioTransceiver.sender.codec, maximumCompatibilityMode); - try { - const transcodeStream: FFmpegTranscodeStream = await sdk.mediaManager.convertMediaObject(mo, ScryptedMimeTypes.FFmpegTranscodeStream); - await transcodeStream({ - videoTranscodeArguments, - audioTranscodeArguments, - }); - videoTranscodeArguments.splice(0, videoTranscodeArguments.length); - videoCodecCopy = 'copy'; - audioCodecCopy = 'copy'; - } - catch (e) { + if (transcode) { + try { + const transcodeStream: FFmpegTranscodeStream = await sdk.mediaManager.convertMediaObject(mo, ScryptedMimeTypes.FFmpegTranscodeStream); + await transcodeStream({ + videoTranscodeArguments, + audioTranscodeArguments, + }); + videoTranscodeArguments.splice(0, videoTranscodeArguments.length); + videoCodecCopy = 'copy'; + audioCodecCopy = 'copy'; + } + catch (e) { + } } const audioRtpTrack: RtpTrack = { diff --git a/plugins/webrtc/src/rtp-forwarders.ts b/plugins/webrtc/src/rtp-forwarders.ts index 22eae694a..06da3b3aa 100644 --- a/plugins/webrtc/src/rtp-forwarders.ts +++ b/plugins/webrtc/src/rtp-forwarders.ts @@ -103,7 +103,7 @@ export async function startRtpForwarderProcess(console: Console, ffmpegInput: FF delete rtpTracks.video; - rtspClient = new RtspClient(ffmpegInput.url, console); + rtspClient = new RtspClient(ffmpegInput.url); rtspClient.requestTimeout = 10000; try { @@ -219,12 +219,25 @@ export async function startRtpForwarderProcess(console: Console, ffmpegInput: FF const forwarders = await createTrackForwarders(console, rtpTracks); + + let killDeferred = new Deferred(); + const kill = () => { + killDeferred.resolve(undefined); + for (const socket of sockets) { + closeQuiet(socket); + } + sockets = []; + forwarders.close(); + rtspClient?.safeTeardown(); + }; + rtspClient?.client.on('close', kill); + const useRtp = !rtspMode; const rtspServerDeferred = new Deferred(); - let cp: ChildProcess; // will no op if there's no tracks if (Object.keys(rtpTracks).length) { + let cp: ChildProcess; if (useRtp) { rtspServerDeferred.resolve(undefined); @@ -292,8 +305,11 @@ export async function startRtpForwarderProcess(console: Console, ffmpegInput: FF ); serverPort.clientPromise.then(async (client) => { + client.on('close', kill); + killDeferred.promise.finally(() => client.destroy()); + const rtspServer = new RtspServer(client, undefined, useUdp); - rtspServer.console = console; + // rtspServer.console = console; await rtspServer.handleSetup(['announce']); const { videoSection, audioSection } = reportTranscodedSections(rtspServer.sdp); @@ -330,6 +346,8 @@ export async function startRtpForwarderProcess(console: Console, ffmpegInput: FF cp = child_process.spawn(await mediaManager.getFFmpegPath(), args, { stdio: ['pipe', 'pipe', 'pipe', 'pipe', 'pipe'], }); + cp.on('exit', kill); + killDeferred.promise.finally(() => safeKillFFmpeg(cp)); if (pipeSdp) { const pipe = cp.stdio[3] as Writable; pipe.write(pipeSdp); @@ -349,28 +367,6 @@ export async function startRtpForwarderProcess(console: Console, ffmpegInput: FF console.log('bypassing ffmpeg, perfect codecs'); } - let killed = false; - const kill = () => { - if (killed) - return; - killed = true; - for (const socket of sockets) { - closeQuiet(socket); - } - sockets = []; - forwarders.close(); - safeKillFFmpeg(cp); - rtspClient?.safeTeardown(); - }; - const killPromise = new Promise(resolve => { - const resolveKill = () => { - kill(); - resolve(undefined); - } - rtspClient?.client.on('close', resolveKill); - cp?.on('exit', resolveKill); - }); - process.nextTick(() => { rtspClient?.readLoop().catch(() => { }).finally(kill); }); @@ -380,9 +376,9 @@ export async function startRtpForwarderProcess(console: Console, ffmpegInput: FF videoSection: videoSectionDeferred.promise, audioSection: audioSectionDeferred.promise, kill, - killPromise, + killPromise: killDeferred.promise, get killed() { - return killed; + return killDeferred.finished; }, ...forwarders, }