Soportar ficheros de audio
De MorfeoWiki
Tabla de contenidos |
[editar]
Obtención del formato de audio
- Se necesita conocer el tipo de fichero de audio en cada momento para adaptar:
- El API de audio de Java (http://www.jsresources.org/examples/AudioFileInfo.html) no soporta más que 5 formatos de sonido, lo que es insuficiente:
- AIFC
- AIFF
- AU
- SND
- WAVE
- Java Media Framework API como posible solución (http://java.sun.com/products/java-media/jmf/)
- Prueba JMF 2.1.1
- He mirado como hacia internamente para obtener el content type y lo realiza mirando la extensión del fichero, en vez de mirar la cabezera, ... Source code: /* * Convert a file name to a content type. The extension is parsed to determine the content type. */. Por lo tanto como es algo lento concluyo que no usaremos el jmf para conocer el content type de un fichero.
- Con el siguiente código he conseguido obtener el tipo de formato del fichero de audio. Además de conocer si un midi es monofónico o polifónico y si fuera necesario mayor información para ficheros tipo wav, como la siguiente: PCM_SIGNED 24414.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian.
- Código fuente. Este algoritmo usa el API de audio de Java( AudioSystem y MidiSystem ) y algoritmo de obtener contenttype a través de extensión de fichero si los anteriores no obtienen resultado alguno.
- Para audio de tipo AIFC, AIFF, AU, SND, WAVE y MIDI puedo obtener su content type a través de un InputStream, pero para el resto no. Con lo que para sonido alojado en gestor de contenidos se necesita información adicional, a parte del fichero binario en cuestión :).
- Para ficheros mp3 se puede obtener toda la información como MPEG Version o BitRate por ejemplo con el siguiente proyecto: JD3Lib, lo he estado probando y funciona correctamente. Descarga Ejemplo:
MP3File mp3 = new MP3File(file);A través de sus métodos públicos el objeto mp3 nos devuelve toda la información que necesitemos.
- El API de audio de Java (http://www.jsresources.org/examples/AudioFileInfo.html) no soporta más que 5 formatos de sonido, lo que es insuficiente:
[editar]
Ideas de implementación
- El ContentAdapterFactory le preguntaríamos por el adaptador específico que necesitemos en cada caso, bien el de imagenes o de audio. El ContentAdapter pasaría a ser ImageAdapter y tendríamos que crear un AudioApadter. Estos dos extender de AbstractContentAdapter que encapsula toda la lógica compartida por ambos adaptadores.
- Conocer que instancia de audio es la mejor es muy sencillo tan solo es necesario conocer los formatos de audio que soporta el dispositivo (grupo sound_format de WURFL)
- Por otro lado se debería crear un tag audio con su resourceid y href. Digo de no reusar el link para audio también porque en plataforma un link con el siguiente href="/resourece/audio/clip02" como saber a que se refiere?. Si a un recurso de sonido, imagen o simplemente que el programador quiere apuntar a una carpeta del sismtema para navegar por ella <mymw:link id="myFolder" href="/resource/myFolder">View my contents</mymw:link>
- Tanto el CMSCatalog como FileSystemCatalog deberán sufrir algún cambio de código a la hora de crear los recursos con sus diferentes instancias, las características de las instancias de audio frente a las de imagen tienen distinta forma de obtención.
- Nueva propiedad en el MyMobileWeb.Global.xml para indicar la ubicación de los recursos de audio.
[editar]
Implementación final
- Nueva propiedad en el MyMobileWeb.Global.xml para indicar la ubicación de los recursos de audio [Propiedad obligatoria]
- La clase ContentAdapter pasa a ser abstracta e implementa toda la lógica de adaptación de contenidos, cacheo de URL de instancia de tres niveles dado dispositivo, hints y lenguaje, etc.
- Clases ImageContentAdapter y AudioContentAdapter, extienden de la anterior e implementan únicamente dos métodos:
- searchAllowedInstances () -> Elección de las instancias candidatas
- doSearchTheBestInstance () -> Elegir la mejor instancia de entre las candidatas según una serie de hints.
- La clase FileSystemCatalog también a pasado a ser abstracta y AudioFileSystemCatalog e ImageFileSystemCatalog a extender de ella. Éstas clases implementan únicamente los siguientes métodos:
- setConfiguration () -> Path de los recursos.
- getFeaturesForInstance () -> Devolver las características de una determinada instancia. Para ello una se ayudará del ImageAnalyzer y la otra del AudioAnalyzer.
- La clase CMSCatalog es abstracta y la extenderán AudioCMSCatalog e ImageCMSCatalog las cuales implementan el método:
- getFeaturesForInstance () -> Devolver las características de una determinada instancia. Para ello una se ayudará del ImageAnalyzer y de la propiedad cmt:size si esta definida y la otra de las propiedades cmt:size y jcr:mimeType.
- Ahora el CatalogFacade a través del método getResource se le preguntara por un Resource con un determinado identificador y un tipo (audio o imagen). El ya resolverá a quien preguntar si a un catalogo del sistema de ficheros, a uno de CMS, etc.
- Lenguaje de presentación para audio, tag link y atributo type:
- Este busca la mejor instancia de un recurso en CMS
<mymw:link id="lnk_2" type="audio" href="cmspath:/Demo/Audios/Anuncio">Anuncio</mymw:link> - Este busca la mejor instancia de un recurso en el sistema de ficheros
<mymw:link id="lnk_1" type="audio" resourceid="spain" style="both" href="Himno">Himno</mymw:link>
- Este busca la mejor instancia de un recurso en CMS
[editar]
Trabajo por terminar
- Conocer el tipo de audio dado un InputStream.
- Conocer hints que conformarán el AudioHints.
[editar]
Estimación de tiempo de desarrollos
- Aproximación tiempo de desarrollo: 6 días laborales.
- Aproximación tiempo de desarrollo de demo: 4 días laborales.

