Vistas

Soportar ficheros de audio

De MorfeoWiki

Tabla de contenidos

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.

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.
Imagen:mymw_global_recurso_audio.jpg

Implementación final

  • Nueva propiedad en el MyMobileWeb.Global.xml para indicar la ubicación de los recursos de audio [Propiedad obligatoria]
Imagen:mymw_global_recurso_audio.jpg
  • 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>

Trabajo por terminar

  • Conocer el tipo de audio dado un InputStream.
  • Conocer hints que conformarán el AudioHints.

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.