Снимок экрана не выполняется, пока включен общий доступ к экрану

#javascript #django

Вопрос:

Я создаю веб-сайт с использованием Django, где пытаюсь реализовать функцию скриншотов и совместного использования экрана с помощью javascript. Я пытаюсь сделать снимок экрана, используя html2canvas, который является библиотекой javascript. На той же веб-странице есть функция совместного использования экрана, помимо скриншота. Когда я нажимаю «Сделать снимок экрана», делается снимок экрана div видео. Но видеоэкран не запечатлен на снимке экрана.

 <html>
    <head runat="server">
        <title>Demo</title>
        <style>
            #video {
                border: 1px solid #999;
                width: 50%;
                max-width: 860px;
            }
    
            .error {
                color: red;
            }
             #photo {
                width: 51%;
                    border: 4px solid green;
                    padding: 4px;
                }
            .warn {
                color: orange;
            }
    
            .info {
                color: darkgreen;
            }
        </style>
         <!-- Include from the CDN -->
     
    </head>
    
    <body>
        <h1>recording</h1>
        <form id="form1" runat="server">
            <div>
                <p>
                    This example shows you the contents of the selected part of your display.
            Click the Start Capture button to begin.
       
                </p>
    
                <p>
                    <input type="button" id="start" value="Start Capture" />amp;nbsp;
            <input type="button" id="stop" value="Stop Capture" />
                </p>
                <p>
                    <a></a>
                </p>
    
                <div id="photo">
                    <video id="video" autoplay="autoplay"></video>
                    <hr>
                    <a onclick="takeshot()">
                        Take Screenshot
                    </a>
                </div>
                
                <br />
                <h1>Screenshot:</h1>
                <div id="output"></div>
                
                <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
                <script>
                    const videoElem = document.getElementById("video");
                    const startElem = document.getElementById("start");
                    const stopElem = document.getElementById("stop");
    
                    // Options for getDisplayMedia()
    
                    var displayMediaOptions = {
                        video: {
                            cursor: "always"
                        },
                        audio: false
                    };
    
                    // Set event listeners for the start and stop buttons
                    startElem.addEventListener("click", function (evt) {
                        startCapture();
                    }, false);
    
                    stopElem.addEventListener("click", function (evt) {
                        stopCapture();
                    }, false);
    
                    var stream = null;
    
                    async function startCapture() {
                        try {
                            stream = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);
                            videoElem.srcObject = stream;
    
                            let recorder = new MediaRecorder(stream);
                            let chunks = [];
                            recorder.start();
                            recorder.ondataavailable = event => {
                                if (event.data.size > 0) {
                                    chunks.push(event.data)
                                }
                                console.log(chunks);
                            }
    
                            recorder.onstop = () => {
                                const blob = new Blob(chunks, {
                                    type: 'video/mp4'
                                })
                                var blobUrl = URL.createObjectURL(blob);

                                // download the video file
                                saveData(blob,"samce");
                                var fs = require('fs');
                                console.log(fs);


                                chunks = [];
                                reader = new FileReader();
                                reader.readAsDataURL(blob);

                                reader.onload = function (event) {
                                    var arrayBuffer = event.target.resu<
                                    //console.log(arrayBuffer);
                                    $.ajax({
                                        type: "POST",
                                        url: "RecordAndSave.aspx/Save",
                                        data: '{ "blobData": "'   arrayBuffer   '"}',
                                        contentType: "application/json; charset=utf-8",
                                        dataType: "json",
                                        success: function (msg) {
                                            // Do something here
                                            console.log("upload vedio file"   msg.d);
                                        }
                                    });
                                };
                            }
                            //console.log(stream);
                            dumpOptionsInfo();
                        } catch (err) {
                            console.error("Error: "   err);
                        }
                    }
    
                    function stopCapture(evt) {
                        let tracks = videoElem.srcObject.getTracks();
                        tracks.forEach(track => track.stop());
                        videoElem.srcObject = null;
                    }
    
                    function dumpOptionsInfo() {
                        const videoTrack = videoElem.srcObject.getVideoTracks()[0];
                    }
                    // @func saveData(blob, filename) 
                    var saveData = (function () {
                    var a = document.createElement("a");
                    document.body.appendChild(a);
                    a.style = "display: none";
                        return function (blob, fileName) {

                            url = window.URL.createObjectURL(blob);
                            a.href = url;
                            a.download = fileName;
                            a.click();
                            window.URL.revokeObjectURL(url);
                        };
                    }());

                    // Define the function 
                    // to screenshot the div
                    function takeshot() {
                        let div = document.getElementById('photo');
                        html2canvas(div).then(
                            function (canvas) {
                                document
                                .getElementById('output')
                                .appendChild(canvas);
                            })
                    }

        </script>
            </div>
        </form>
    </body>
    <script src="https://unpkg.com/peerjs@1.3.1/dist/peerjs.min.js"></script>
       <script src="https://unpkg.com/html2canvas@1.3.2/dist/html2canvas.js"></script>
    <script>
        

    </script>

</html> 

Вы можете наблюдать за проблемой по ссылке: https://jsfiddle.net/79szpn24/

Еще один дополнительный момент, которым я хочу поделиться о функции Mozilla Firefox «Сделать снимок экрана». Пожалуйста, перейдите в Mozilla Firefox и нажмите «Ctrl Shift s», вы найдете их функцию скриншота. Как я могу сделать, как этот тип функции настройки скриншота с помощью javascript»?