-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathscreen_share_with_filter.html
59 lines (51 loc) · 1.82 KB
/
screen_share_with_filter.html
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
<button onclick="share()">Share</button>
<script src="https://raw.githack.com/bennyschudel/JSManipulate/0a6f6c236bbe8456870f3da1af6c5055ab210270/script/jsmanipulate.js"></script>
<script>
async function share() {
// Get screen
const mediaStream = await navigator.mediaDevices.getDisplayMedia({video: true});
// Sepia filter
const filteredMediaStream = await sepiaMediaStream(mediaStream);
// Convert MediaStream to ReadableStream
const readableStream = mediaStreamToReadableStream(filteredMediaStream, 100);
// Share
fetch("https://ppng.io/myvideo", {
method: 'POST',
body: readableStream,
allowHTTP1ForStreamingUpload: true,
});
}
// Convert MediaStream to ReadableStream
function mediaStreamToReadableStream(mediaStream, timeslice) {
return new ReadableStream({
start(ctrl){
const recorder = new MediaRecorder(mediaStream);
recorder.ondataavailable = async (e) => {
ctrl.enqueue(new Uint8Array(await e.data.arrayBuffer()));
};
recorder.start(timeslice);
}
});
}
async function sepiaMediaStream(mediaStream) {
const memVideo = document.createElement('video');
memVideo.srcObject = mediaStream;
await memVideo.play();
const width = memVideo.videoWidth;
const height = memVideo.videoHeight;
const srcCanvas = document.createElement('canvas');
const dstCanvas = document.createElement('canvas');
srcCanvas.width = dstCanvas.width = width;
srcCanvas.height = dstCanvas.height = height;
const srcCtx = srcCanvas.getContext('2d');
const dstCtx = dstCanvas.getContext('2d');
(function loop(){
srcCtx.drawImage(memVideo, 0, 0, width, height);
const frame = srcCtx.getImageData(0, 0, width, height);
JSManipulate.sepia.filter(frame);
dstCtx.putImageData(frame, 0, 0);
setTimeout(loop, 0);
})();
return dstCanvas.captureStream();
}
</script>