Загрузите или отправьте создание файла с помощью средства записи мультимедиа в Wordpress - PullRequest
0 голосов
/ 07 августа 2020

Я новичок в wordpress и веб-разработке в целом, но я ищу решение, чтобы сделать следующее. У меня есть код javascript, который может создавать видео с помощью средства записи мультимедиа, и еще один сценарий php для загрузки файла на сервер. Вне WP это работает нормально, но мне трудно заставить его работать в WP с использованием Unlimited Element. Мне нужно использовать Unlimited Elements, чтобы его можно было легко добавить в Elementor.

window.onload = function() {
    document.getElementById('Recorded').style.display = 'none';
};

// let reset = document.getElementById('btnReset');
//     reset.addEventListener('click', function(){
//         document.getElementById("RealTime").Style.display = 'block';
//         document.getElementById("Recorded").style.display = 'none';
//     })


let constraintObj = { 
    audio: true, 
    video: { 
        //facingMode: "user", 
        // facingMode: "environment", 
        // width: { min: 640, ideal: 1280, max: 1920 },
        // height: { min: 480, ideal: 720, max: 1080 } 
        width: { min: 320, ideal: 320, max: 320 },
        height: { min: 240, ideal: 240, max: 240 } 
    } 
}; 

// width: 1280, height: 720  -- preference only
// facingMode: {exact: "user"}
// facingMode: "environment"

//handle older browsers that might implement getUserMedia in some way
if (navigator.mediaDevices === undefined) {
    navigator.mediaDevices = {};
    navigator.mediaDevices.getUserMedia = function(constraintObj) {
        let getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
        if (!getUserMedia) {
            return Promise.reject(new Error('getUserMedia is not implemented in this browser'));
        }
        return new Promise(function(resolve, reject) {
            getUserMedia.call(navigator, constraintObj, resolve, reject);
        });
    }
}else{
    navigator.mediaDevices.enumerateDevices()
    .then(devices => {
        devices.forEach(device=>{
            console.log(device.kind.toUpperCase(), device.label);
            //, device.deviceId
        })
    })
    .catch(err=>{
        console.log(err.name, err.message);
    })
}

navigator.mediaDevices.getUserMedia(constraintObj)
.then(function(mediaStreamObj) {
    //connect the media stream to the first video element
    let video = document.querySelector('video');
    if ("srcObject" in video) {
        video.srcObject = mediaStreamObj;
    } else {
        //old version
        video.src = window.URL.createObjectURL(mediaStreamObj);
    }
    
    video.onloadedmetadata = function(ev) {
        //show in the video element what LIVE is being captured by the webcam
        video.play();
    };
    
    //add listeners for saving video/audio
    let start = document.getElementById('btnStart');
    let stop = document.getElementById('btnStop');
    let vidSave = document.getElementById('vid2');

    var options;
    if (MediaRecorder.isTypeSupported('video/webm;codecs=vp9')) {
        options = {mimeType: 'video/webm; codecs=vp9'};
    } else if (MediaRecorder.isTypeSupported('video/webm;codecs=vp8')) {
        options = {mimeType: 'video/webm; codecs=vp8'};
    } else {
    // ...
    }

    let mediaRecorder = new MediaRecorder(mediaStreamObj, options);
    let chunks = [];
    let interval = 10 * 1000; // Stop recording after xx * seconds
    var refreshIntervalId;
    
    start.addEventListener('click', (ev)=>{
        mediaRecorder.start();
        console.log(mediaRecorder.state);
        if (mediaRecorder.state = 'recording') {
            start.disabled = true;
            // Stop after x seconds (1000 = 1sec)
            refreshIntervalId = setInterval(clickButton, interval);

            // force to stop recording
            function clickButton() { 
                document.querySelector('#btnStop').click(); 
            }
        }
    })
    stop.addEventListener('click', (ev)=>{
        mediaRecorder.stop(); // stop the recording
        video.pause(); // stop the real-time video object
        // clear the interval time
        clearInterval(refreshIntervalId);
        start.disabled = false;
        console.log(mediaRecorder.state);
        
        // hide the real-time video element
        var x = document.getElementById("RealTimeVideo")
        if (x.style.display = "block") {
            x.style.display = "none";
        }
        // unhide the recorded video element
        var y = document.getElementById("Recorded")
        if (y.style.display = "none") {
            y.style.display = "block";
        }
        
    });
    mediaRecorder.ondataavailable = function(ev) {
        chunks.push(ev.data);
    }
    mediaRecorder.onstop = (ev)=>{
        let blob = new Blob(chunks, { 'type' : 'video/webm;' });
        chunks = [];
        let videoURL = window.URL.createObjectURL(blob);
        vidSave.src = videoURL;
        //console.log(blob);

        // generating a random file name
        var fileName = getFileName('webm');

        // we need to upload "File" --- not "Blob"
        var fileObject = new File([blob], fileName, {
            type: 'video/webm'
        });

        // declare constants for uploading the recorded video
        const url = 'uploadVideo.php' // the url where the video needs to be uploaded
        const form = document.querySelector('form')

        form.addEventListener('submit', (e) => {
        e.preventDefault(); // prevent page refresh (we'll use fetch, an async method)

        // create the formdata object
        const formData = new FormData()
        formData.append('files[]', fileObject, fileName);

        // invoke the fetch method the post the recorded video
        fetch(url, {
            method: 'POST',
            body: formData,
            }).then((response) => {
                console.log(response)
            })
        })
    }
})
.catch(function(err) { 
    console.log(err.name, err.message); 
});

