Audio Recorder en Java, Android y HTML5

JAVA

Para capturar la voz usando el micrófono del computador en java es simple, en el [link[1]] dan un ejemplo claro al respecto, para más información referirse también al [link[2]]. Lo normal es que estos audios se empaqueten en archivos WAV con codec de audio PCM_u8.

ANDROID

Captura de audio en android también es simple, se explica mejor en el [link[3]], para poder usarlo luego en un programa java la mejor opción que vimos fue empaquetar el archivo en mpeg-4 con codec de audio aac.

HTML5

Con html5 también se puede capturar audio, esta limitado a los navegadores modernos, probamos en Google Chrome y funciona correctamente. El siguiente [link [4]] explica el uso de estas APIs, y se puede probar la captura de audio en el [demo [5]], estos aparentemente se empaquetan también en archivos WAV.

Encoding/Decoding Base64

Como la idea es usar los mensajes de voz en una especie de chat, estamos pensando que una opción para transmitir estos, es codificarlos en base64 para luego enviarlos en las tramas de comunicación, otra opción es almacenar los archivos de audio en el servidor para poderlos descargar desde cualquier lugar.

Ejemplos de uso de Base64

Android

            // encode data on your side using BASE64
            byte[] bytesEncoded = Base64.encode(original, Base64.DEFAULT);
            Log.w(LOG_TAG, "ecncoded value is " + new String(bytesEncoded));

            // Decode data on other side, by processing encoded data
            byte[] valueDecoded = Base64.decode(bytesEncoded, Base64.DEFAULT);
            Log.w(LOG_TAG, "Decoded value is " + new String(valueDecoded));

Java

Hay diferentes librerias para esto, para el ejemplo se uso com.sun.org.apache.xml.internal.security.utils.Base64.

            // encode data on your side using BASE64
            String bytesEncoded = Base64.encode(original);
            System.out.println("ecncoded value is " + new String(bytesEncoded));

            // Decode data on other side, by processing encoded data
            byte[] valueDecoded = Base64.decode(bytesEncoded);
            System.out.println("Decoded value is " + new String(valueDecoded));

Transcodificación de WAV PCM S-8 a MPEG-4 ACC y MPEG-4 ACC a WAV PCM S-8

Los archivos wav son mucho más pesados en comparación de los archivos mp4 por lo que se plantea hacer conversión de estos al formato más liviano para usar menos ancho de banda en las comunicaciones.

Con el proyecto opensource JaaDec se puede decodificar un archivo mp4 para que una aplicación java standalone pueda reproducir el audio de este, el link del proyecto es [link[6]] y se puede ver ejemplos de su uso en [link[7]].

Otro proyecto opensource es JAVE[8] (Java Audio Video Encoder), que es una librería de java que envuelve el proyecto jjmpeg[9], con este los desarrolladores pueden transcodificar archivos de audio y video de un formato a otro y algunas funciones más.

Ejemplo transcodificación

En este ejemplo se toma un archivo .wav con codec de audio PCM u8 con un canal de audio mono y una frecuencia de 8000 Hz y lo convertimos a un archivo .mp4 con un codec de audio ACC.

            System.out.println("WAV PCM S-8 to MPEG-4 ACC");
            File sourceFile = new File("/tmp/RecordAudio.wav");
            File targerFile = new File("/tmp/RecordAudio.mp4");

            AudioAttributes audioAttributes = new AudioAttributes();
            audioAttributes.setCodec("libfaac"); 
            audioAttributes.setChannels(1); 
            audioAttributes.setBitRate(64);
            audioAttributes.setSamplingRate(8000);
            
            EncodingAttributes attributes = new EncodingAttributes();
            attributes.setAudioAttributes(audioAttributes);
            attributes.setFormat("mp4");
            
            System.out.println(">>>");
            
            encoder.encode(sourceFile, targerFile, attributes, new EncoderProgressListener() {

                @Override
                public void sourceInfo(MultimediaInfo mi) {
                    System.out.println("Info: "+mi);
                }

                @Override
                public void progress(int i) {
                    System.out.print("*"+i);
                }

                @Override
                public void message(String string) {
                    System.out.println("Message: "+string);
                }
            }); 

Anexo

-Ejemplo de captura de audio y encoding en java [[10]]

-Ejemplo de captura de audio y encoding en android [[11]]

También te podría gustar...

Deja un comentario