mirror of
https://github.com/koush/scrypted.git
synced 2026-03-20 16:40:24 +00:00
synology-ss: update readme, remove default stream as it is in rebroadcast now
This commit is contained in:
4
plugins/synology-ss/package-lock.json
generated
4
plugins/synology-ss/package-lock.json
generated
@@ -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"
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
21
plugins/webrtc/src/webrtc-required-codecs.ts
Normal file
21
plugins/webrtc/src/webrtc-required-codecs.ts
Normal 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,
|
||||
});
|
||||
@@ -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,
|
||||
],
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user