homebridge-unifi-protect 6.22.0 → 7.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -29
- package/config.schema.json +5 -15
- package/dist/devices/protect-camera-package.d.ts +0 -2
- package/dist/devices/protect-camera-package.js +4 -12
- package/dist/devices/protect-camera-package.js.map +1 -1
- package/dist/devices/protect-camera.d.ts +2 -3
- package/dist/devices/protect-camera.js +35 -124
- package/dist/devices/protect-camera.js.map +1 -1
- package/dist/devices/protect-chime.js +2 -6
- package/dist/devices/protect-chime.js.map +1 -1
- package/dist/devices/protect-device.d.ts +10 -6
- package/dist/devices/protect-device.js +23 -22
- package/dist/devices/protect-device.js.map +1 -1
- package/dist/devices/protect-doorbell.d.ts +0 -2
- package/dist/devices/protect-doorbell.js +41 -60
- package/dist/devices/protect-doorbell.js.map +1 -1
- package/dist/devices/protect-light.js +1 -3
- package/dist/devices/protect-light.js.map +1 -1
- package/dist/devices/protect-liveviews.js +2 -1
- package/dist/devices/protect-liveviews.js.map +1 -1
- package/dist/devices/protect-nvr-systeminfo.js +1 -1
- package/dist/devices/protect-nvr-systeminfo.js.map +1 -1
- package/dist/devices/protect-securitysystem.js +4 -4
- package/dist/devices/protect-securitysystem.js.map +1 -1
- package/dist/devices/protect-sensor.js +2 -6
- package/dist/devices/protect-sensor.js.map +1 -1
- package/dist/devices/protect-viewer.js +1 -1
- package/dist/devices/protect-viewer.js.map +1 -1
- package/dist/ffmpeg/protect-ffmpeg-codecs.js.map +1 -1
- package/dist/ffmpeg/protect-ffmpeg-exec.js +1 -1
- package/dist/ffmpeg/protect-ffmpeg-exec.js.map +1 -1
- package/dist/ffmpeg/protect-ffmpeg-options.js +2 -19
- package/dist/ffmpeg/protect-ffmpeg-options.js.map +1 -1
- package/dist/ffmpeg/protect-ffmpeg-record.js +2 -1
- package/dist/ffmpeg/protect-ffmpeg-record.js.map +1 -1
- package/dist/ffmpeg/protect-ffmpeg-stream.js +14 -8
- package/dist/ffmpeg/protect-ffmpeg-stream.js.map +1 -1
- package/dist/ffmpeg/protect-ffmpeg.d.ts +2 -2
- package/dist/ffmpeg/protect-ffmpeg.js.map +1 -1
- package/dist/protect-events.d.ts +1 -3
- package/dist/protect-events.js +38 -43
- package/dist/protect-events.js.map +1 -1
- package/dist/protect-livestream.d.ts +12 -0
- package/dist/protect-livestream.js +63 -0
- package/dist/protect-livestream.js.map +1 -0
- package/dist/protect-nvr.d.ts +7 -11
- package/dist/protect-nvr.js +15 -61
- package/dist/protect-nvr.js.map +1 -1
- package/dist/protect-options.d.ts +8 -23
- package/dist/protect-options.js +4 -128
- package/dist/protect-options.js.map +1 -1
- package/dist/protect-platform.d.ts +2 -4
- package/dist/protect-platform.js +3 -28
- package/dist/protect-platform.js.map +1 -1
- package/dist/protect-record.d.ts +4 -3
- package/dist/protect-record.js +23 -29
- package/dist/protect-record.js.map +1 -1
- package/dist/protect-snapshot.d.ts +2 -2
- package/dist/protect-snapshot.js +7 -3
- package/dist/protect-snapshot.js.map +1 -1
- package/dist/protect-stream.d.ts +3 -4
- package/dist/protect-stream.js +116 -98
- package/dist/protect-stream.js.map +1 -1
- package/dist/protect-timeshift.d.ts +16 -10
- package/dist/protect-timeshift.js +88 -51
- package/dist/protect-timeshift.js.map +1 -1
- package/dist/protect-types.d.ts +0 -7
- package/dist/protect-types.js +0 -1
- package/dist/protect-types.js.map +1 -1
- package/dist/settings.d.ts +2 -1
- package/dist/settings.js +4 -2
- package/dist/settings.js.map +1 -1
- package/homebridge-ui/public/index.html +42 -21
- package/homebridge-ui/public/lib/featureoptions.js +376 -0
- package/homebridge-ui/public/lib/featureoptions.js.map +1 -0
- package/homebridge-ui/public/lib/webUi-featureoptions.mjs +836 -0
- package/homebridge-ui/public/lib/webUi.mjs +184 -0
- package/homebridge-ui/public/ui.mjs +213 -124
- package/homebridge-ui/server.js +13 -52
- package/package.json +22 -21
- package/dist/protect-mqtt.d.ts +0 -20
- package/dist/protect-mqtt.js +0 -177
- package/dist/protect-mqtt.js.map +0 -1
- package/dist/protect-rtp.d.ts +0 -26
- package/dist/protect-rtp.js +0 -180
- package/dist/protect-rtp.js.map +0 -1
- package/homebridge-ui/public/lib/featureoptions.mjs +0 -201
- package/homebridge-ui/public/protect-featureoptions.mjs +0 -736
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protect-record.js","sourceRoot":"","sources":["../src/protect-record.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"protect-record.js","sourceRoot":"","sources":["../src/protect-record.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { SnapshotRequest } from "homebridge";
|
|
3
|
+
import { HomebridgePluginLogging } from "homebridge-plugin-utils";
|
|
3
4
|
import { ProtectCamera } from "./devices/index.js";
|
|
4
|
-
import { ProtectLogging } from "./protect-types.js";
|
|
5
5
|
import { ProtectPlatform } from "./protect-platform.js";
|
|
6
6
|
export declare class ProtectSnapshot {
|
|
7
7
|
private readonly api;
|
|
8
8
|
private readonly hap;
|
|
9
|
-
readonly log:
|
|
9
|
+
readonly log: HomebridgePluginLogging;
|
|
10
10
|
private readonly nvr;
|
|
11
11
|
readonly platform: ProtectPlatform;
|
|
12
12
|
readonly protectCamera: ProtectCamera;
|
package/dist/protect-snapshot.js
CHANGED
|
@@ -129,7 +129,7 @@ export class ProtectSnapshot {
|
|
|
129
129
|
// -nostats Suppress printing progress reports while encoding in FFmpeg.
|
|
130
130
|
// -fflags flags Set the format flags to generate a presentation timestamp if it's missing and discard any corrupt packets rather than exit.
|
|
131
131
|
// -frames:v 1 Extract a single video frame for the output.
|
|
132
|
-
// -q:v
|
|
132
|
+
// -q:v 2 Set the quality output of the JPEG output.
|
|
133
133
|
const ffmpegOptions = [
|
|
134
134
|
"-hide_banner",
|
|
135
135
|
"-nostats",
|
|
@@ -140,9 +140,13 @@ export class ProtectSnapshot {
|
|
|
140
140
|
];
|
|
141
141
|
// If we've specified dimensions, scale the snapshot.
|
|
142
142
|
if (request) {
|
|
143
|
-
//
|
|
143
|
+
// Video filter options we use for -filter:v are:
|
|
144
|
+
//
|
|
145
|
+
// select Select only keyframes. These will be full images and avoid potential image corruption, especially in HEVC use cases.
|
|
146
|
+
// scale= Scale the image down, if needed, but never upscale it, preserving aspect ratios and letterboxing where needed.
|
|
144
147
|
ffmpegOptions.push("-filter:v", [
|
|
145
|
-
"
|
|
148
|
+
"select=eq(pict_type\\,I)," +
|
|
149
|
+
"scale=" + request.width.toString(), request.height.toString(),
|
|
146
150
|
"force_original_aspect_ratio=decrease,pad=" + request.width.toString(), request.height.toString(),
|
|
147
151
|
"(ow-iw)/2", "(oh-ih)/2"
|
|
148
152
|
].join(":"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protect-snapshot.js","sourceRoot":"","sources":["../src/protect-snapshot.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"protect-snapshot.js","sourceRoot":"","sources":["../src/protect-snapshot.ts"],"names":[],"mappings":"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"}
|
package/dist/protect-stream.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CameraController, CameraStreamingDelegate, PrepareStreamCallback, PrepareStreamRequest, SnapshotRequest, SnapshotRequestCallback, StreamRequestCallback, StreamingRequest } from "homebridge";
|
|
2
2
|
import { FfmpegOptions } from "./ffmpeg/index.js";
|
|
3
|
+
import { HomebridgePluginLogging } from "homebridge-plugin-utils";
|
|
3
4
|
import { ProtectCamera } from "./devices/index.js";
|
|
4
|
-
import { ProtectLogging } from "./protect-types.js";
|
|
5
5
|
import { ProtectPlatform } from "./protect-platform.js";
|
|
6
6
|
import { ProtectRecordingDelegate } from "./protect-record.js";
|
|
7
7
|
export declare class ProtectStreamingDelegate implements CameraStreamingDelegate {
|
|
@@ -10,7 +10,7 @@ export declare class ProtectStreamingDelegate implements CameraStreamingDelegate
|
|
|
10
10
|
readonly ffmpegOptions: FfmpegOptions;
|
|
11
11
|
private readonly hap;
|
|
12
12
|
hksv: ProtectRecordingDelegate | null;
|
|
13
|
-
readonly log:
|
|
13
|
+
readonly log: HomebridgePluginLogging;
|
|
14
14
|
private readonly nvr;
|
|
15
15
|
private ongoingSessions;
|
|
16
16
|
private pendingSessions;
|
|
@@ -19,10 +19,9 @@ export declare class ProtectStreamingDelegate implements CameraStreamingDelegate
|
|
|
19
19
|
private probesizeOverride;
|
|
20
20
|
private probesizeOverrideCount;
|
|
21
21
|
private probesizeOverrideTimeout?;
|
|
22
|
-
private rtspEntry;
|
|
23
|
-
private savedBitrate;
|
|
24
22
|
private snapshot;
|
|
25
23
|
verboseFfmpeg: boolean;
|
|
24
|
+
private abTest;
|
|
26
25
|
constructor(protectCamera: ProtectCamera, resolutions: [number, number, number][]);
|
|
27
26
|
handleSnapshotRequest(request?: SnapshotRequest, callback?: SnapshotRequestCallback): Promise<void>;
|
|
28
27
|
prepareStream(request: PrepareStreamRequest, callback: PrepareStreamCallback): Promise<void>;
|
package/dist/protect-stream.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { FfmpegOptions, FfmpegStreamingProcess } from "./ffmpeg/index.js";
|
|
2
|
+
import { RtpDemuxer } from "homebridge-plugin-utils";
|
|
2
3
|
import { PROTECT_FFMPEG_AUDIO_FILTER_FFTNR, PROTECT_HKSV_SEGMENT_LENGTH, PROTECT_HKSV_TIMESHIFT_BUFFER_MAXLENGTH, PROTECT_HOMEKIT_IDR_INTERVAL } from "./settings.js";
|
|
3
4
|
import { ProtectRecordingDelegate } from "./protect-record.js";
|
|
4
5
|
import { ProtectSnapshot } from "./protect-snapshot.js";
|
|
5
|
-
import { RtpDemuxer } from "./protect-rtp.js";
|
|
6
6
|
import WebSocket from "ws";
|
|
7
7
|
import { once } from "node:events";
|
|
8
8
|
// Camera streaming delegate implementation for Protect.
|
|
@@ -21,10 +21,9 @@ export class ProtectStreamingDelegate {
|
|
|
21
21
|
probesizeOverride;
|
|
22
22
|
probesizeOverrideCount;
|
|
23
23
|
probesizeOverrideTimeout;
|
|
24
|
-
rtspEntry;
|
|
25
|
-
savedBitrate;
|
|
26
24
|
snapshot;
|
|
27
25
|
verboseFfmpeg;
|
|
26
|
+
abTest = true;
|
|
28
27
|
// Create an instance of a HomeKit streaming delegate.
|
|
29
28
|
constructor(protectCamera, resolutions) {
|
|
30
29
|
this.api = protectCamera.api;
|
|
@@ -38,8 +37,6 @@ export class ProtectStreamingDelegate {
|
|
|
38
37
|
this.platform = protectCamera.platform;
|
|
39
38
|
this.probesizeOverride = 0;
|
|
40
39
|
this.probesizeOverrideCount = 0;
|
|
41
|
-
this.rtspEntry = null;
|
|
42
|
-
this.savedBitrate = 0;
|
|
43
40
|
this.verboseFfmpeg = false;
|
|
44
41
|
// Configure our hardware acceleration support.
|
|
45
42
|
this.ffmpegOptions = new FfmpegOptions(protectCamera);
|
|
@@ -145,7 +142,7 @@ export class ProtectStreamingDelegate {
|
|
|
145
142
|
callback(undefined, snapshot);
|
|
146
143
|
}
|
|
147
144
|
// Publish the snapshot as a data URL to MQTT, if configured.
|
|
148
|
-
this.nvr.mqtt?.publish(this.protectCamera.
|
|
145
|
+
this.nvr.mqtt?.publish(this.protectCamera.ufp.mac, "snapshot", "data:image/jpeg;base64," + snapshot.toString("base64"));
|
|
149
146
|
}
|
|
150
147
|
// Prepare to launch the video stream.
|
|
151
148
|
async prepareStream(request, callback) {
|
|
@@ -189,7 +186,7 @@ export class ProtectStreamingDelegate {
|
|
|
189
186
|
let talkBack = null;
|
|
190
187
|
if (hasAudioSupport && this.protectCamera.hints.twoWayAudio) {
|
|
191
188
|
// Setup the RTP demuxer for two-way audio scenarios.
|
|
192
|
-
rtpDemuxer = new RtpDemuxer(
|
|
189
|
+
rtpDemuxer = new RtpDemuxer(request.addressVersion, audioIncomingPort, audioIncomingRtcpPort, audioIncomingRtpPort, this.log);
|
|
193
190
|
// Request the talkback websocket from the controller.
|
|
194
191
|
const params = new URLSearchParams({ camera: this.protectCamera.ufp.id });
|
|
195
192
|
talkBack = await this.nvr.ufpApi.getWsEndpoint("talkback", params);
|
|
@@ -252,7 +249,7 @@ export class ProtectStreamingDelegate {
|
|
|
252
249
|
// Launch the Protect video (and audio) stream.
|
|
253
250
|
async startStream(request, callback) {
|
|
254
251
|
const sessionInfo = this.pendingSessions[request.sessionID];
|
|
255
|
-
const sdpIpVersion = sessionInfo.addressVersion === "ipv6" ? "IP6
|
|
252
|
+
const sdpIpVersion = sessionInfo.addressVersion === "ipv6" ? "IP6" : "IP4";
|
|
256
253
|
// If we aren't connected, we're done.
|
|
257
254
|
if (!this.protectCamera.isOnline) {
|
|
258
255
|
const errorMessage = "Unable to start video stream: the camera is offline or unavailable.";
|
|
@@ -267,17 +264,24 @@ export class ProtectStreamingDelegate {
|
|
|
267
264
|
// 3. We are on a high latency streaming session (e.g. cellular). If we're high latency, we'll transcode by default unless the user has asked us not to. Why? It
|
|
268
265
|
// generally results in a speedier experience, at the expense of some stream quality (HomeKit tends to request far lower bitrates than Protect is capable of
|
|
269
266
|
// producing).
|
|
267
|
+
// 4. The codec in use on the Protect camera isn't H.264.
|
|
270
268
|
//
|
|
271
269
|
// How do we determine if we're a high latency connection? We look at the RTP packet time of the audio packet time for a hint. HomeKit uses values of 20, 30, 40,
|
|
272
270
|
// and 60ms. We make an assumption, validated by lots of real-world testing, that when we see 60ms used by HomeKit, it's a high latency connection and act
|
|
273
271
|
// accordingly.
|
|
274
272
|
const isHighLatency = request.audio.packet_time >= 60;
|
|
275
|
-
const isTranscoding = this.protectCamera.hints.transcode || this.protectCamera.hints.crop || (isHighLatency && this.protectCamera.hints.transcodeHighLatency)
|
|
273
|
+
const isTranscoding = this.protectCamera.hints.transcode || this.protectCamera.hints.crop || (isHighLatency && this.protectCamera.hints.transcodeHighLatency) ||
|
|
274
|
+
(this.protectCamera.ufp.videoCodec !== "h264");
|
|
276
275
|
// Set the initial bitrate we should use for this request based on what HomeKit is requesting.
|
|
277
276
|
let targetBitrate = request.video.max_bit_rate;
|
|
277
|
+
// Override the stream quality selection if we know they're problematic on the Protect controller.
|
|
278
|
+
const overrideStream = this.protectCamera.hints.apiStreaming && ["AI Pro", "G4 Pro"].includes(this.protectCamera.ufp.marketName);
|
|
279
|
+
let rtspEntry;
|
|
278
280
|
// Find the best RTSP stream based on what we're looking for.
|
|
279
281
|
if (isTranscoding) {
|
|
280
|
-
|
|
282
|
+
// If we have hardware transcoding enabled, we treat it uniquely and get the highest quality stream we can. Fixed-function hardware transcoders tend to perform
|
|
283
|
+
// better with higher bitrate sources. Wel also want to generally bias ourselves toward higher quality streams where possible.
|
|
284
|
+
rtspEntry = this.protectCamera.findRtsp((this.protectCamera.hints.hardwareTranscoding || overrideStream) ? 3840 : request.video.width, (this.protectCamera.hints.hardwareTranscoding || overrideStream) ? 2160 : request.video.height, { biasHigher: true, maxPixels: this.ffmpegOptions.hostSystemMaxPixels });
|
|
281
285
|
// If we have specified the bitrates we want to use when transcoding, let's honor those here.
|
|
282
286
|
if (isHighLatency && (this.protectCamera.hints.transcodeHighLatencyBitrate > 0)) {
|
|
283
287
|
targetBitrate = this.protectCamera.hints.transcodeHighLatencyBitrate;
|
|
@@ -286,91 +290,77 @@ export class ProtectStreamingDelegate {
|
|
|
286
290
|
targetBitrate = this.protectCamera.hints.transcodeBitrate;
|
|
287
291
|
}
|
|
288
292
|
// If we're targeting a bitrate that's beyond the capabilities of our input channel, match the bitrate of the input channel.
|
|
289
|
-
if (
|
|
290
|
-
targetBitrate =
|
|
293
|
+
if (rtspEntry && (targetBitrate > (rtspEntry.channel.bitrate / 1000))) {
|
|
294
|
+
targetBitrate = rtspEntry.channel.bitrate / 1000;
|
|
291
295
|
}
|
|
292
296
|
}
|
|
293
297
|
else {
|
|
294
|
-
|
|
298
|
+
rtspEntry = this.protectCamera.findRtsp(overrideStream ? 3840 : request.video.width, overrideStream ? 2160 : request.video.height);
|
|
295
299
|
}
|
|
296
|
-
if (!
|
|
300
|
+
if (!rtspEntry) {
|
|
297
301
|
const errorMessage = "Unable to start video stream: no valid RTSP stream profile was found.";
|
|
298
302
|
this.log.error("%s %sx%s, %s fps, %s kbps.", errorMessage, request.video.width, request.video.height, request.video.fps, request.video.max_bit_rate.toLocaleString("en-US"));
|
|
299
303
|
callback(new Error(this.protectCamera.name + ": " + errorMessage));
|
|
300
304
|
return;
|
|
301
305
|
}
|
|
302
|
-
//
|
|
303
|
-
|
|
304
|
-
this.savedBitrate = this.protectCamera.getBitrate(this.rtspEntry.channel.id);
|
|
305
|
-
if (this.savedBitrate < 0) {
|
|
306
|
-
this.savedBitrate = 0;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
// Set the desired bitrate in Protect. We don't need to for this to return, because Protect
|
|
310
|
-
// will adapt the stream once it processes the configuration change.
|
|
311
|
-
await this.protectCamera.setBitrate(this.rtspEntry.channel.id, targetBitrate * 1000);
|
|
312
|
-
// Set our packet size to be 564. Why? MPEG transport stream (TS) packets are 188 bytes in size each.
|
|
313
|
-
// These packets transmit the video data that you ultimately see on your screen and are transmitted using
|
|
314
|
-
// UDP. Each UDP packet is 1316 bytes in size, before being encapsulated in IP. We want to get as many
|
|
315
|
-
// TS packets as we can, within reason, in those UDP packets. This translates to 1316 / 188 = 7 TS packets
|
|
316
|
-
// as a limit of what can be pushed through a single UDP packet. Here's the problem...you need to have
|
|
317
|
-
// enough data to fill that pipe, all the time. Network latency, FFmpeg overhead, and the speed / quality of
|
|
318
|
-
// the original camera stream all play a role here, and as you can imagine, there's a nearly endless set of
|
|
319
|
-
// combinations to decide how to best fill that pipe. Set it too low, and you're incurring extra overhead by
|
|
320
|
-
// pushing less video data to clients in each packet, though you're increasing interactivity by getting
|
|
321
|
-
// whatever data you have to the end user. Set it too high, and startup latency becomes unacceptable
|
|
322
|
-
// when you begin a stream.
|
|
306
|
+
// If we have the timeshift buffer enabled, and it's the right quality channel, we use that as our livestream source. Otherwise, we revert to the RTSP stream from the
|
|
307
|
+
// Protect controller. Using the timeshift buffer has a few advantages.
|
|
323
308
|
//
|
|
324
|
-
//
|
|
325
|
-
//
|
|
326
|
-
//
|
|
309
|
+
// - Typically, we have several seconds of video already queued up in the timeshift buffer, the FFmpeg startup process will get a significant speed up in performance.
|
|
310
|
+
// FFmpeg takes time at the beginning of each session to analyze the input before allowing you to perform any action. By using the timeshift buffer, we're able to
|
|
311
|
+
// give FFmpeg all that data right at the beginning, effectively reducing that startup time to the point of being imperceptible.
|
|
327
312
|
//
|
|
328
|
-
//
|
|
329
|
-
//
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
const audiomtu = 188 * 1;
|
|
313
|
+
// - Since we are using an already existing connection to the Protect controller, we don't need to create another connection which incurs an additional delay, as well
|
|
314
|
+
// as a resource hit on the Protect controller.
|
|
315
|
+
const useApi = this.protectCamera.hints.apiStreaming && this.protectCamera.hints.timeshift &&
|
|
316
|
+
(!this.protectCamera.hints.streamingDefault || (this.protectCamera.hints.streamingDefault.toLowerCase() === this.hksv?.rtspEntry?.channel.name.toLowerCase()));
|
|
333
317
|
// -hide_banner Suppress printing the startup banner in FFmpeg.
|
|
334
318
|
// -nostats Suppress printing progress reports while encoding in FFmpeg.
|
|
335
319
|
// -fflags flags Set format flags to discard any corrupt packets rather than exit.
|
|
336
|
-
// -probesize number How many bytes should be analyzed for stream information.
|
|
337
320
|
// -max_delay 500000 Set an upper limit on how much time FFmpeg can take in demuxing packets, in microseconds.
|
|
338
321
|
// -flags low_delay Tell FFmpeg to optimize for low delay / realtime decoding.
|
|
339
|
-
// -avioflags direct Tell FFmpeg to minimize buffering to reduce latency for more realtime processing.
|
|
340
|
-
// -r fps Set the input frame rate for the video stream.
|
|
341
|
-
// -rtsp_transport tcp Tell the RTSP stream handler that we're looking for a TCP connection.
|
|
342
|
-
// -i this.rtspEntry.url RTSPS URL to get our input stream from.
|
|
343
|
-
// -map 0:v:0 selects the first available video track from the stream. Protect actually maps audio
|
|
344
|
-
// and video tracks in opposite locations from where FFmpeg typically expects them. This
|
|
345
|
-
// setting is a more general solution than naming the track locations directly in case
|
|
346
|
-
// Protect changes this in the future.
|
|
347
322
|
//
|
|
348
323
|
// Yes, we included these above as well: they need to be included for each I/O stream to maximize effectiveness it seems.
|
|
349
324
|
const ffmpegArgs = [
|
|
350
325
|
"-hide_banner",
|
|
351
326
|
"-nostats",
|
|
352
|
-
"-fflags", "+discardcorrupt",
|
|
327
|
+
"-fflags", "+discardcorrupt+genpts",
|
|
353
328
|
...this.ffmpegOptions.videoDecoder,
|
|
354
|
-
"-probesize", this.probesize.toString(),
|
|
355
329
|
"-max_delay", "500000",
|
|
356
330
|
"-flags", "low_delay",
|
|
357
|
-
"-
|
|
358
|
-
"-
|
|
359
|
-
"-rtsp_transport", "tcp",
|
|
360
|
-
"-i", this.rtspEntry.url,
|
|
361
|
-
"-map", "0:v:0"
|
|
331
|
+
"-copyts",
|
|
332
|
+
"-start_at_zero"
|
|
362
333
|
];
|
|
334
|
+
if (useApi) {
|
|
335
|
+
// -r fps Set the input frame rate for the video stream.
|
|
336
|
+
// -f mp4 Tell ffmpeg that it should expect an MP4-encoded input stream.
|
|
337
|
+
// -i pipe:0 Use standard input to get video data.
|
|
338
|
+
ffmpegArgs.push("-r", this.hksv?.rtspEntry?.channel.fps.toString() ?? "30", "-f", "mp4", "-i", "pipe:0");
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
// -probesize number How many bytes should be analyzed for stream information.
|
|
342
|
+
// -avioflags direct Tell FFmpeg to minimize buffering to reduce latency for more realtime processing.
|
|
343
|
+
// -r fps Set the input frame rate for the video stream.
|
|
344
|
+
// -rtsp_transport tcp Tell the RTSP stream handler that we're looking for a TCP connection.
|
|
345
|
+
// -i rtspEntry.url RTSPS URL to get our input stream from.
|
|
346
|
+
ffmpegArgs.push("-probesize", this.probesize.toString(), "-avioflags", "direct", "-r", rtspEntry.channel.fps.toString(), "-rtsp_transport", "tcp", "-i", rtspEntry.url);
|
|
347
|
+
}
|
|
348
|
+
// -map 0:v:0 selects the first available video track from the stream. Protect actually maps audio
|
|
349
|
+
// and video tracks in opposite locations from where FFmpeg typically expects them. This
|
|
350
|
+
// setting is a more general solution than naming the track locations directly in case
|
|
351
|
+
// Protect changes this in the future.
|
|
352
|
+
ffmpegArgs.push("-map", "0:v:0");
|
|
363
353
|
// Inform the user.
|
|
364
|
-
this.log.info("Streaming request from %s%s: %sx%s@%sfps, %s kbps. %s %s, %s kbps.", sessionInfo.address, (request.audio.packet_time === 60) ? " (high latency connection)" : "", request.video.width, request.video.height, request.video.fps, targetBitrate.toLocaleString("en-US"), isTranscoding ? (this.protectCamera.hints.hardwareTranscoding ? "Hardware accelerated transcoding" : "Transcoding") : "Using",
|
|
354
|
+
this.log.info("Streaming request from %s%s: %sx%s@%sfps, %s kbps. %s %s, %s kbps.", sessionInfo.address, (request.audio.packet_time === 60) ? " (high latency connection)" : "", request.video.width, request.video.height, request.video.fps, targetBitrate.toLocaleString("en-US"), isTranscoding ? (this.protectCamera.hints.hardwareTranscoding ? "Hardware accelerated transcoding" : "Transcoding") : "Using", rtspEntry.name + " [" + (useApi ? "API" : "RTSP") + "]", (rtspEntry.channel.bitrate / 1000).toLocaleString("en-US"));
|
|
365
355
|
// Check to see if we're transcoding. If we are, set the right FFmpeg encoder options. If not, copy the video stream.
|
|
366
356
|
if (isTranscoding) {
|
|
367
357
|
// Configure our video parameters for transcoding.
|
|
368
358
|
ffmpegArgs.push(...this.ffmpegOptions.streamEncoder({
|
|
369
359
|
bitrate: targetBitrate,
|
|
370
|
-
fps:
|
|
360
|
+
fps: rtspEntry.channel.fps,
|
|
371
361
|
height: request.video.height,
|
|
372
362
|
idrInterval: PROTECT_HOMEKIT_IDR_INTERVAL,
|
|
373
|
-
inputFps:
|
|
363
|
+
inputFps: rtspEntry.channel.fps,
|
|
374
364
|
level: request.video.level,
|
|
375
365
|
profile: request.video.profile,
|
|
376
366
|
width: request.video.width
|
|
@@ -379,9 +369,16 @@ export class ProtectStreamingDelegate {
|
|
|
379
369
|
else {
|
|
380
370
|
// Configure our video parameters for just copying the input stream from Protect - it tends to be quite solid in most cases:
|
|
381
371
|
//
|
|
382
|
-
// -vcodec copy
|
|
372
|
+
// -vcodec copy Copy the stream withour reencoding it.
|
|
383
373
|
ffmpegArgs.push("-vcodec", "copy");
|
|
374
|
+
// The livestream API needs to be transmuxed before we use it directly.
|
|
375
|
+
if (useApi) {
|
|
376
|
+
// -r bsf:v h264_mp4toannexb Convert the livestream container format from MP4 to MPEG-TS.
|
|
377
|
+
ffmpegArgs.push("-bsf:v", "h264_mp4toannexb");
|
|
378
|
+
}
|
|
384
379
|
}
|
|
380
|
+
// -reset_timestamps Reset timestamps for this stream instead of accepting what Protect gives us.
|
|
381
|
+
ffmpegArgs.push("-reset_timestamps", "1");
|
|
385
382
|
// Add in any user-specified options for FFmpeg.
|
|
386
383
|
if (this.platform.config.ffmpegOptions) {
|
|
387
384
|
ffmpegArgs.push(...this.platform.config.ffmpegOptions);
|
|
@@ -394,7 +391,7 @@ export class ProtectStreamingDelegate {
|
|
|
394
391
|
// -srtp_out_suite enc Specify the output encryption encoding suites.
|
|
395
392
|
// -srtp_out_params params Specify the output encoding parameters. This is negotiated by HomeKit.
|
|
396
393
|
ffmpegArgs.push("-payload_type", request.video.pt.toString(), "-ssrc", sessionInfo.videoSSRC.toString(), "-f", "rtp", "-srtp_out_suite", "AES_CM_128_HMAC_SHA1_80", "-srtp_out_params", sessionInfo.videoSRTP.toString("base64"), "srtp://" + sessionInfo.address + ":" + sessionInfo.videoPort.toString() + "?rtcpport=" + sessionInfo.videoPort.toString() +
|
|
397
|
-
"&pkt_size=" +
|
|
394
|
+
"&pkt_size=" + request.video.mtu.toString());
|
|
398
395
|
// Configure the audio portion of the command line, if we have a version of FFmpeg supports the audio codecs we need. Options we use are:
|
|
399
396
|
//
|
|
400
397
|
// -map 0:a:0? Selects the first available audio track from the stream, if it exists. Protect actually maps audio
|
|
@@ -448,8 +445,7 @@ export class ProtectStreamingDelegate {
|
|
|
448
445
|
// -f rtp Specify that we're using the RTP protocol.
|
|
449
446
|
// -srtp_out_suite enc Specify the output encryption encoding suites.
|
|
450
447
|
// -srtp_out_params params Specify the output encoding parameters. This is negotiated by HomeKit.
|
|
451
|
-
ffmpegArgs.push("-payload_type", request.audio.pt.toString(), "-ssrc", sessionInfo.audioSSRC.toString(), "-f", "rtp", "-srtp_out_suite", "AES_CM_128_HMAC_SHA1_80", "-srtp_out_params", sessionInfo.audioSRTP.toString("base64"), "srtp://" + sessionInfo.address + ":" + sessionInfo.audioPort.toString() + "?rtcpport=" + sessionInfo.audioPort.toString() +
|
|
452
|
-
"&pkt_size=" + audiomtu.toString());
|
|
448
|
+
ffmpegArgs.push("-payload_type", request.audio.pt.toString(), "-ssrc", sessionInfo.audioSSRC.toString(), "-f", "rtp", "-srtp_out_suite", "AES_CM_128_HMAC_SHA1_80", "-srtp_out_params", sessionInfo.audioSRTP.toString("base64"), "srtp://" + sessionInfo.address + ":" + sessionInfo.audioPort.toString() + "?rtcpport=" + sessionInfo.audioPort.toString() + "&pkt_size=188");
|
|
453
449
|
}
|
|
454
450
|
// Additional logging, but only if we're debugging.
|
|
455
451
|
if (this.platform.verboseFfmpeg || this.verboseFfmpeg) {
|
|
@@ -461,6 +457,42 @@ export class ProtectStreamingDelegate {
|
|
|
461
457
|
// Combine everything and start an instance of FFmpeg.
|
|
462
458
|
const ffmpegStream = new FfmpegStreamingProcess(this, request.sessionID, ffmpegArgs, (sessionInfo.hasAudioSupport && this.protectCamera.hints.twoWayAudio) ? undefined :
|
|
463
459
|
{ addressVersion: sessionInfo.addressVersion, port: sessionInfo.videoReturnPort }, callback);
|
|
460
|
+
if (useApi) {
|
|
461
|
+
const livestream = this.protectCamera.livestream.acquire(rtspEntry.channel.id, rtspEntry.lens);
|
|
462
|
+
let seenInitSegment = false;
|
|
463
|
+
// If we're using a timeshift buffer, let's use that to livestream. It has the dual benefit of reducing the workload on the Protect controller since it's already
|
|
464
|
+
// providing a livestream to us and it also improves performance by ensuring there's several seconds of video ready to immediately transmit.
|
|
465
|
+
const livestreamListener = async (segment) => {
|
|
466
|
+
if (!seenInitSegment) {
|
|
467
|
+
if (this.hksv?.timeshift.isStarted && (this.hksv?.timeshift.channel === rtspEntry.channel.id) && (this.hksv?.timeshift.lens === rtspEntry.lens)) {
|
|
468
|
+
ffmpegStream.stdin?.write(this.hksv?.timeshift.getLast(100) ?? (await livestream.getInitSegment()));
|
|
469
|
+
seenInitSegment = true;
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
ffmpegStream.stdin?.write(await livestream.getInitSegment());
|
|
473
|
+
seenInitSegment = true;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
// Send the segment to FFmpeg for processing.
|
|
477
|
+
ffmpegStream.stdin?.write(segment);
|
|
478
|
+
};
|
|
479
|
+
const closeListener = () => void ffmpegStream.ffmpegProcess?.stdin.end();
|
|
480
|
+
livestream.on("close", closeListener);
|
|
481
|
+
// Ensure we cleanup on exit.
|
|
482
|
+
ffmpegStream.ffmpegProcess?.once("exit", () => {
|
|
483
|
+
this.protectCamera.livestream.stop(rtspEntry.channel.id, rtspEntry.lens);
|
|
484
|
+
livestream.off("segment", livestreamListener);
|
|
485
|
+
livestream.off("close", closeListener);
|
|
486
|
+
});
|
|
487
|
+
// Transmit video from our livestream as soon as it arrives.
|
|
488
|
+
livestream.on("segment", livestreamListener);
|
|
489
|
+
// Kickoff our livestream.
|
|
490
|
+
if (!(await this.protectCamera.livestream.start(rtspEntry.channel.id, rtspEntry.lens))) {
|
|
491
|
+
livestream.off("segment", livestreamListener);
|
|
492
|
+
livestream.off("close", closeListener);
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
464
496
|
// Some housekeeping for our FFmpeg and demuxer sessions.
|
|
465
497
|
this.ongoingSessions[request.sessionID] = {
|
|
466
498
|
ffmpeg: [ffmpegStream],
|
|
@@ -544,6 +576,12 @@ export class ProtectStreamingDelegate {
|
|
|
544
576
|
let isTalkbackLive = false;
|
|
545
577
|
let dataListener;
|
|
546
578
|
let openListener;
|
|
579
|
+
const wsCleanup = () => {
|
|
580
|
+
// Close the websocket.
|
|
581
|
+
if (ws?.readyState !== WebSocket.CLOSED) {
|
|
582
|
+
ws?.terminate();
|
|
583
|
+
}
|
|
584
|
+
};
|
|
547
585
|
if (sessionInfo.talkBack) {
|
|
548
586
|
// Open the talkback connection.
|
|
549
587
|
ws = new WebSocket(sessionInfo.talkBack, { rejectUnauthorized: false });
|
|
@@ -551,16 +589,19 @@ export class ProtectStreamingDelegate {
|
|
|
551
589
|
// Catch any errors and inform the user, if needed.
|
|
552
590
|
ws?.once("error", (error) => {
|
|
553
591
|
// Ignore timeout errors, but notify the user about anything else.
|
|
554
|
-
if (error.code !== "ETIMEDOUT")
|
|
592
|
+
if ((error.code !== "ETIMEDOUT") &&
|
|
593
|
+
!error.toString().startsWith("Error: WebSocket was closed before the connection was established")) {
|
|
555
594
|
this.log.error("Error in communicating with the return audio channel: %s", error);
|
|
556
595
|
}
|
|
557
|
-
|
|
596
|
+
// Clean up our talkback websocket.
|
|
597
|
+
wsCleanup();
|
|
558
598
|
});
|
|
559
599
|
// Catch any stray open events after we've closed.
|
|
560
600
|
ws?.on("open", openListener = () => {
|
|
561
601
|
// If we've somehow opened after we've wrapped up talkback, terminate the connection.
|
|
562
602
|
if (!isTalkbackLive) {
|
|
563
|
-
|
|
603
|
+
// Clean up our talkback websocket.
|
|
604
|
+
wsCleanup();
|
|
564
605
|
}
|
|
565
606
|
});
|
|
566
607
|
// Cleanup after ourselves on close.
|
|
@@ -574,7 +615,7 @@ export class ProtectStreamingDelegate {
|
|
|
574
615
|
// If we've already closed the RTP demuxer, we're done here,
|
|
575
616
|
if (!sessionInfo.rtpDemuxer.isRunning) {
|
|
576
617
|
// Clean up our talkback websocket.
|
|
577
|
-
|
|
618
|
+
wsCleanup();
|
|
578
619
|
return;
|
|
579
620
|
}
|
|
580
621
|
}
|
|
@@ -587,10 +628,9 @@ export class ProtectStreamingDelegate {
|
|
|
587
628
|
// Send the audio.
|
|
588
629
|
ffmpegReturnAudio.stdout?.on("data", dataListener = (data) => {
|
|
589
630
|
ws?.send(data, (error) => {
|
|
590
|
-
// This happens when an error condition is encountered on sending data to the websocket.
|
|
591
|
-
// We assume the worst and close our talkback channel.
|
|
631
|
+
// This happens when an error condition is encountered on sending data to the websocket. We assume the worst and close our talkback channel.
|
|
592
632
|
if (error) {
|
|
593
|
-
|
|
633
|
+
wsCleanup();
|
|
594
634
|
}
|
|
595
635
|
});
|
|
596
636
|
});
|
|
@@ -598,10 +638,8 @@ export class ProtectStreamingDelegate {
|
|
|
598
638
|
ffmpegReturnAudio.ffmpegProcess?.once("exit", () => {
|
|
599
639
|
// Make sure we catch any stray connections that may be too slow to open.
|
|
600
640
|
isTalkbackLive = false;
|
|
601
|
-
//
|
|
602
|
-
|
|
603
|
-
ws?.terminate();
|
|
604
|
-
}
|
|
641
|
+
// Clean up our talkback websocket.
|
|
642
|
+
wsCleanup();
|
|
605
643
|
ffmpegReturnAudio.stdout?.off("data", dataListener);
|
|
606
644
|
});
|
|
607
645
|
}
|
|
@@ -618,10 +656,6 @@ export class ProtectStreamingDelegate {
|
|
|
618
656
|
case "reconfigure" /* StreamRequestTypes.RECONFIGURE */:
|
|
619
657
|
// Once FFmpeg is updated to support this, we'll enable this one.
|
|
620
658
|
this.log.debug("Streaming parameters adjustment requested by HomeKit: %sx%s, %s fps, %s kbps.", request.video.width, request.video.height, request.video.fps, request.video.max_bit_rate.toLocaleString("en-US"));
|
|
621
|
-
// Set the desired bitrate in Protect.
|
|
622
|
-
if (this.rtspEntry) {
|
|
623
|
-
await this.protectCamera.setBitrate(this.rtspEntry.channel.id, request.video.max_bit_rate * 1000);
|
|
624
|
-
}
|
|
625
659
|
callback();
|
|
626
660
|
break;
|
|
627
661
|
case "stop" /* StreamRequestTypes.STOP */:
|
|
@@ -636,9 +670,7 @@ export class ProtectStreamingDelegate {
|
|
|
636
670
|
try {
|
|
637
671
|
// Stop any FFmpeg instances we have running.
|
|
638
672
|
if (this.ongoingSessions[sessionId]) {
|
|
639
|
-
|
|
640
|
-
ffmpegProcess.stop();
|
|
641
|
-
}
|
|
673
|
+
this.ongoingSessions[sessionId].ffmpeg.map(ffmpegProcess => ffmpegProcess.stop());
|
|
642
674
|
// Close the demuxer, if we have one.
|
|
643
675
|
this.ongoingSessions[sessionId].rtpDemuxer?.close();
|
|
644
676
|
// Inform the user.
|
|
@@ -654,20 +686,6 @@ export class ProtectStreamingDelegate {
|
|
|
654
686
|
// Delete the entries.
|
|
655
687
|
delete this.pendingSessions[sessionId];
|
|
656
688
|
delete this.ongoingSessions[sessionId];
|
|
657
|
-
// If we've completed all streaming sessions, restore any changed settings, such as bitrate, for HomeKit Secure Video.
|
|
658
|
-
if (!this.ongoingSessions.length) {
|
|
659
|
-
if (this.hksv?.isRecording) {
|
|
660
|
-
// Restart the timeshift buffer now that we've stopped streaming.
|
|
661
|
-
await this.hksv.restartTimeshifting();
|
|
662
|
-
}
|
|
663
|
-
else if (this.savedBitrate) {
|
|
664
|
-
// Restore our original bitrate.
|
|
665
|
-
if (this.rtspEntry) {
|
|
666
|
-
await this.protectCamera.setBitrate(this.rtspEntry.channel.id, this.savedBitrate);
|
|
667
|
-
}
|
|
668
|
-
this.savedBitrate = 0;
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
689
|
}
|
|
672
690
|
catch (error) {
|
|
673
691
|
this.log.error("Error occurred while ending the FFmpeg video processes: %s.", error);
|