From 33245fea03675d3d9ca5a53e14ba3e63d2314010 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=A0ediv=C3=BD?= Date: Fri, 18 Mar 2022 23:56:27 +0100 Subject: [PATCH] webrtc fallback image video snap. --- src/component/internal/webrtc.ts | 9 +++++++++ src/component/main.vue | 20 ++++++++++++++++++++ src/component/screencast.vue | 8 ++++++++ 3 files changed, 37 insertions(+) diff --git a/src/component/internal/webrtc.ts b/src/component/internal/webrtc.ts index ec31345d..20bb9934 100644 --- a/src/component/internal/webrtc.ts +++ b/src/component/internal/webrtc.ts @@ -1,6 +1,7 @@ import EventEmitter from 'eventemitter3' import { WebRTCStats, CursorPosition, CursorImage } from '../types/webrtc' import { Logger } from '../utils/logger' +import { videoSnap } from '../utils/video-snap' export const OPCODE = { MOVE: 0x01, @@ -25,11 +26,15 @@ export interface NekoWebRTCEvents { negotiation: (description: RTCSessionDescriptionInit) => void stable: (isStable: boolean) => void stats: (stats: WebRTCStats) => void + fallback: (image: string) => void // send last frame image URL as fallback ['cursor-position']: (data: CursorPosition) => void ['cursor-image']: (data: CursorImage) => void } export class NekoWebRTC extends EventEmitter { + // used for creating snaps from video for fallback mode + public video!: HTMLVideoElement + private _peer?: RTCPeerConnection private _channel?: RTCDataChannel private _track?: MediaStreamTrack @@ -248,6 +253,10 @@ export class NekoWebRTC extends EventEmitter { throw new Error('attempting to close nonexistent peer') } + // create and emit video snap before closing connection + const imageSrc = await videoSnap(this.video) + this.emit('fallback', imageSrc) + this._peer.close() } diff --git a/src/component/main.vue b/src/component/main.vue index 235326d3..fd6a1d79 100644 --- a/src/component/main.vue +++ b/src/component/main.vue @@ -4,6 +4,7 @@