javascript - RecordRTC:Ondataavailable 调用了两次。只有第一个文件是正确的,其他文件已损坏或太小

标签 javascript webrtc mediarecorder recordrtc rtcpeerconnection

<分区>

我想以 2 秒的间隔记录本地和远程流,并使用 Ajax 将其上传到服务器。但问题是,ondataavailable 方法被调用了两次,所以同一个视频被两次上传到服务器。第一个视频可以正常播放,而其余视频要么损坏要么非常小(不到一秒)。所有视频的大小几乎相同!

我也尝试过使用 MediaRecorder API,但问题是一样的。我尝试了 5 秒的间隔,但仍然没有成功!

这是我获取本地流的方式:

navigator.mediaDevices.getUserMedia({
    video: false,
    audio: true
}).then(function (myStream) {
    localStream = myStream;

    localStream.getTracks().forEach(function (track) {
        yourConn.addTrack(track, localStream);
    });
}).catch(function (error) {
    streamAdded = false;
    console.warn('Could not detect microphone');
    return false;
});

这是我进行录音的方式:

yourConn.ontrack = function (e) {
   remoteVideo.srcObject = e.streams[0];

   let recorder = RecordRTC([localStream, e.streams[0]], {
      mimeType: 'video/webm;codecs=h264',
      type: 'video',
      timeSlice: 5000,
      ondataavailable: function(blob) {
        uploadBlob(blob);
      },
   });

   recorder.startRecording();
}

uploadBlob 函数:

var formData = new FormData();
formData.append('recorded_file', mp4File);

$.ajax({
    url: myURL,
    data: formData,
    cache: false,
    contentType: false,
    processData: false,
    type: 'POST',
    success: function (response) {
        console.log(response);
    }
});

我怎样才能毫无问题地录制两个流?

最佳答案

(这个答案涵盖了 MediaRecorder ,虽然我怀疑它也适用于 RecordRTC JS 库。)

timeSlice: 5000 参数将记录分成 block ,每 5 秒调用一次 dataavailable。但是这些 block 不能独立播放。您应该加入他们 like this创建有效的媒体容器文件:

const data = [];
recorder.ondataavailable = e => data.push(e.data);
recorder.onstop = () => uploadBlob(new Blob(data, {type: data[0].type}));

如果最后上传所有内容不切实际,您可以改为尝试加入服务器上的 blob。

关于javascript - RecordRTC:Ondataavailable 调用了两次。只有第一个文件是正确的,其他文件已损坏或太小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57786036/

相关文章:

javascript - HTML DOM getElementById()-Node JS

kubernetes - 如何在 Kubernetes 上使用 WebRTC 和 RTCPeerConnection?

Android - 记录时检查文件大小

android - 如何在内部存储Android中保存音频文件

java.lang.IllegalStateException 在 android.media.MediaRecorder

javascript - 如何在 React JS 中为 div 动态设置类名

javascript - 访问css3动画的关键帧

javascript - Bootstrap Popover 无法始终如一地工作

android - 在特定的分支头上构建 WebRTC

javascript - 为什么用户加入房间时视频不显示?