微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在WebRTC中使用多次调用getUserMedia来拆分音频和视频

如何解决在WebRTC中使用多次调用getUserMedia来拆分音频和视频

我正在开发一个简单的应用程序,该应用程序使用WebRTC和RecordRTC库通过网络摄像头和麦克风录制音频和视频,然后将它们保存到服务器,但是我需要将它们另存为单独的文件。我目前正在尝试通过多次调用navigator.mediaDevices.getUserMedia并将其保存到不同的HTML标签来进行此操作,但是对于音频标签,我目前却遇到了An error occurred: TypeError: Cannot set property 'srcObject' of null错误。 有可能做我想做的事吗?如果是这样,错误发生在哪里?我的代码包含在下面。如果没有,是否有其他方法可以实现?

<html>
<head> 
   <Meta charset = "utf-8">
</head>
<body>
   <div class="camera">
      <audio style="display: none;"></audio>
      <video id="video" autoplay controls></video><br>
      <button id="startbutton">Start Recording</button>
      <button id="stopbutton">Stop Recording</button>
      <button id="photobutton">Take photo</button>
   </div>
   <canvas id="canvas" style="display: none;"></canvas>
   <div class="output">
      <img id="photo">
   </div>
   <button id="downloadbutton" style="display: none;">Download All</button>

   <script src = "RecordRTC.js"></script>
   <!-- web streams API polyfill to support Firefox -->
   <script src="https://unpkg.com/@mattiasbuelens/web-streams-polyfill/dist/polyfill.min.js"></script>

   <!-- ../libs/DBML.js to fix video seeking issues -->
   <script src="https://www.webrtc-experiment.com/EBML.js"></script>

   <!-- for Edge/FF/Chrome/Opera/etc. getUserMedia support -->
   <script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
   <script src="https://www.webrtc-experiment.com/DetectRTC.js"> </script>
   <script>
      var startbutton = document.getElementById('startbutton');
      var stopbutton = document.getElementById('stopbutton');
      var video = document.getElementById('video');
      var audio = document.getElementById('audio');
      var canvas = document.getElementById('canvas');
      var photo = document.getElementById('photo');
      var photobutton = document.getElementById('photobutton');
      var downloadbutton = document.getElementById('downloadbutton');
      var videorecorder;
      var audiorecorder;
      var videoData;
      var audioData;
      var imageData;
      var width = 320;
      var height = 0;
      var streaming = false;

      stopbutton.disabled = true;

      function stopVideoRecordingCallback() {
         video.src = video.srcObject = null;
         video.muted = false;
         video.volume = 1;
         video.src = URL.createObjectURL(videorecorder.getBlob());
         videorecorder.stream.stop();
         videorecorder.destroy();
         videorecorder = null;
      }

      function stopAudioRecordingCallback() {
         audiorecorder.stop();
      }

      function clearphoto() {
         var context = canvas.getContext('2d');
         context.fillStyle = "#AAA";
         context.fillRect(0,canvas.width,canvas.height);

         var data = canvas.toDataURL('image/png');
         photo.setAttribute('src',data);
      }
         
      function takepicture() {
         var context = canvas.getContext('2d');
         if (width && height) {
            canvas.width = width;
            canvas.height = height;
            context.drawImage(video,width,height);
            
            var data = canvas.toDataURL('image/png');
            photo.setAttribute('src',data);
         } else {
            clearphoto();
         }
      }

      startbutton.addEventListener('click',function() {
         navigator.mediaDevices.getUserMedia({video: true,audio: false}).then(function(stream) {
            video.srcObject = stream;
            videorecorder = RecordRTC(stream,{
               type: 'video'
            });
            videorecorder.startRecording();
            startbutton.disabled = true;
            videorecorder.stream = stream;
            document.getElementById('stopbutton').disabled = false;
            video.addEventListener('canplay',function(ev){
               if (!streaming) {
                  height = video.videoHeight / (video.videoWidth/width);
                  if (isNaN(height)) {
                     height = width / (4/3);
                  }
                  
                  video.setAttribute('width',width);
                  video.setAttribute('height',height);
                  canvas.setAttribute('width',width);
                  canvas.setAttribute('height',height);
                  streaming = true;
               }
            },false);

            photobutton.addEventListener('click',function(ev){
               takepicture();
               ev.preventDefault();
            },false);
            
            clearphoto();
         }).catch(function(err) {
            console.log("An error occurred: " + err);
         });

         navigator.mediaDevices.getUserMedia({video: false,audio: true}).then(function(mic) {
            audio.srcObject = mic;
            audiorecorder = RecordRTC(microphone,options);
            audiorecorder.startRecording();
         }).catch(function(err) {
            console.log("An error occurred: " + err);
         });
      });

      stopbutton.addEventListener('click',function(){
         this.disabled = true;
         videorecorder.stopRecording(stopVideoRecordingCallback);
         audiorecorder.stopRecording(stopAudioRecordingCallback);
         downloadbutton.style.display = block;
      });
   </script> 
</body> 
</html>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。