Los nuevos paradigmas de computación como el Cloud Computing y los escenarios sugeridos en torno a la Internet del Futuro indican la próxima prevalencia de Web como entorno de ejecución de aplicaciones. Los desarrollos de estándares que posibilitan este cambio tienen a HTML5 como referencia. Sin embargo, a pesar de las múltiples APIs que han sido desarrolladas para igualar o incluso superar a tecnologías web anteriores a este estándar, la funcionalidad de reproducción, generación y análisis de audio está todavía en una fase definitoria en la que varias implementaciones compiten por lograr ser reconocidas como el estándar de facto. En esta presentación repasaremos estas API, aportando explicaciones de su funcionalidad y ejemplos de su uso.
2. Agenda
● Introducción a HTML5.
● ¿Cómo ha sido el audio en la Web hasta ahora?
● Las nuevas API de audio para la Web:
● Audio Data API.
● Web Audio API.
● Otras API multimedia para la Web.
● Conclusiones
4. Timed
Canvas Web
media
2D API playback Storage
MIME type
and protocol Document
handler
Microdata
editing
registration
Cross-
Browser Drag
document
history messaging & drop
5. Web
Geolocation SQL File API
Database
WebGL SVG CSS3
The
Web Indexed Web
Workers Database sockets
API
22. MP3 WAV OGG
Internet Explorer 9 a
Firefox 4.0+ a a
Google Chrome 6+ a a a
Apple Safari 5+ a a
Opera 10.6+ a a
El caos de los códecs
23. <audio controls="controls">
<source src="song.ogg" type="audio/ogg" />
<source src="song.mp3" type="audio/mp3" />
Your browser does not support the audio tag.
</audio>
¿Solución? Múltiples sub-elementos source
24. Pero... HTML5 no se ha
limitado a incluir <video>
para mejorar el aspecto
visual
25. Canvas
SVG
2D API
WebGL
request
Animation ...
Frame
26. ¡Qué bueno sería tener una
API estándar en HTML5 para
manipular audio!
27. Las nuevas API de audio
para la Web
(nuevas → más de una, no hay un solo estándar)
30. Propuesta por Mozilla
(implementada en FF4+)
Extiende <audio> y <video>
API basada en eventos
(loadedmetadata, MozAudioAvailable)
Audio Data API
31. Evento estándar
Definido en HTML5
+ mozChannels
Metadatos adicionales mozSampleRate
mozFrameBufferLength
Audio Data API: evento loadedmetadata
32. Generado cada vez que un fragmento de audio está disponible
(≠ ritmo de reproducción del audio)
Array de audio decodificado
(floats en crudo, sin información de volumen, etc.)
Proporciona
Tiempo para esa muestra
(desde el inicio del audio y en segundos)
Audio Data API: evento MozAudioAvailable
33. var channels,
rate,
frameBufferLength,
samples;
function audioInfo() {
var audio = document.getElementById('audio');
// Metadatos propios de la Audio Data API
channels = audio.mozChannels;
rate = audio.mozSampleRate;
frameBufferLength = audio.mozFrameBufferLength;
}
function audioAvailable(event) {
var samples = event.frameBuffer,
time = event.time;
for (var i = 0; i < frameBufferLength; i++) {
// processSample hará lo que sea necesario con el audio
processSample(samples[i], channels, rate);
}
}
Audio Data API: leer audio y procesarlo
34. // Creamos un elemento <audio>
var audioOutput = new Audio();
// Lo configuramos con dos canales a 44.1 KHz
audioOutput.mozSetup(2, 44100);
// Preparamos un array con las muestras y las escribimos
var samples = [0.242, 0.127, 0.0, -0.058, -0.242, ...];
var numberSamplesWritten = audioOutput.mozWriteAudio(samples);
// Obtenemos la posición actual del flujo de audio
// medida en muestras
var currentSampleOffset = audioOutput.mozCurrentSampleOffset();
Audio Data API: escribir audio
40. Propuesta por Google
(implementada en Chrome10+)
AudioContext y AudioNode
(poco que ver con <audio>)
API a alto nivel
(mucha funcionalidad ya implementada)
Web Audio API
41. AudioSourceNode
(AudioBufferSourceNode,
MediaElementAudioSourceNode,
JavaScriptAudioNode)
AudioDestinationNode
DelayNode
AudioContext retardos ajustables
AudioGainNode
ganancia
AudioPannerNode
↓
audio en 3D
AudioNodes ConvolverNode
efectos de espacio, reverb
BiquadFilterNode
filtros paso-bajo, paso-alto, paso-banda...
WaveShaperNode
efectos no-lineales, distorsiones
DynamicsCompressorNode
efectos de compresión / expansión
RealtimeAnalyserNode
análisis en tiempo real
42. var context = new webkitAudioContext();
var buffer = context.createBuffer(1, BUFFER_SIZE, SAMPLE_RATE);
var bufferData = buffer.getChannelData(0);
var samples = (duration / 1000) * SAMPLE_RATE;
for (i = 0; i < samples; i++) {
bufferData[i] = Math.sin(pitch * PI_2 * i / SAMPLE_RATE);
}
var source = context.createBufferSource();
source.buffer = buffer;
source.connect(context.destination);
source.noteOn(0);
Web Audio API: hacer sonar un tono
44. var gainNode = context.createGainNode();
source.connect(gainNode);
gainNode.connect(context.destination);
gainNode.gain.value = 0.5;
Web Audio API: conectar un nodo de ganancia
45. AudioContext
AudioSourceNode A AudioSourceNode B AudioSourceNode C
Waveshaper
LowPass Filter Panner
Distortion
Dry A
Dry B Wet A Wet B Dry C
Dry C
Convolution
Dry Master Gain
Reverb
Dynamics
Compressor
AudioDestinationNode
53. Objetivo: proporcionar Comunicación en Tiempo Real en la Web
Sin plugins, sin instalaciones extra, etc.
Solamente JavaScript y HTML5 (+ API en C++ en el navegador)
Escenarios: streaming, videoconferencia, etc.
(implementación funcional para Google Chrome)
WebRTC API
56. Propuesta de Ian Hickson para la gestión de
múltiples flujos multimedia en HTML5
HTML MediaController API
Sincronización de elementos multimedia en HTML
Relacionada con... Captura y grabación de audio y vídeo local
Otras API de gestión de streaming multimedia
HTML Streams API
58. Objetivo: API común que englobe a todas las
que gestionan contenido multimedia en tiempo real
HTML5 <audio> y <video>
HTML Streams API HTML MediaController
Audio Data API Web Audio API
WebRTC API
MediaStream Processing API
76. Referencias
● Web Audio API, W3C Audio Group Proposal
● Getting Started with Web Audio API, HTML5 Rocks Tutorials
● Web Audio Examples
● Audio Data API, MozillaWiki
● Mozilla Audio Data API
● WebRTC
● WebRTC MediaStream Integration
● MediaStream Processing API, Draft Proposal
● HTML5 Audio APIs - How Low can we Go?, Mark Boas
77. Todas las imágenes son propiedad de sus
respectivos dueños*, el resto del
contenido está licenciado con la licencia
Creative Commons by-sa 3.0
* W3C, WHATWG, Google, Memegenerator.net, Troll.me