Spaces:
Running
Running
File size: 1,977 Bytes
ec50620 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
/**
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { useState, useEffect } from "react";
import { UseMediaStreamResult } from "./use-media-stream-mux";
export function useScreenCapture(): UseMediaStreamResult {
const [stream, setStream] = useState<MediaStream | null>(null);
const [isStreaming, setIsStreaming] = useState(false);
useEffect(() => {
const handleStreamEnded = () => {
setIsStreaming(false);
setStream(null);
};
if (stream) {
stream
.getTracks()
.forEach((track) => track.addEventListener("ended", handleStreamEnded));
return () => {
stream
.getTracks()
.forEach((track) =>
track.removeEventListener("ended", handleStreamEnded),
);
};
}
}, [stream]);
const start = async () => {
// const controller = new CaptureController();
// controller.setFocusBehavior("no-focus-change");
const mediaStream = await navigator.mediaDevices.getDisplayMedia({
video: true,
// controller
});
setStream(mediaStream);
setIsStreaming(true);
return mediaStream;
};
const stop = () => {
if (stream) {
stream.getTracks().forEach((track) => track.stop());
setStream(null);
setIsStreaming(false);
}
};
const result: UseMediaStreamResult = {
type: "screen",
start,
stop,
isStreaming,
stream,
};
return result;
}
|