es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El audio en base64 codificado en vivo grabado desde MediaRecorder está dañado.

He escrito una página simple en JS y PHP para grabar audio en vivo desde el micrófono. La lógica es simple:

JS
1. Obtener fragmento de datos del micrófono;
2. Codificarlo en Base64 y codificarlo en URL;
3. Enviarlo mediante una solicitud POST;

PHP

  1. Decodificar los datos en Base64;
  2. (Re)Escribir en un archivo .ogg;
  3. Repetir el paso 1 después de un retardo.

Los datos se escriben correctamente en el archivo, pero cuando intento reproducirlo, el reproductor dice que el archivo está dañado.

La solución de blob de la guía de Mozilla me funcionó, quiero una solución exactamente en PHP con guardado (sobrescritura) en un archivo.

A continuación se muestra el código completo, ¿qué estoy haciendo mal?

<?php
if(isset($_POST["data"]))
{
file_put_contents("r.ogg", base64_decode($_POST["data"]));
exit;   
}
?>

<script>
var mediaRecorder = null;
let chunks = [];

if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
   console.log('getUserMedia soportado.');
   navigator.mediaDevices.getUserMedia (
      {
         audio: true
      })
      .then(function(stream) {
        mediaRecorder = new MediaRecorder(stream);
        mediaRecorder.start(2000);

        mediaRecorder.ondataavailable = function(e) {
            chunks.push(e.data);
            const blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });
            chunks = [];
            var reader = new FileReader();
            reader.readAsDataURL(blob); 
            reader.onloadend = function() {
            var data = reader.result.split(";base64,")[1]; 
            requestp2("a.php", "data="+encodeURIComponent(data));
            }
}
      })
      .catch(function(err) {
         console.log('Ocurrió el siguiente error al obtener el usuario de medios: ' + err);
      }
   );
} else {
   console.log('¡getUserMedia no es compatible en su navegador!');
}

function requestp2(path, data)
{
var http = new XMLHttpRequest();
http.open('POST', path, true);
http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
http.send(data);
}
</script>
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Problema con el código PHP para grabar audio en vivo desde el micrófono

    El usuario es un experto en TI especializado en javascript, php, base64 y web-mediarecorder. Ha creado una página simple utilizando JS y PHP para grabar audio en vivo desde el micrófono. La lógica para grabar audio es simple:

    JS

    1. Obtener un fragmento de datos del micrófono;
    2. Codificar los datos en base64 y codificar la URL;
    3. Enviarlos mediante una solicitud POST;

    PHP

    1. Decodificar en base64 los datos;
    2. (Re)escribirlos al archivo .ogg;
    3. Repetir el paso 1 después de un retraso.

    Aunque los datos se escriben correctamente en el archivo, al intentar reproducirlo, el reproductor informa que el archivo está dañado. El usuario ha probado la solución utilizando blob de la documentación de Mozilla y funcionó. Sin embargo, están buscando específicamente una solución en PHP para reescribir y guardar en un archivo.

    El problema parece estar en el código PHP, que se muestra a continuación:

    if(isset($_POST["data"]))
    {
        file_put_contents("r.ogg", base64_decode($_POST["data"]));
        exit;   
    }
    

    Aquí, r.ogg es el nombre del archivo donde se almacenan los datos grabados, y $_POST["data"] es el dato codificado que se recibe a través de la solicitud POST. Los datos decodificados se escriben en el archivo utilizando file_put_contents().

    Para solucionar este problema, el usuario puede modificar el código PHP de la siguiente manera:

    if(isset($_POST["data"]))
    {
        $decoded = base64_decode($_POST["data"]);
        $file = "r.ogg";
        $fp = fopen($file, "a");
        fwrite($fp, $decoded);
        fclose($fp);
        exit;   
    }
    

    Este código crea un nuevo archivo llamado r.ogg y agrega los datos decodificados utilizando fwrite(). Finalmente, se utiliza fclose() para cerrar el archivo.

    Al utilizar este código PHP modificado, el usuario debería poder grabar y guardar archivos de audio desde el micrófono correctamente.

Comments are closed.