Как мне загрузить аудио+видео как один на сервер?

Как загрузить аудио+видеозаписи на основе RecordRTC на сервер в формате одного файла?

RecordRTC создает два отдельных файла: один для аудио (как WAV), а другой для видео (как WebM). Как загрузить оба файла одновременно на PHP-сервер?


person Muaz Khan    schedule 27.03.2016    source источник


Ответы (1)


Поскольку Chrome >=49, RecordRTC теперь использует MediaRecorder API для поддержки записи с микрофона и веб-камеры в единый формат файла WebM.

Вот как записать аудио и видео в один WebM (это работает как в Chrome >= 49, так и в Firefox >= 38)

<script src="https://cdn.WebRTC-Experiment.com/gumadapter.js"></scrip>
<script>
var recorder;

function successCallback(audioVideoStream) {
    recorder = RecordRTC(audioVideoStream, {
        type: 'video',
        mimeType: 'video/webm',
        bitsPerSecond: 512 * 8 * 1024
    });
    recorder.startRecording();
}

function errorCallback(error) {
    // maybe another application is using the device
}

var mediaConstraints = {
    video: true,
    audio: true
};

navigator.mediaDevices.getUserMedia(mediaConstraints).then(successCallback).catch(errorCallback);

document.querySelector('#btn-stop-recording').onclick = function() {
    if (!recorder) return;
    recorder.stopRecording(function() {
        var audioVideoBlob = recorder.blob;

        // you can upload Blob to PHP/ASPNET server
        uploadBlob(audioVideoBlob);

        // you can even upload DataURL
        recorder.getDataURL(function(dataURL) {
            $.ajax({
                type: 'POST',
                url: '/save.php',
                data: {
                    dataURL: dataURL
                },
                contentType: 'application/json; charset=utf-8',
                success: function(msg) {
                    alert('Successfully uploaded.');
                },
                error: function(jqXHR, textStatus, errorMessage) {
                    alert('Error:' + JSON.stringify(errorMessage));
                }
            });
        });
    });
};

function uploadBlob(blob) {
    var formData = new FormData();
    formData.append('file', blob);
    $.ajax({
        url: "/save.php",
        type: "POST",
        data: formData,
        processData: false,
        contentType: false,
        success: function(response) {
            alert('Successfully uploaded.');
        },
        error: function(jqXHR, textStatus, errorMessage) {
            alert('Error:' + JSON.stringify(errorMessage));
        }
    });
}
</script>

Вот пример файла save.php, который читает для video-filename и video-blob:

<?php
foreach(array('video', 'audio') 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);
    }
}
?>

Выше save.php требуются следующие FormData:

function uploadBlob(blob) {
    var formData = new FormData();
    formData.append('video-blob', blob);
    formData.append('video-filename', 'FileName.webm');
    $.ajax({
        url: "/save.php",
        type: "POST",
        data: formData,
        processData: false,
        contentType: false,
        success: function(response) {
            alert('Successfully uploaded.');
        },
        error: function(jqXHR, textStatus, errorMessage) {
            alert('Error:' + JSON.stringify(errorMessage));
        }
    });
}
person Muaz Khan    schedule 27.03.2016
comment
Нужна помощь в смежной теме recordrtc ondataavailable вызывается дважды, только первый файл правильный, остальные - c">stackoverflow.com/questions/57786036/ - person Noor; 28.04.2021