Add tracks or create new Stream ending with Media Recorder ending up corrupted file

Viewed 312

this is the last post which answer where my goal is in developing my project: RecordRTC with sending video chunks to server and record as webm or mp4 on server side. After recording the screen sharing stream, I decide to move forward to add video tracks to screen sharing. There are two ways for me to do it, by using addTracks function or create a new stream with contain the video from the screen sharing and audio from my media. However, both of them resulting me in the previous error in the aforementioned link: corrupted video.

FYI: Here is the link for anyone who wants to read more about Media Recorder: https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder

P/S: If you encourage me on switching to webRTC again, I would be appreciated if you could help me in solving the issue - the file ends up corrupted when using webRTC - in aforementioned link?

Here is the code from my backend and frontend:

Client code:

startMedia = ()=>{
      this.setState({mediaState:"pending"})
      navigator.mediaDevices.getDisplayMedia({video: true}).then( async (screenSharingStream)=>{
          console.log(MediaRecorder.isTypeSupported('video/webm; codecs=vp8,opus'))
          const socketIO = io.connect(baseURL,{query: {candidateID: this.candidateID,roundTest:this.roundTest }})
          const mediaStream = await navigator.mediaDevices.getUserMedia({video:true,audio:true}).catch(e => {throw e});
          const mediaReCorderoptions = {
            videoBitsPerSecond : 128000,
            audioBitsPerSecond:128000,
            mimeType : 'video/webm; codecs=vp8,opus'
          }
          
          const [videoTrack] = screenSharingStream.getVideoTracks();
          const [audioTrack] = mediaStream.getAudioTracks();
          if (audioTrack && videoTrack) 
            videoTrack.addTrack(audioTrack)
          
          const stream = new MediaStream([videoTrack, audioTrack]);
          this.socketRef.current = socketIO;
          this.mediaStream = mediaStream

          this.screenSharingStream = stream 
          this.candidateVideoRef.current.srcObject = this.mediaStream;
          this.mediaRecorder = new MediaRecorder(this.screenSharingStream,mediaReCorderoptions)
          this.mediaRecorder.ondataavailable = function(event){
            if (event && event.data.size>0){
              const reader = new FileReader();
              reader.onload = function(){
                const dataURL = reader.result;
                console.log('van chay')
                const base64EncodedData = dataURL.split(',')[1];
                //console.log(buffer)
                socketIO.emit('SEND BLOB',base64EncodedData)
              }
              reader.readAsDataURL(event.data)
            }
          }
          this.mediaRecorder.start(1000)
          this.setState({mediaState:this.mediaRecorder.state})

                  

      }).catch(err=>{
          console.log(err.name)
          switch(err.name){
            case 'NotAllowedError':
              message.error('Candidate does not allow!!')
              this.setState({mediaState:"Aborting"})
              break;
            default:
              message.error('System Error. Please contact us!')
              this.setState({mediaState:"Aborting"})
              break;
          }
      })
    
  }
  stopMedia = () =>{
      if (this.mediaStream){
        this.mediaStream.getTracks().forEach((track)=>{
          if (track.readyState==='live') {
            track.stop()
            this.candidateVideoRef.current.style.display='none';
          }})
      }
      if (this.screenSharingStream) {
        this.mediaRecorder.stop()
        this.setState({mediaState:this.mediaRecorder.state})
      }
  }

Server code:

socket.on("SEND BLOB",chunk=>{
        try {
        //if (chunk instanceof Buffer){
            const fileExtension = '.webm'
            const  dataBuffer = new Buffer(chunk, 'base64');
            const fileStream = fs.createWriteStream(path.join(__dirname,'./videos/candidate/',candidateID + '-' + roundTest + fileExtension), {flags: 'a'});
            fileStream.write(dataBuffer);
        }
        catch(e){
            console.log(e)
        }
})
0 Answers
Related