mirror of
https://github.com/koush/scrypted.git
synced 2026-02-11 01:32:02 +00:00
webrtc: ffmpeg packetization fast path
This commit is contained in:
@@ -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: [
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user