2011-07-06 22 views
16

Estoy recibiendo datos de audio PCM del servidor en trozos pequeños y los tengo almacenados en una matriz. Ahora me gustaría reproducir estos fragmentos de audio de forma secuencial y sin espacios utilizando algunas capacidades HTML5. Hay dos opciones, que estoy mirando como 'posibles' soluciones son:Transmisión de datos de audio en HTML5

etiqueta
  1. HTML5 de audio con Data URI
  2. Web audio API

Mientras estoy investigando estas opciones, por favor me sugieren cualquier otra opción o vistas en las dos opciones que estoy viendo Aunque una solución multiplataforma será la mejor pero puedo conformarme con la solución única de Chrome como

Respuesta

2

La opción 1 probablemente no funcionará porque la etiqueta de audio no reproduce datos de audio en bruto (que supongo que es lo que quiere decir con audio PCM datos, o estoy equivocado?). Cada navegador necesita códecs específicos. Para colmo, la etiqueta de audio no es confiable en absoluto para reproducir cosas sin espacios vacíos.

La opción 2 podría funcionar. La API de audio web contiene búferes que probablemente podrían llenarse con datos sin formato y reproducirse, pero nunca he intentado hacerlo. El gran inconveniente en este momento es eso; a. Chrome solo b. el usuario necesita configurar Chrome para que escriba about: flags y active Web Audio, lo que puede dar miedo a algunos.

Una tercera opción sería la API de datos de audio, que es algo así como un término medio. Nunca lo intenté yo mismo, pero desde la especificación parece exactamente lo que estás buscando. No sé sobre implementaciones, así que tendrías que investigar un poco :) https://wiki.mozilla.org/Audio_Data_API#Writing_Audio

Por favor, no es que esté dando estas respuestas por encima de mi cabeza, y sigo siendo bastante nuevo en HTML5 audio.

+1

Tiene razón acerca de no reproducir PCM en bruto, pero los archivos WAV son muy delgados en torno al audio en bruto (donde "envoltorio" significa encabezado de 44 bytes). Se ha hecho, a menudo. Pero ahora, por supuesto, 2 años después, la API de audio web parece ser una mejor apuesta. –

19

Programar audio es algo para lo que se diseñó la API de Web Audio. Si tiene los fragmentos de audio PCM descodificados como matrices tipadas (AUDIO_CHUNKS), puede crear memorias intermedias de audio para cada fragmento y programarlas en un momento exacto (una después de la otra) usando noteOn(). Algo así como:

var startTime = 0; 

for (var i = 0, audioChunk; audioChunk = AUDIO_CHUNKS[i]; ++i) { 
    // Create/set audio buffer for each chunk 
    var audioBuffer = audioCtx.createBuffer(NUM_CHANNELS, NUM_SAMPLES, SAMPLE_RATE); 
    audioBuffer.getChannelData(0).set(audioChunk); 

    var source = audioCtx.createBufferSource(); 
    source.buffer = audioBuffer; 
    source.noteOn(startTime); 
    source.connect(audioCtx.destination); 

    startTime += audioBuffer.duration; 
}