/** * Toma un cojunto de buffers de audio y le aplica el proceso de descompresión generando un * archivo en formato WAV con el resultado de la descompresión. * * @param targetFile El archivo de audio WAV que contendrá el audio descomprimido * @param audioCodificado Los buffers de audio comprimido. Las propiedades de audio que deben * obtenerse mediante un objeto tipo <code>FormatoCodecGst</code> * @return El archivo de audio WAV que contendrá el audio descomprimido * @throws AudioException Si ocurre un error durante el procesamiento * @see BuffersAudio * @see FormatoCodecGst * @see Pipeline * @see Element */ public synchronized File decodificar(File targetFile, BuffersAudio audioCodificado) throws AudioException { FormatoCodecGst formatoOrigenGst = (FormatoCodecGst) audioCodificado.getFormatoCodec(); FormatoRawAudioGst formatoRawAudioGst = (FormatoRawAudioGst) formatoOrigenGst.getFormatoRawAudio(); // El pipeline de gstreamer para decodificación está formado por: // appsrc | capsfilter | element(decodifcador) | audioconvert | audioresample | capsfilter | // wavenc | filesink this.pipeline = new Pipeline("pipeline"); Bus bus = this.pipeline.getBus(); this.audioException = null; // definición de elementos AppSrc appsrc = (AppSrc) ElementFactory.make("appsrc", "appsrc"); Element capsfilterin = ElementFactory.make("capsfilter", "capsfilterint"); capsfilterin.setCaps(formatoOrigenGst.getCapsCodificacion()); Element decodaudio = ElementFactory.make(formatoOrigenGst.getGstDecodificador(), "decodaudio"); Element audioconvert = ElementFactory.make("audioconvert", "audioconvert"); Element audioresample = ElementFactory.make("audioresample", "audioresample"); Element muxer = ElementFactory.make("wavenc", "fileEncoder"); Element filesink = ElementFactory.make("filesink", "filesink"); filesink.set("location", targetFile); Element capsfilterout = ElementFactory.make("capsfilter", "capsfilterout"); capsfilterout.setCaps(formatoRawAudioGst.getCapsRawAudio()); this.pipeline.addMany( appsrc, capsfilterin, decodaudio, audioconvert, audioresample, capsfilterout, muxer, filesink); Element.linkMany( appsrc, capsfilterin, decodaudio, audioconvert, audioresample, capsfilterout, muxer, filesink); // manejo del flujo de bytes en el pipeline CodificadorAudioGst.NeedDataSignal needDataSignal = new CodificadorAudioGst.NeedDataSignal(appsrc, audioCodificado); appsrc.connect(needDataSignal); // añadir listeners bus.connect(new CodificadorAudioGst.SignalBusEos()); bus.connect(new CodificadorAudioGst.SignalBusError()); // inicio de la decodificación this.pipeline.play(); // esperar el fin de la decodificación this.semaforo.acquireUninterruptibly(); this.pipeline.dispose(); if (this.audioException != null) throw this.audioException; return targetFile; }