webrtc: ffmpeg packetization fast path

This commit is contained in:
Koushik Dutta
2022-08-09 12:19:00 -07:00
parent 6e0bd51156
commit 67ca3946c8
2 changed files with 20 additions and 10 deletions

View File

@@ -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: [

View File

@@ -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<typeof createPacketDelivery>) {
async function setupRtspClient(console: Console, rtspClient: RtspClient, channel: number, section: MSection, deliver: ReturnType<typeof createPacketDelivery>) {
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 {