Download - Las nuevas API de audio en HTML5
![Page 1: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/1.jpg)
LAS NUEVAS API DE AUDIO EN
Pablo Garaizar Sagarminaga
![Page 2: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/2.jpg)
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
![Page 3: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/3.jpg)
¿HTML5?
![Page 4: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/4.jpg)
Timed media
playback
Cross-document messaging
Microdata
Web Storage
Drag& drop
Document editing
Canvas 2D API
Browser history
MIME type and protocol
handler registration
![Page 5: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/5.jpg)
Web SQL
Database
The Indexed Database
API
File API
Websockets
Geolocation
WebWorkers
SVG CSS3WebGL
![Page 6: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/6.jpg)
CSS3JS
APIsHTML5
![Page 7: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/7.jpg)
¿Cómo ha sido el audio en la Web?
![Page 8: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/8.jpg)
<EMBED>
<EMBED src="file.wav" autostart="true" loop="false" volume="100" hidden="true">
<NOEMBED> <BGSOUND src="file.wav"></NOEMBED>
![Page 9: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/9.jpg)
Java
<APPLET CODE="Player" SOUND="file.wav"></APPLET>
![Page 10: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/10.jpg)
Flash
<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' width='300' height='300' id='player' name='player'> <param name='movie' value='player.swf'> <param name='flashvars' value='file=file.wav'></object>
![Page 11: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/11.jpg)
Silverlight
<object style="height: 300px; width: 300px;" type="application/x-silverlight-2" data="data:application/x-silverlight-2,"> <param value="AudioPlayer.xap" name="source"/> <param value="Path=file.wav" name="initParams"/>
<param value="5.0.61118.0" name="minRuntimeVersion"/>
<p>You need to install Microsoft Silverlight to view this content.</p></object>
![Page 12: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/12.jpg)
En resumen...
![Page 13: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/13.jpg)
Elementos HTML no estándar
![Page 14: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/14.jpg)
Abuso de elementos para embeber contenido no
propio de HTML
![Page 15: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/15.jpg)
Necesidad de plugins no estándar
![Page 16: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/16.jpg)
![Page 17: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/17.jpg)
¡Estaría bien que con HTML5 mejorara la cosa!
![Page 18: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/18.jpg)
Multimedia en HTML5
<audio><audio src="music.mp3" autoplay loop="3" controls preload />
<video><video width="320" height="240" controls> <source src="pr6.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'> <source src="pr6.webm" type='video/webm; codecs="vp8, vorbis"'> <source src="pr6.ogv" type='video/ogg; codecs="theora, vorbis"'></video>
![Page 19: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/19.jpg)
<audio> en HTML5
<audio>// funciones
audio.load();audio.play();audio.pause();
// propiedades
audio.currentSrcaudio.currentTimeaudio.duration
// eventos
loadedmetadatatimeupdatepauseplayended
![Page 20: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/20.jpg)
Suena bien, ¿verdad?(perdón por el chiste fácil)
![Page 21: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/21.jpg)
![Page 22: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/22.jpg)
El caos de los códecs
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
![Page 23: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/23.jpg)
¿Solución? Múltiples sub-elementos source
<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>
![Page 24: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/24.jpg)
Pero... HTML5 no se ha limitado a incluir <video> para mejorar el aspecto
visual
![Page 25: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/25.jpg)
WebGL
SVG
...
Canvas 2D API
requestAnimation
Frame
![Page 26: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/26.jpg)
¡Qué bueno sería tener una API estándar en HTML5 para
manipular audio!
![Page 27: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/27.jpg)
Las nuevas API de audio para la Web
(nuevas más de una, → no hay un solo estándar)
![Page 28: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/28.jpg)
![Page 29: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/29.jpg)
Audio Data API
![Page 30: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/30.jpg)
Audio Data API
Propuesta por Mozilla(implementada en FF4+)
Extiende <audio> y <video>
API basada en eventos(loadedmetadata, MozAudioAvailable)
![Page 31: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/31.jpg)
Audio Data API: evento loadedmetadata
Evento estándarDefinido en HTML5
Metadatos adicionales
mozChannels
mozSampleRate
mozFrameBufferLength
+
![Page 32: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/32.jpg)
Audio Data API: evento MozAudioAvailable
Generado cada vez que un fragmento de audio está disponible(≠ ritmo de reproducción del audio)
Proporciona
Tiempo para esa muestra (desde el inicio del audio y en segundos)
Array de audio decodificado(floats en crudo, sin información de volumen, etc.)
![Page 33: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/33.jpg)
Audio Data API: leer audio y procesarlo
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); }}
![Page 34: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/34.jpg)
Audio Data API: escribir audio
// Creamos un elemento <audio>var audioOutput = new Audio();
// Lo configuramos con dos canales a 44.1 KHzaudioOutput.mozSetup(2, 44100);
// Preparamos un array con las muestras y las escribimosvar 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 muestrasvar currentSampleOffset = audioOutput.mozCurrentSampleOffset();
![Page 35: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/35.jpg)
Demos
![Page 37: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/37.jpg)
Audio Data APIhttp://videos.mozilla.org/serv/blizzard/audio-slideshow
![Page 38: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/38.jpg)
Visualizadorhttp://www.nihilogic.dk/labs/pocket_full_of_html5/#presets/struggle.js
![Page 39: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/39.jpg)
Web Audio API
![Page 40: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/40.jpg)
Web Audio API
Propuesta por Google(implementada en Chrome10+)
AudioContext y AudioNode(poco que ver con <audio>)
API a alto nivel(mucha funcionalidad ya implementada)
![Page 41: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/41.jpg)
AudioContext
AudioNodes
AudioSourceNode(AudioBufferSourceNode,
MediaElementAudioSourceNode,JavaScriptAudioNode)
AudioDestinationNode
↓
DelayNoderetardos ajustables
AudioGainNodeganancia
AudioPannerNodeaudio en 3D
ConvolverNodeefectos de espacio, reverb
DynamicsCompressorNodeefectos de compresión / expansión
RealtimeAnalyserNodeanálisis en tiempo real
BiquadFilterNodefiltros paso-bajo, paso-alto, paso-banda...
WaveShaperNodeefectos no-lineales, distorsiones
![Page 42: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/42.jpg)
Web Audio API: hacer sonar un tono
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);
![Page 43: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/43.jpg)
AudioContext
↓AudioSourceNode AudioDestinationNode
AudioContext
↓ AudioDestinationNode↓ AudioGainNodeAudioSourceNode
![Page 44: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/44.jpg)
Web Audio API: conectar un nodo de ganancia
var gainNode = context.createGainNode();
source.connect(gainNode);
gainNode.connect(context.destination);
gainNode.gain.value = 0.5;
![Page 45: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/45.jpg)
AudioContext
AudioSourceNode A
Dry A
AudioDestinationNode
LowPass Filter
AudioSourceNode B AudioSourceNode C
Waveshaper Distortion
Panner
ConvolutionReverb
Dry BDry C
Wet A Wet B Dry C
DynamicsCompressor
Dry Master Gain
![Page 46: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/46.jpg)
Demos
![Page 47: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/47.jpg)
HTML5 Showcase for Web Developers:The Wow and the How
http://www.htmlfivewow.com/slide60
![Page 48: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/48.jpg)
HTML5 Showcase for Web Developers:The Wow and the How
http://www.htmlfivewow.com/slide64
![Page 49: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/49.jpg)
WebAudio Drum Machinehttp://chromium.googlecode.com/svn/trunk/samples/audio/shiny-drum-machine.html
![Page 50: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/50.jpg)
![Page 51: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/51.jpg)
Otras API multimedia para la Web
![Page 52: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/52.jpg)
WebRTC API
![Page 53: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/53.jpg)
WebRTC API
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)
![Page 54: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/54.jpg)
WebRTC API
![Page 55: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/55.jpg)
HTML Streams API
![Page 56: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/56.jpg)
HTML Streams API
Propuesta de Ian Hickson para la gestión de múltiples flujos multimedia en HTML5
HTML MediaController APISincronizació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
![Page 57: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/57.jpg)
MediaStream Processing API
![Page 58: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/58.jpg)
MediaStream Processing API
Objetivo: API común que englobe a todas las que gestionan contenido multimedia en tiempo real
HTML5 <audio> y <video>
Audio Data API Web Audio API
HTML Streams API HTML MediaController
WebRTC API
![Page 59: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/59.jpg)
Conclusiones
![Page 60: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/60.jpg)
Todas las API tienen mucho potencial
(buen diseño, implementaciones funcionales)
![Page 61: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/61.jpg)
No hay una sola forma de hacer lo mismo
(tampoco la hay en animaciones y nos parece bien)
![Page 62: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/62.jpg)
![Page 63: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/63.jpg)
Mi apuesta: Web Audio
![Page 64: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/64.jpg)
Más eficiente y fácil de usar(deja más trabajo “duro” a C++ y menos a JavaScript)
![Page 65: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/65.jpg)
Importante cuota de mercado en móvil / tablet
(Webkit Google Chrome + Safari Android + iOS)→ →
![Page 66: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/66.jpg)
![Page 67: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/67.jpg)
¿Qué uso ahora mismo en producción?
![Page 68: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/68.jpg)
![Page 69: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/69.jpg)
![Page 70: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/70.jpg)
![Page 71: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/71.jpg)
Polyfillshttps://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills
![Page 72: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/72.jpg)
Para saber más...
![Page 73: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/73.jpg)
W3Chttp://dev.w3.org/html5/spec/Overview.html
![Page 74: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/74.jpg)
WHATWGhttp://whatwg.org/html
![Page 75: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/75.jpg)
Muchas gracias ;-)
![Page 76: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/76.jpg)
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
![Page 77: Las nuevas API de audio en HTML5](https://reader033.vdocuments.pub/reader033/viewer/2022051819/54c551cc4a79599d0d8b457a/html5/thumbnails/77.jpg)
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