mirror of
https://github.com/koush/scrypted.git
synced 2026-08-14 00:50:36 +01:00
webrtc: update werift with fixed track removal. add support for replaceTrack.
This commit is contained in:
2
external/werift
vendored
2
external/werift
vendored
Submodule external/werift updated: 26cd73cedd...530a2bc747
4
plugins/webrtc/package-lock.json
generated
4
plugins/webrtc/package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@scrypted/webrtc",
|
||||
"version": "0.0.77",
|
||||
"version": "0.0.78",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@scrypted/webrtc",
|
||||
"version": "0.0.77",
|
||||
"version": "0.0.78",
|
||||
"dependencies": {
|
||||
"@koush/werift": "file:../../external/werift/packages/webrtc",
|
||||
"@scrypted/common": "file:../../common",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@scrypted/webrtc",
|
||||
"version": "0.0.77",
|
||||
"version": "0.0.78",
|
||||
"scripts": {
|
||||
"scrypted-setup-project": "scrypted-setup-project",
|
||||
"prescrypted-setup-project": "scrypted-package-json",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { MediaStreamTrack, RTCPeerConnection, RTCRtpTransceiver, RtpPacket } from "@koush/werift";
|
||||
|
||||
import { Deferred } from "@scrypted/common/src/deferred";
|
||||
import sdk, { BufferConverter, BufferConvertorOptions, FFmpegInput, FFmpegTranscodeStream, Intercom, MediaObject, MediaStreamDestination, RequestMediaStream, RTCAVSignalingSetup, RTCConnectionManagement, RTCMediaObjectTrack, RTCSignalingOptions, RTCSignalingSession, ScryptedDevice, ScryptedDeviceBase, ScryptedInterface, ScryptedMimeTypes } from "@scrypted/sdk";
|
||||
import sdk, { BufferConverter, BufferConvertorOptions, FFmpegInput, FFmpegTranscodeStream, Intercom, MediaObject, MediaStreamDestination, RequestMediaStream, RTCAVSignalingSetup, RTCConnectionManagement, RTCMediaObjectTrack, RTCMediaObjectTrackOptions, RTCSignalingOptions, RTCSignalingSession, ScryptedDevice, ScryptedDeviceBase, ScryptedInterface, ScryptedMimeTypes } from "@scrypted/sdk";
|
||||
import type { WebRTCPlugin } from "./main";
|
||||
import { ScryptedSessionControl } from "./session-control";
|
||||
import { requiredAudioCodecs, requiredVideoCodec } from "./webrtc-required-codecs";
|
||||
@@ -230,16 +230,23 @@ class WebRTCTrack implements RTCMediaObjectTrack {
|
||||
control: ScryptedSessionControl;
|
||||
removed = new Deferred<void>();
|
||||
|
||||
constructor(public connectionManagement: WebRTCConnectionManagement, public video: RTCRtpTransceiver, public audio: RTCRtpTransceiver, public intercom: Intercom) {
|
||||
constructor(public connectionManagement: WebRTCConnectionManagement, public video: RTCRtpTransceiver, public audio: RTCRtpTransceiver, intercom: Intercom) {
|
||||
this.control = new ScryptedSessionControl(async () => { }, intercom, audio);
|
||||
}
|
||||
|
||||
async replace(mediaObject: MediaObject): Promise<void> {
|
||||
throw new Error("Method not implemented.");
|
||||
const { atrack, vtrack, createTrackForwarder, intercom } = await this.connectionManagement.createTracks(mediaObject);
|
||||
this.cleanup(true);
|
||||
|
||||
this.video.sender.replaceTrack(vtrack);
|
||||
this.audio.sender.replaceTrack(atrack);
|
||||
const { atrack, vtrack, createTrackForwarder, intercom } = await this.connectionManagement.createTracks(mediaObject);
|
||||
this.removed = new Deferred();
|
||||
this.control = new ScryptedSessionControl(async () => { }, intercom, this.audio);
|
||||
|
||||
const f = await createTrackForwarder(this.video, this.audio)
|
||||
waitClosed(this.connectionManagement.pc).finally(() => f.kill());
|
||||
this.removed.promise.finally(() => f.kill());
|
||||
|
||||
await this.video.sender.replaceTrack(vtrack);
|
||||
await this.audio.sender.replaceTrack(atrack);
|
||||
}
|
||||
|
||||
cleanup(cleanupTrackOnly: boolean) {
|
||||
@@ -265,6 +272,10 @@ class WebRTCTrack implements RTCMediaObjectTrack {
|
||||
setPlayback(options: { audio: boolean; video: boolean; }): Promise<void> {
|
||||
return this.control.setPlayback(options);
|
||||
}
|
||||
|
||||
async setOptions(options: RTCMediaObjectTrackOptions): Promise<void> {
|
||||
console.log('updating destination');
|
||||
}
|
||||
}
|
||||
|
||||
export class WebRTCConnectionManagement implements RTCConnectionManagement {
|
||||
@@ -303,7 +314,7 @@ export class WebRTCConnectionManagement implements RTCConnectionManagement {
|
||||
this.weriftSignalingSession = new WeriftSignalingSession(console, this.pc);
|
||||
}
|
||||
|
||||
async createTracks(mediaObject: MediaObject) {
|
||||
async createTracks(mediaObject: MediaObject, options?: RTCMediaObjectTrackOptions) {
|
||||
let requestMediaStream: RequestMediaStream;
|
||||
|
||||
try {
|
||||
@@ -313,6 +324,17 @@ export class WebRTCConnectionManagement implements RTCConnectionManagement {
|
||||
requestMediaStream = async () => mediaObject;
|
||||
}
|
||||
|
||||
if (options?.destination) {
|
||||
const { destination } = options;
|
||||
const wrapped = requestMediaStream;
|
||||
requestMediaStream = async requestOptions => {
|
||||
return wrapped({
|
||||
...requestOptions,
|
||||
destination,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
let intercom: Intercom;
|
||||
try {
|
||||
const device = await sdk.mediaManager.convertMediaObject<ScryptedDevice & Intercom>(mediaObject, ScryptedMimeTypes.ScryptedDevice);
|
||||
@@ -381,11 +403,11 @@ export class WebRTCConnectionManagement implements RTCConnectionManagement {
|
||||
}
|
||||
}
|
||||
|
||||
async addTrack(mediaObject: MediaObject, options?: {
|
||||
async addTrack(mediaObject: MediaObject, options?: RTCMediaObjectTrackOptions & {
|
||||
videoMid?: string,
|
||||
audioMid?: string,
|
||||
}) {
|
||||
const { atrack, vtrack, createTrackForwarder, intercom } = await this.createTracks(mediaObject);
|
||||
const { atrack, vtrack, createTrackForwarder, intercom } = await this.createTracks(mediaObject, options);
|
||||
|
||||
const videoTransceiver = this.pc.addTransceiver(vtrack, {
|
||||
direction: 'sendonly',
|
||||
|
||||
@@ -23,11 +23,6 @@ defaultPeerConfig.headerExtensions = {
|
||||
audio: [],
|
||||
};
|
||||
|
||||
const supportedTypes = [
|
||||
ScryptedDeviceType.Camera,
|
||||
ScryptedDeviceType.Doorbell,
|
||||
];
|
||||
|
||||
mediaManager.addConverter({
|
||||
fromMimeType: ScryptedMimeTypes.ScryptedDevice,
|
||||
toMimeType: ScryptedMimeTypes.RequestMediaStream,
|
||||
@@ -252,7 +247,10 @@ export class WebRTCPlugin extends AutoenableMixinProvider implements DeviceCreat
|
||||
|
||||
return ret;
|
||||
}
|
||||
else if (supportedTypes.includes(type) && interfaces.includes(ScryptedInterface.VideoCamera)) {
|
||||
else if ([
|
||||
ScryptedDeviceType.Camera,
|
||||
ScryptedDeviceType.Doorbell,
|
||||
].includes(type) && interfaces.includes(ScryptedInterface.VideoCamera)) {
|
||||
return [
|
||||
ScryptedInterface.RTCSignalingChannel,
|
||||
// ScryptedInterface.Settings,
|
||||
|
||||
Reference in New Issue
Block a user