Ошибка «Не удается прочитать свойство» при нажатии кнопки «Начать запись» - PullRequest
0 голосов
/ 26 марта 2019

Я получаю ошибку консоли при нажатии кнопки записи.

Я работал с Code From RTCMulticonnection, чтобы установить соединение, и теперь хочу иметь возможность записывать поток. Я использовал эту демонстрацию для записи потока:

RecordRTC-и-RTCMultiConnection https://github.com/muaz-khan/WebRTC-Experiment/blob/d1040f7dcd47c290f99ad51f9b3d57aa40c847c4/RTCMultiConnection/v2.2.2/demos/RecordRTC-and-RTCMultiConnection.html

Консольное сообщение

Uncaught TypeError: Cannot read property 'YvuytsjuZSjrg1Wp9xa4jAXrEC783kpnW74r' of undefined
    at HTMLButtonElement.button.onclick (index.html:108)

Я вижу, что в демо-версии все streamid имеют короткий идентификатор id="1mnvuzts2dm". Моя версия устанавливает в streamid более длинные случайные строки, подобные приведенной выше в сообщении об ошибке id="YvuytsjuZSjrg1Wp9xa4jAXrEC783kpnW74r"

//RECORD THE CONVERSATION AUDIO + VIDEO
  connection.onstream = function(e) {
            appendVideo(e.mediaElement, e.streamid);
        };

        function appendVideo(video, streamid) {
            video.width = 600;
            video = getVideo(video, streamid);
            videosContainer.appendChild(video);
            rotateVideo(video);
            scaleVideos();
        }

        function getVideo(video, streamid) {
            var div = document.createElement('div');
            div.className = 'video-container';

            var button = document.createElement('button');
            button.id = streamid;
            button.innerHTML = 'Start Recording';
            button.onclick = function() {
                this.disabled = true;
                if (this.innerHTML == 'Start Recording') {
                    this.innerHTML = 'Stop Recording';
                    connection.streams[this.id].startRecording({
                        audio: true,
                        video: true
                    });
                } else {
                    this.innerHTML = 'Start Recording';
                    var stream = connection.streams[this.id];
                    stream.stopRecording(function(blob) {
                        var h2;

                        if (blob.audio && !(connection.UA.Chrome && stream.type == 'remote')) {
                            h2 = document.createElement('h2');
                            h2.innerHTML = '<a href="' + URL.createObjectURL(blob.audio) + '" target="_blank">Open recorded ' + blob.audio.type + '</a>';
                            div.appendChild(h2);
                        }

                        if (blob.video) {
                            h2 = document.createElement('h2');
                            h2.innerHTML = '<a href="' + URL.createObjectURL(blob.video) + '" target="_blank">Open recorded ' + blob.video.type + '</a>';
                            div.appendChild(h2);
                        }
                    });
                }
                setTimeout(function() {
                    button.disabled = false;
                }, 3000);
            };
            div.appendChild(button);
            div.appendChild(video);
            return div;
        }

        function rotateVideo(mediaElement) {
            mediaElement.style[navigator.mozGetUserMedia ? 'transform' : '-webkit-transform'] = 'rotate(0deg)';
            setTimeout(function() {
                mediaElement.style[navigator.mozGetUserMedia ? 'transform' : '-webkit-transform'] = 'rotate(360deg)';
            }, 1000);
        }

        connection.onstreamended = function(e) {
            var div = e.mediaElement.parentNode;
            div.style.opacity = 0;
            rotateVideo(div);
            setTimeout(function() {
                if (div.parentNode) {
                    div.parentNode.removeChild(div);
                }
                scaleVideos();
            }, 1000);
        };


      function scaleVideos() {
            var videos = document.querySelectorAll('video'),
                length = videos.length,
                video;

            var minus = 130;
            var windowHeight = 700;
            var windowWidth = 600;
            var windowAspectRatio = windowWidth / windowHeight;
            var videoAspectRatio = 4 / 3;
            var blockAspectRatio;
            var tempVideoWidth = 0;
            var maxVideoWidth = 0;

            for (var i = length; i > 0; i--) {
                blockAspectRatio = i * videoAspectRatio / Math.ceil(length / i);
                if (blockAspectRatio <= windowAspectRatio) {
                    tempVideoWidth = videoAspectRatio * windowHeight / Math.ceil(length / i);
                } else {
                    tempVideoWidth = windowWidth / i;
                }
                if (tempVideoWidth > maxVideoWidth)
                    maxVideoWidth = tempVideoWidth;
            }
            for (var i = 0; i < length; i++) {
                video = videos[i];
                if (video)
                    video.width = maxVideoWidth - minus;
            }
        }

ОШИБКА:

connection.streams[this.id].startRecording({

1 Ответ

0 голосов
/ 30 мая 2019

Вы можете использовать библиотеку RecordRTC для записи потоков.Вам просто нужно использовать этот код на своей основной странице

и прикрепить библиотеку recordRTC к своей странице.

  recorder = connection.recorder;
        if(!recorder) 
        {
            recorder = RecordRTC([event.stream], {
                type: 'video'
            });             
            connection.recorder = recorder;
        }
        else {
            recorder.getInternalRecorder().addStreams([event.stream]);
        }

        recorder.videoWidth  = 500;
        recorder.videoHeight = 500;

        if(!connection.recorder.streams) {
            connection.recorder.streams = [];
        }

        connection.recorder.streams.push(event.stream);

        var length = connection.recorder.streams.length;

        if(length > 2){
            length = 2; 
        }
        recordingStatus.innerHTML = 'Recording Started ' + length + ' streams';

Или вы можете использовать этот код

connection.onstream = function(event) {

    var video = document.createElement('video');

    try {
        video.setAttributeNode(document.createAttribute('autoplay'));
        video.setAttributeNode(document.createAttribute('playsinline'));
    } catch (e) {
        video.setAttribute('autoplay', true);
        video.setAttribute('playsinline', true);
    }

    if(event.type === 'local') {
      video.volume = 0;
      try {
          video.setAttributeNode(document.createAttribute('muted'));
      } catch (e) {
          video.setAttribute('muted', true);
      }
    }
    video.srcObject = event.stream;

    var width = parseInt(connection.videosContainer.clientWidth / 3) - 20;
    var mediaElement = getHTMLMediaElement(video, {
        title: event.userid,
        buttons: ['full-screen'],
        width: width,
        showOnMouseEnter: false
    });

    connection.videosContainer.appendChild(mediaElement);

    setTimeout(function() {
        mediaElement.media.play();
    }, 5000);

    mediaElement.id = event.streamid;
    // to keep room-id in cache
    localStorage.setItem(connection.socketMessageEvent, connection.sessionid);
    if(chkRecordConference.checked === true) {
        chkRecordConference.parentNode.style.display = 'none';
        btnStopRecording.style.display = 'inline-block';
        recordingStatus.style.display = 'inline-block';
        recorder = connection.recorder;
        if(!recorder) 
        {
            recorder = RecordRTC([event.stream], {
                type: 'video'
            });             
            connection.recorder = recorder;
        }
        else {
            recorder.getInternalRecorder().addStreams([event.stream]);
        }

        recorder.videoWidth  = 500;
        recorder.videoHeight = 500;

        if(!connection.recorder.streams) {
            connection.recorder.streams = [];
        }

        connection.recorder.streams.push(event.stream);

        var length = connection.recorder.streams.length;

        if(length > 2){
            length = 2; 
        }
        recordingStatus.innerHTML = 'Recording Started ' + length + ' streams';
    }
...