From d3dee3a19967e67c622fea7d8fe8c87cd7bf1eaa Mon Sep 17 00:00:00 2001 From: Brett Jia Date: Thu, 15 Feb 2024 14:27:09 -0500 Subject: [PATCH] webrtc: repacketize h264 (#1260) * webrtc: repacketize h264 on nalu type 7 * always repacketize * lower packet size to avoid uint16 overflows * remove nalu logging * Revert "remove nalu logging" This reverts commit e6b65406967cdf491c61bb9ed33a401c8eadd0b1. --- plugins/webrtc/src/wrtc-to-rtsp.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/webrtc/src/wrtc-to-rtsp.ts b/plugins/webrtc/src/wrtc-to-rtsp.ts index 1b8d2cdb2..74b1431a5 100644 --- a/plugins/webrtc/src/wrtc-to-rtsp.ts +++ b/plugins/webrtc/src/wrtc-to-rtsp.ts @@ -10,6 +10,7 @@ import { logConnectionState, waitClosed, waitConnected, waitIceConnected } from import { startRtpForwarderProcess } from "./rtp-forwarders"; import { getFFmpegRtpAudioOutputArguments, requiredAudioCodecs, requiredVideoCodec } from "./webrtc-required-codecs"; import { createRawResponse, getWeriftIceServers, isPeerConnectionAlive } from "./werift-util"; +import { H264Repacketizer } from "../../homekit/src/types/camera/h264-packetizer"; const { mediaManager } = sdk; @@ -105,6 +106,8 @@ export async function createRTCPeerConnectionSource(options: { }; const setupVideoTransceiver = (transceiver: RTCRtpTransceiver) => { + const videoPacketSize = 64000; + let h264Repacketizer = new H264Repacketizer(console, videoPacketSize - 12) const videoTransceiver = transceiver; videoTransceiver.mid = '1'; videoTransceiver.onTrack.subscribe((track) => { @@ -116,7 +119,10 @@ export async function createRTCPeerConnectionSource(options: { const naluTypes = getNaluTypesInNalu(rtp.payload); console.log('video packet types', ...[...naluTypes]); } - rtspServer.sendTrack(videoTrack, rtp.serialize(), false); + const repacketized = h264Repacketizer.repacketize(rtp); + for (const packet of repacketized) { + rtspServer.sendTrack(videoTrack, packet.serialize(), false); + } }); track.onReceiveRtcp.subscribe(rtp => rtspServer.sendTrack(videoTrack, rtp.serialize(), true));