示例#1
-15
  /**
   * 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;
  }