// this function is used to generate random file name
function getFileName(fileExtension) {
    var d = new Date();
    var year = d.getUTCFullYear();
    var month = d.getUTCMonth() + 1;
    var day = d.getUTCDate();
    return 'Recording-' + year + month + day + '-' + getRandomString() + '.' + fileExtension;
}

function getRandomString() {
    if (window.crypto && window.crypto.getRandomValues && navigator.userAgent.indexOf('Safari') === -1) {
        var a = window.crypto.getRandomValues(new Uint32Array(3)),
            token = '';
        for (var i = 0, l = a.length; i < l; i++) {
            token += a[i].toString(36);
        }
        return token;
    } else {
        return (Math.random() * new Date().getTime()).toString(36).replace(/\./g, '');
    }
}

Ниже приведен PHP код загрузки видео. php.

<?php 

session_start();
$uuid = $_SESSION["uuid"];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// if(isset($_POST['but_submit'])){
    if (isset($_FILES['files'])) {
        $errors = [];
        $path = 'uploads/';
        $extensions = ['mp4', 'webm'];

        $all_files = count($_FILES['files']['tmp_name']);

        for ($i = 0; $i < $all_files; $i++) {
            $file_name = $_FILES['files']['name'][$i];
            $file_tmp = $_FILES['files']['tmp_name'][$i];
            $file_type = $_FILES['files']['type'][$i];
            $file_size = $_FILES['files']['size'][$i];
            $file_ext = strtolower(end(explode('.', $_FILES['files']['name'][$i])));

            $file = $path . $file_name;

            if (!in_array($file_ext, $extensions)) {
                $errors[] = 'Extension not allowed: ' . $file_name . ' ' . $file_type;
            }

            if ($file_size > 2097152) {
                $errors[] = 'File size exceeds limit: ' . $file_name . ' ' . $file_type;
            }

            if (empty($errors)) {
                move_uploaded_file($file_tmp, $file);
            }
        }

        if ($errors) print_r($errors);
    }

    // Insert the created video into the DB - videos

    include_once 'dbConn.php';    

    $sql = "INSERT INTO videos (videoName, uuid) values ('$file_name', '$uuid')";

    if (mysqli_query($conn, $sql)) {
        echo mysqli_error($conn);
    }
    else
    {
        echo "Records added successfully.";
    }

    mysqli_close($conn); // Close connection
}

Кроме того, у меня есть код html для отображения кнопок.

<div class="wrapper">
    <button class="button" id="btnStart">START RECORDING</button>
    <button class="button" id="btnStop">STOP RECORDING</button>
    <button class="button" id="btnReset">Reset</button>
</div>

Заранее благодарим вас за помощь. Жорж

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...