webrtc: fix always transcode bug

This commit is contained in:
Koushik Dutta
2022-07-28 14:17:23 -07:00
parent a90c114643
commit b285c4a11e
2 changed files with 37 additions and 39 deletions

View File

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

View File

@@ -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<void>();
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<RtspServer>();
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,
}