synology-ss: update readme, remove default stream as it is in rebroadcast now

This commit is contained in:
Koushik Dutta
2022-04-05 17:00:58 -07:00
parent 8afa336345
commit 7ca6d3fdfe
6 changed files with 39 additions and 86 deletions

View File

@@ -1,12 +1,12 @@
{
"name": "@scrypted/synology-ss",
"version": "0.0.12",
"version": "0.0.13",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@scrypted/synology-ss",
"version": "0.0.12",
"version": "0.0.13",
"license": "Apache",
"dependencies": {
"axios": "^0.24.0"

View File

@@ -1,6 +1,6 @@
{
"name": "@scrypted/synology-ss",
"version": "0.0.12",
"version": "0.0.13",
"description": "A Synology Surveillance Station plugin for Scrypted",
"author": "Scrypted",
"license": "Apache",

View File

@@ -1,4 +1,4 @@
import sdk, { ScryptedDeviceBase, DeviceProvider, HttpRequest, HttpRequestHandler, HttpResponse, Settings, Setting, ScryptedDeviceType, VideoCamera, MediaObject, Device, MotionSensor, ScryptedInterface, Camera, MediaStreamOptions, PictureOptions } from "@scrypted/sdk";
import sdk, { ScryptedDeviceBase, DeviceProvider, HttpRequest, HttpRequestHandler, HttpResponse, Settings, Setting, ScryptedDeviceType, VideoCamera, MediaObject, Device, MotionSensor, ScryptedInterface, Camera, MediaStreamOptions, PictureOptions, ResponseMediaStreamOptions, ScryptedMimeTypes } from "@scrypted/sdk";
import { createInstanceableProviderPlugin, enableInstanceableProviderMode, isInstanceableProviderModeEnabled } from '../../../common/src/provider-plugin';
import { SynologyApiClient, SynologyCameraStream, SynologyCamera } from "./api/synology-api-client";
@@ -19,26 +19,10 @@ class SynologyCameraDevice extends ScryptedDeviceBase implements Camera, HttpReq
this.streams = SynologyCameraDevice.identifyStreams(camera);
}
private getDefaultStream(vsos: MediaStreamOptions[]) {
let defaultStreamIndex = vsos.findIndex(vso => vso.id === this.storage.getItem('defaultStream'));
if (defaultStreamIndex === -1)
defaultStreamIndex = 0;
return vsos[defaultStreamIndex];
}
public async getSettings(): Promise<Setting[]> {
const vsos = await this.getVideoStreamOptions();
const defaultStream = this.getDefaultStream(vsos);
return [
{
title: 'Default Stream',
key: 'defaultStream',
value: defaultStream?.name,
choices: vsos.map(vso => vso.name),
description: 'The default stream to use when not specified',
},
{
title: 'Motion Sensor Timeout',
key: 'sensorTimeout',
@@ -57,14 +41,7 @@ class SynologyCameraDevice extends ScryptedDeviceBase implements Camera, HttpReq
}
public async putSetting(key: string, value: string | number | boolean) {
if (key === 'defaultStream') {
const vsos = await this.getVideoStreamOptions();
const stream = vsos.find(vso => vso.name === value);
this.storage.setItem('defaultStream', stream?.id);
}
else {
this.storage.setItem(key, value?.toString());
}
this.storage.setItem(key, value?.toString());
this.onDeviceEvent(ScryptedInterface.Settings, undefined);
}
@@ -87,12 +64,12 @@ class SynologyCameraDevice extends ScryptedDeviceBase implements Camera, HttpReq
public async takePicture(options?: PictureOptions): Promise<MediaObject> {
const buffer = await this.getSnapshot(options);
return mediaManager.createMediaObject(buffer, 'image/jpeg');
return this.createMediaObject(buffer, 'image/jpeg');
}
public async getVideoStream(options?: MediaStreamOptions): Promise<MediaObject> {
const vsos = await this.getVideoStreamOptions();
const vso = vsos.find(check => check.id === options?.id) || this.getDefaultStream(vsos);
const vso = vsos.find(check => check.id === options?.id) || vsos[0];
const rtspChannel = this.streams.find(check => check.id === vso.id);
@@ -113,18 +90,18 @@ class SynologyCameraDevice extends ScryptedDeviceBase implements Camera, HttpReq
rtspPath = liveViewPaths[0].rtspPath;
}
return mediaManager.createFFmpegMediaObject({
return this.createMediaObject({
url: rtspPath,
inputArguments: [
"-rtsp_transport", "tcp",
"-i", rtspPath,
],
mediaStreamOptions: this.createMediaStreamOptions(rtspChannel),
});
}, ScryptedMimeTypes.FFmpegInput);
}
private createMediaStreamOptions(stream: SynologyCameraStream) {
const ret: MediaStreamOptions = {
const ret: ResponseMediaStreamOptions = {
id: stream.id,
name: stream.id,
container: 'rtsp',
@@ -142,7 +119,7 @@ class SynologyCameraDevice extends ScryptedDeviceBase implements Camera, HttpReq
return ret;
}
public async getVideoStreamOptions(): Promise<MediaStreamOptions[]> {
public async getVideoStreamOptions(): Promise<ResponseMediaStreamOptions[]> {
const vsos = this.streams.map(channel => this.createMediaStreamOptions(channel));
return vsos;
}

View File

@@ -11,29 +11,11 @@ import ip from 'ip';
import { WebRTCOutputSignalingSession } from "./output-signaling-session";
import { getFFmpegRtpAudioOutputArguments, startRtpForwarderProcess } from "./rtp-forwarders";
import { ScryptedSessionControl } from "./session-control";
import { requiredAudioCodec, requiredVideoCodec } from "./webrtc-required-codecs";
import { WebRTCStorageSettingsKeys } from "./webrtc-storage-settings";
import { isPeerConnectionAlive } from "./werift-util";
const { mediaManager, systemManager, deviceManager } = sdk;
const requiredVideoCodec = new RTCRtpCodecParameters({
mimeType: "video/H264",
clockRate: 90000,
rtcpFeedback: [
{ type: "transport-cc" },
{ type: "ccm", parameter: "fir" },
{ type: "nack" },
{ type: "nack", parameter: "pli" },
{ type: "goog-remb" },
],
parameters: 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f'
});
const requiredAudioCodec = new RTCRtpCodecParameters({
mimeType: "audio/opus",
clockRate: 48000,
channels: 2,
});
const { mediaManager } = sdk;
function createSetup(audioDirection: RTCRtpTransceiverDirection, videoDirection: RTCRtpTransceiverDirection): Partial<RTCAVSignalingSetup> {
return {

View File

@@ -0,0 +1,21 @@
import { RTCRtpCodecParameters } from "@koush/werift";
import sdk, { } from "@scrypted/sdk";
export const requiredVideoCodec = new RTCRtpCodecParameters({
mimeType: "video/H264",
clockRate: 90000,
rtcpFeedback: [
{ type: "transport-cc" },
{ type: "ccm", parameter: "fir" },
{ type: "nack" },
{ type: "nack", parameter: "pli" },
{ type: "goog-remb" },
],
parameters: 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f'
});
export const requiredAudioCodec = new RTCRtpCodecParameters({
mimeType: "audio/opus",
clockRate: 48000,
channels: 2,
});

View File

@@ -9,6 +9,7 @@ import { ChildProcess } from "child_process";
import dgram from 'dgram';
import { Socket } from "net";
import { getFFmpegRtpAudioOutputArguments, startRtpForwarderProcess } from "./rtp-forwarders";
import { requiredAudioCodec, requiredVideoCodec } from "./webrtc-required-codecs";
import { createRawResponse, isPeerConnectionAlive } from "./werift-util";
const { mediaManager } = sdk;
@@ -60,11 +61,9 @@ export async function createRTCPeerConnectionSource(options: {
const pc = new RTCPeerConnection({
codecs: {
audio: [
new RTCRtpCodecParameters({
mimeType: "audio/opus",
clockRate: 48000,
channels: 2,
}),
requiredAudioCodec,
// these are some other option templates that may be worth considering
// for fast path.
// new RTCRtpCodecParameters({
// mimeType: "audio/opus",
// clockRate: 8000,
@@ -82,33 +81,7 @@ export async function createRTCPeerConnectionSource(options: {
// }),
],
video: [
// h264 high
// new RTCRtpCodecParameters(
// {
// clockRate: 90000,
// mimeType: "video/H264",
// rtcpFeedback: [
// { type: "transport-cc" },
// { type: "ccm", parameter: "fir" },
// { type: "nack" },
// { type: "nack", parameter: "pli" },
// { type: "goog-remb" },
// ],
// parameters: "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640c1f"
// },
// ),
new RTCRtpCodecParameters({
mimeType: "video/H264",
clockRate: 90000,
rtcpFeedback: [
{ type: "transport-cc" },
{ type: "ccm", parameter: "fir" },
{ type: "nack" },
{ type: "nack", parameter: "pli" },
{ type: "goog-remb" },
],
parameters: 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f'
})
requiredVideoCodec,
],
}
});