Por razones de seguridad mayormente, no tengo permitido almacenar un archivo WAV en el servidor al que se accede mediante un navegador. Lo que tengo es una matriz de bytes que contiene datos de audio (creo que la parte de datos de un archivo WAV) en el servidor, y quiero que se reproduzcan en un navegador a través de JavaScript (o Applet, pero se prefiere JS), puedo usar JSON- PRC para enviar todo el byte [], o puedo abrir un socket para transmitirlo, pero en cualquier caso, ¿no sé a quién tocar el byte [] dentro del navegador?Cómo jugar matriz de bytes de audio (¡no archivo!) Con JavaScript en un navegador
Respuesta
sospecho que puede lograr esto con API HTML5 de audio con bastante facilidad:
https://developer.mozilla.org/en/Introducing_the_Audio_API_Extension
Esta biblioteca puede ser útil también, aunque no estoy seguro de si refleja los últimos comportamientos del navegador:
El siguiente código reproducirá la onda sinusoidal en 0.5 y 2.0. Llame a la función play_buffersource()
en su botón o en cualquier lugar que desee.
Probado usando Chrome con el indicador de Web Audio habilitado. Para su caso, todo lo que necesita hacer es simplemente mezclar sus bytes de audio al buf
.
<script type="text/javascript">
const kSampleRate = 44100; // Other sample rates might not work depending on the your browser's AudioContext
const kNumSamples = 16834;
const kAmplitute = 440;
const kPI_2 = Math.PI * 2;
function play_buffersource() {
if (!window.AudioContext) {
if (!window.webkitAudioContext) {
alert("Your browser sucks because it does NOT support any AudioContext!");
return;
}
window.AudioContext = window.webkitAudioContext;
}
var ctx = new AudioContext();
var buffer = ctx.createBuffer(1, kNumSamples, kSampleRate);
var buf = buffer.getChannelData(0);
for (i = 0; i < kNumSamples; ++i) {
buf[i] = Math.sin(kAmplitute * kPI_2 * i/kSampleRate);
}
var node = ctx.createBufferSource(0);
node.buffer = buffer;
node.connect(ctx.destination);
node.noteOn(ctx.currentTime + 0.5);
node = ctx.createBufferSource(0);
node.buffer = buffer;
node.connect(ctx.destination);
node.noteOn(ctx.currentTime + 2.0);
}
</script>
Referencias:
- http://epx.com.br/artigos/audioapi.php
- https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html
Si necesita volver a muestrear el audio, se puede utilizar una resampleador JavaScript: https://github.com/grantgalitz/XAudioJS
Si necesita decodificar los datos de base64, hay muchos del decodificador JavaScript base64: https://github.com/carlo/jquery-base64
¡esto no funciona en Firefox! ¿No hay una manera de hacerlo funcionar? – mkazma
Si tiene los bytes en el servidor, le sugiero que cree algún tipo de controlador en el servidor que transmita los bytes a la respuesta como un archivo wav. Este "archivo" solo estaría en la memoria en el servidor y no en el disco. Entonces el navegador puede manejarlo como un archivo wav normal. Se necesitarán más detalles sobre la pila del servidor para proporcionar más información sobre cómo se podría hacer esto en su entorno.
Lo logré mediante el siguiente código. Paso en una matriz de bytes que contiene los datos del archivo wav a la función playByteArray. Mi solución es similar a la de Peter Lee, pero no pude hacer que la suya funcionara en mi caso (la salida fue distorsionada) mientras que esta solución funciona bien para mí. Verifiqué que funciona en Firefox y Chrome.
window.onload = init;
var context; // Audio context
var buf; // Audio buffer
function init() {
if (!window.AudioContext) {
if (!window.webkitAudioContext) {
alert("Your browser does not support any AudioContext and cannot play back this audio.");
return;
}
window.AudioContext = window.webkitAudioContext;
}
context = new AudioContext();
}
function playByteArray(byteArray) {
var arrayBuffer = new ArrayBuffer(byteArray.length);
var bufferView = new Uint8Array(arrayBuffer);
for (i = 0; i < byteArray.length; i++) {
bufferView[i] = byteArray[i];
}
context.decodeAudioData(arrayBuffer, function(buffer) {
buf = buffer;
play();
});
}
// Play the loaded file
function play() {
// Create a source node from the buffer
var source = context.createBufferSource();
source.buffer = buf;
// Connect to the final output node (the speakers)
source.connect(context.destination);
// Play immediately
source.start(0);
}
¿Qué está destinado a hacer bufferView? – patrickdamery
@patrickdamery es una composición sobre el búfer que se usa para mutar su contenido (es por eso que no ve más uso después de que finaliza la iteración) –
- 1. de audio no jugar en el iPad
- 2. ¿Recibir arreglos de bytes de audio con HTML5 Audio API?
- 3. Reproducir matriz de bytes en MediaPlayer - Android
- 4. Convertir flujo de audio a matriz de bytes WAV en Java sin archivo temporal
- 5. Leyendo un archivo en una matriz de bytes (PHP)
- 6. Abrir archivo de la matriz de bytes
- 7. conversión de matriz de bytes en cadena en javascript
- 8. PCM Raw Bytes [] Para audio en Android
- 9. Convertir matriz de bytes a archivo wav
- 10. Reproducción de audio con HTML5 en el navegador de Android
- 11. ¿Cómo convierto una matriz de bytes en un archivo y lo abro automáticamente con C#?
- 12. Inserte una matriz de bytes en otra matriz de bytes en una posición específica con C#
- 13. Grabación de audio en el navegador
- 14. Almacenamiento de un hash como matriz de bytes con JPA
- 15. elemento de audio no se mostrará/iframe jugar adentro en Firefox
- 16. ¿Leyó un archivo de Excel en la memoria (matriz de bytes) con ADO.NET?
- 17. Java: ¿Cómo "recortar" una matriz de bytes?
- 18. matriz de bytes en groovy
- 19. no se puede jugar ogg en android
- 20. Convertir matriz de bytes de formato de audio wav al punto flotante
- 21. matriz de bytes a matriz corta y viceversa en java
- 22. Leer línea de matriz de bytes (no convertir matriz de bytes a cadena)
- 23. ¿Cómo sobrescribir algunos bytes de un archivo binario con dd?
- 24. Conversión de bytes sin formato en sonido de audio
- 25. ¿Cómo convierto una matriz de bytes Java en una matriz de bytes Scala?
- 26. AVAudioPlayer deja de jugar inmediatamente con ARC
- 27. Cómo convertir imágenes en matriz de bytes
- 28. Cómo almacenar una matriz de bytes como un archivo de imagen en el disco?
- 29. ¿Cómo reproducir un video de una matriz de bytes?
- 30. Cómo dividir una matriz de bytes
Gracias! Pero esto parece usar una muestra flotante, mi audio wav de datos brutos es mono 16K Hz y base64 bytes, ¿necesito convertirlo? ¿Cómo? –
El primer enlace dice que esta función ahora está en desuso, y el reemplazo https://developer.mozilla.org/en-US/docs/Web_Audio_API#Browser_compatibility no es compatible con Internet Explorer. ¿Hay alguna solución que funcione para todos los navegadores? –
@Pi Por supuesto que no. Es un estándar ahora. ¿Por qué IE implementaría un estándar? No seas tonto! – Rushyo