getUserMedia не загружать после записи

У меня следующая проблема с getUserMedia, я пытаюсь загрузить видео после завершения записи, но, видимо, оно не загружается или не отвечает, может ли кто-нибудь мне помочь? Благодарю.

Когда я нажимаю кнопку «Остановить и загрузить», я получаю нулевой ответ. Мне нужно напрямую загрузить этот файл на веб-сервер.

<div class="content">

<video playsinline poster="./poster.png" onclick="this.play();"></video>
<button id="btn-stop-recording" type="button" disabled>Stop And Upload</button>

<script src="./RecordRTC.js"></script>
//library URL (https://): webrtc-experiment.com/RecordRTC.js
<script>
var video = document.querySelector('video');

function captureCamera(callback) {
    navigator.mediaDevices.getUserMedia({ audio: true, video: true }).then(function(camera) {
        callback(camera);
    }).catch(function(error) {
        alert('Unable to capture your camera. Please check console logs.');
        console.error(error);
    });
}

function stopRecordingCallback() {
    video.src = video.srcObject = null;
    video.muted = false;
    video.volume = 1;
    //video.src = URL.createObjectURL(recorder.getBlob());
    video.src = window.URL.createObjectURL(recorder.getBlob());
    document.write(video.src);
    var fd = new FormData();
    fd.append('fname', 'test.webm');
    fd.append('data', video.srcObject);
    $.ajax({
        type: 'POST',
        url: './true.php',
        data: fd,
        processData: false,
        contentType: false
    }).done(function(data) {
           console.log(data);
    });
}

var recorder; // globally accessible

document.getElementById('btn-start-recording').onclick = function() {
    this.disabled = true;
    captureCamera(function(camera) {
        video.muted = true;
        video.volume = 0;
        video.srcObject = camera;

        recorder = RecordRTC(camera, {
            type: 'video',
            mimeType: 'video/webm'
        });

        recorder.startRecording();

        // release camera on stopRecording
        recorder.camera = camera;

        document.getElementById('btn-stop-recording').disabled = false;
    });
};

document.getElementById('btn-stop-recording').onclick = function() {
    this.disabled = true;
    recorder.stopRecording(stopRecordingCallback);
};
</script>
<div>

Файл true.php >>>>

<?php
foreach(array('video') as $type) {
    if (isset($_FILES["${type}-blob"])) {

        echo 'uploads/';

        $fileName = $_POST["${type}-filename"];
        $uploadDirectory = 'uploads/'.$fileName;

        if (!move_uploaded_file($_FILES["${type}-blob"]["tmp_name"], $uploadDirectory)) {
            echo(" problem moving uploaded file");
        }

        echo($fileName);
    }
}
?>

Судя по логу консоли, файл отправляется на сервер, но при получении php файл не загружается на сервер.

ОТПРАВИТЬ ДАННЫЕ ОТ AJAX CALL:

POST /true.php HTTP/1.1
Host: localhost:9090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0
Accept: */*
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Content-Type: multipart/form-data; boundary=---------------------------39520532461108107029652486848
Content-Length: 644254
Origin: http://localhost:9090
Connection: close
Referer: http://localhost:9090/

-----------------------------39520532461108107029652486848
Content-Disposition: form-data; name="fname"

test.webm
-----------------------------39520532461108107029652486848
Content-Disposition: form-data; name="data"; filename="blob"
Content-Type: video/webm

person Moises23    schedule 06.04.2020    source источник
comment
fd.append('data', video.srcObject); должно быть fd.append('data', recorder.getBlob()).   -  person Kaiido    schedule 06.04.2020
comment
Я получаю нулевой ответ с вашим изменением, не перенаправляйте на true.php   -  person Moises23    schedule 06.04.2020
comment
Нет причин, по которым вас перенаправляют, вы просто выполняете вызов AJAX и удаляете этот document.write, используйте console.log для ведения журнала. И попробуйте записать это возвращаемое значение recorder.getBlob().   -  person Kaiido    schedule 06.04.2020
comment
Здравствуйте, спасибо за ответ, действительно, файл отправляется на веб-сервер, теперь у меня другая проблема. Когда файл php получает, он не загружает его на сервер, я отредактирую сообщение для получения более подробной информации о файле true.php, спасибо, что ваш ответ сработал для меня.   -  person Moises23    schedule 06.04.2020


Ответы (1)


Это сбивает с толку, и, при всем уважении, вы запутались. Запись делает не getUserMedia, а RecordRTC. Данные, которые вы хотите загрузить, — это содержимое большого двоичного объекта, предоставленного вам recorder.getBlob(). И этот Blob содержит двоичные данные; вы не сможете понять его содержимое, если не используете такой пакет, как ebml.

И обратите внимание, что .getBlob() возвращает обещание, поэтому вам нужно .then() знать, когда ваш большой двоичный объект будет готов.

Но ты рядом. Вы хотите загрузить Blob. Несколько изменений, и вы готовы к работе.

function stopRecordingCallback() {
    recorder.getBlob()
    /* getBlob completes normally */
    .then (function(blob) {
        const fd = new FormData()
        fd.append('fname', 'test.webm')
        fd.append('data', blob)
        $.ajax({
            type: 'POST',
            url: './true.php',
            data: fd,
            processData: false,
            contentType: false
        })
        .done(function(data) {
           console.log(data)
    })
    /* getBlob's promise rejected */
    .catch(console.err)
}

Я не отлаживал это, но это близко к тому, что я сделал.

Похоже, вы пытаетесь настроить элемент <video> для предварительного просмотра записанного видео. Если это правда, я предлагаю вам запустить загрузку, а затем запустить предварительный просмотр.

Совет для профессионалов Ваш код для этого мультимедийного материала WebRTC будет короче и намного легче читать, если вы начнете использовать async / await вместо .then() и обратных вызовов. Выяснение async / await — одно из лучших вложений времени, которое вы можете сделать.

person O. Jones    schedule 06.04.2020
comment
Привет, спасибо за ответ, но я просматривал журнал консоли, и если я его отправлял, проблема заключается в получении в php, вы можете снова проверить сообщение, я отредактировал его для лучшего понимания. - person Moises23; 06.04.2020