diff --git a/plugins/webrtc/src/ffmpeg-to-wrtc.ts b/plugins/webrtc/src/ffmpeg-to-wrtc.ts index 1e0471c23..df755c414 100644 --- a/plugins/webrtc/src/ffmpeg-to-wrtc.ts +++ b/plugins/webrtc/src/ffmpeg-to-wrtc.ts @@ -236,6 +236,7 @@ export async function createRTCPeerConnectionSink( const audioTranscodeArguments = getFFmpegRtpAudioOutputArguments(ffmpegInput.mediaStreamOptions?.audio?.codec, audioTransceiver.sender.codec, maximumCompatibilityMode); + let needPacketization = !transcode; if (transcode) { try { const transcodeStream: FFmpegTranscodeStream = await sdk.mediaManager.convertMediaObject(mo, ScryptedMimeTypes.FFmpegTranscodeStream); @@ -247,6 +248,7 @@ export async function createRTCPeerConnectionSink( videoTranscodeArguments.splice(0, videoTranscodeArguments.length); videoCodecCopy = 'copy'; audioCodecCopy = 'copy'; + needPacketization = true; } catch (e) { } @@ -269,14 +271,19 @@ export async function createRTCPeerConnectionSink( packetSize: videoPacketSize, onMSection: (videoSection) => spsPps = getSpsPps(videoSection), onRtp: (buffer) => { - if (!h264Repacketizer) { - h264Repacketizer = new H264Repacketizer(console, videoPacketSize, { - ...spsPps, - }); + if (needPacketization) { + if (!h264Repacketizer) { + h264Repacketizer = new H264Repacketizer(console, videoPacketSize, { + ...spsPps, + }); + } + const repacketized = h264Repacketizer.repacketize(RtpPacket.deSerialize(buffer)); + for (const packet of repacketized) { + videoTransceiver.sender.sendRtp(packet); + } } - const repacketized = h264Repacketizer.repacketize(RtpPacket.deSerialize(buffer)); - for (const packet of repacketized) { - videoTransceiver.sender.sendRtp(packet); + else { + videoTransceiver.sender.sendRtp(buffer); } }, encoderArguments: [ diff --git a/plugins/webrtc/src/rtp-forwarders.ts b/plugins/webrtc/src/rtp-forwarders.ts index c4cd0a93e..ca803304f 100644 --- a/plugins/webrtc/src/rtp-forwarders.ts +++ b/plugins/webrtc/src/rtp-forwarders.ts @@ -54,13 +54,14 @@ function attachTrackDgram(track: RtpTrack, server: dgram.Socket) { server?.on('message', createPacketDelivery(track)); } -async function setupRtspClient(rtspClient: RtspClient, channel: number, section: MSection, deliver: ReturnType) { +async function setupRtspClient(console: Console, rtspClient: RtspClient, channel: number, section: MSection, deliver: ReturnType) { try { await rtspClient.setup({ type: 'udp', path: section.control, onRtp: (rtspHeader, rtp) => deliver(rtp), }); + console.log('rtsp/udp', section.codec); } catch (e) { if (!(e instanceof RtspStatusError)) @@ -71,6 +72,7 @@ async function setupRtspClient(rtspClient: RtspClient, channel: number, section: path: section.control, onRtp: (rtspHeader, rtp) => deliver(rtp), }); + console.log('rtsp/tcp', section.codec); } } @@ -80,6 +82,7 @@ export async function createTrackForwarders(console: Console, rtpTracks: RtpTrac for (const key of Object.keys(rtpTracks)) { const track: RtpTrack = rtpTracks[key]; track.bind = await createBindZero(); + track.bind.server.setRecvBufferSize(1024 * 1024); const { server, port } = track.bind; sockets[key] = server; const outputArguments = track.outputArguments = []; @@ -153,7 +156,7 @@ export async function startRtpForwarderProcess(console: Console, ffmpegInput: FF videoSectionDeferred.resolve(videoSection); let channel = 0; - await setupRtspClient(rtspClient, channel, videoSection, createPacketDelivery(video)); + await setupRtspClient(console, rtspClient, channel, videoSection, createPacketDelivery(video)); channel += 2; const audioSection = parsedSdp.msections.find(msection => msection.type === 'audio' && (msection.codec === audioCodec || audioCodec === 'copy')); @@ -168,7 +171,7 @@ export async function startRtpForwarderProcess(console: Console, ffmpegInput: FF audioSectionDeferred.resolve(audioSection); - await setupRtspClient(rtspClient, channel, audioSection, createPacketDelivery(audio)); + await setupRtspClient(console, rtspClient, channel, audioSection, createPacketDelivery(audio)); channel += 2; } else {