RecordRTC视频上传AmazonS3超时错误

时间:2015-02-12 23:54:54

标签: javascript amazon-s3 html5-video webrtc video-capture

我目前正在开发一个组件,可让您制作网络摄像头视频并将其直接上传到amazon s3。为此,我使用RecordRTC库和Amazon S3存储。我发现了一个奇怪的问题,我不确定它是否与RecordRTC blob或amazon配置有关。当文件大小超过1MB时,Amazon服务器挂起,20秒后返回超时错误。任何人都可以帮我解决这个问题吗?这是我的记录器组件代码(p()与console.log())相同:

navigator.record_function = ( navigator.getUserMedia ||
        navigator.webkitGetUserMedia ||
        navigator.mozGetUserMedia ||
        navigator.msGetUserMedia);
        if (navigator.record_function) {
            navigator.record_function(videoObj, function (stream) {
                video.src = window.URL.createObjectURL(stream);
                video.play();
                $("#stop_recording").click(function () {
                    stream.stop();
                });

                // init recorders
                audio_recorder = RecordRTC(stream, {type: "audio", bufferSize: 16384});
                video_recorder = RecordRTC(stream, videoOptions);

            }, errBack);
        }

$("#start_recording").click(function () {
        // record the audio and video
        video_recorder.startRecording();
        audio_recorder.startRecording();
    });

对于上传者组件:

// Populate the Post paramters.
  fd.append('key', "users/" + Main.current_user.id + "/test.webm");
  fd.append('AWSAccessKeyId', msg.access_key_id);
  fd.append('acl', 'private');
  fd.append('policy', msg.policy);
  fd.append('signature', msg.signature);
  fd.append('Content-Type', '$Content-Type');
  fd.append('x-amz-server-side-encryption', 'AES256');
  fd.append('success_action_status', '201');
  fd.append('name', 'test.webm');
  fd.append('Filename', 'test.webm');
  fd.append("file", file);
  xhr.open('POST', 'https://' + msg.bucket + '.s3.amazonaws.com', true);
  xhr.upload.addEventListener('progress', function (e) {
    p(e);
  }, false);

  xhr.onreadystatechange = function () {
    p(xhr.readyState);
  };

  xhr.send(fd);

    $("#stop_recording").click(function () {

        // stop recorders
        audio_recorder.stopRecording(function () {
                    var audio_blob = audio_recorder.getBlob();
                    p(audio_blob);
                    // VideoUploader.upload_user_audio(audio_blob);
                }
        );
        video_recorder.stopRecording(function () {
            var video_blob = video_recorder.getBlob();
            p(video_blob);
            VideoUploader.upload_user_video(video_blob);
        });
    });

超时时的错误消息是:

Your socket connection to the server was not read from or written to within the timeout period. Idle connections will be closed.

我感谢任何帮助,我真的迷失在这里。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我已经设法为这个问题找到了一个非常奇怪的解决方案。问题似乎来自RecordRTC保存blob对象的方式,这使得无法在Mac上的Firefox 35中上传。我在RecordRTC中找不到导致问题的代码,Blob似乎生成正确,但是对我有用的解决方法是通过Filereader将Blob再次编码为新的Blob。

video_recorder.stopRecording(function () {
            var video_blob = video_recorder.getBlob();
            var arrayBuffer;
            var fileReader = new FileReader();
            fileReader.onload = function (ex) {
                arrayBuffer = this.result;
                video_blob = new Blob([arrayBuffer], {type: "video/webm"});
                VideoUploader.upload_user_video(video_blob)
            };
            fileReader.readAsArrayBuffer(video_blob);
        });

至于为什么会发生这种情况,我不知道,但是使用相同技术的其他项目也会受到影响http://videobooth.herokuapp.com/(在同一个浏览器中完全相同的问题,上传挂起)。也许这些信息可能对从事RecordRTC工作的人有用,因为我认为这种解决方法可以制作成补丁。

在Mac Firefox 35和Mac Chrome 40上测试解决方案。