Exemple #1
0
  /**
   * @param inputURLs
   * @param outputURL
   * @param pathFifo
   */
  public void createPipeline() {
    String config = "rate=" + OUTPUT_FREQ + ",channels=" + OUTPUT_CHANELS + ",depth=16";
    pathFifo = "/tmp/" + outputURL.replace('/', '_') + "_" + config;
    this.capsAudio = Caps.fromString("audio/x-raw-int," + config + ";audio/x-raw-float," + config);
    pipe = new Pipeline("Audio Mixer Pipeline");
    try {
      adder = ElementFactory.make("liveadder", "liveadder");
      // adder.set("latency", 5 * 1000);
    } catch (Exception e) {
    }
    adder.connect(
        new PAD_REMOVED() {
          @Override
          public void padRemoved(Element element, Pad pad) {
            if (removedInput != null) {
              pipe.remove(removedInput);
              pipe.remove(removedIdentity);
              removedInput.setState(State.NULL);
              removedIdentity.setState(State.NULL);
              System.out.println("padRemoved: " + removedInput);
              removedInput = null;
              removedInput = null;
              System.gc();
            }
          }
        });

    adder.connect(
        new PAD_ADDED() {
          @Override
          public void padAdded(Element element, Pad pad) {
            linkNewInputToPad(pad);
          }
        });

    Element tee = ElementFactory.make("tee", "tee");

    Element capsfilter = ElementFactory.make("capsfilter", null);
    capsfilter.setCaps(capsAudio);
    queueTee = ElementFactory.make("queue2", null);
    pipe.addMany(adder, queueTee, tee, capsfilter);
    Element.linkMany(adder, queueTee, capsfilter, tee);

    if (AUDIO_OUTPUT) {
      Element audioSink = ElementFactory.make("alsasink", "Audio Sink");
      audioSink.set("sync", false);
      pipe.addMany(audioSink);
      Element.linkMany(tee, audioSink);
    }

    if (STREAM_OUTPUT) {

      // fileFifo.deleteOnExit();
      fileFifo = new File(pathFifo);
      try {
        if (!fileFifo.exists()) {
          // fileFifo.delete();
          String command = "/usr/bin/mkfifo " + fileFifo.getAbsolutePath();
          ProcessBuilder b = new ProcessBuilder("/bin/sh", "-c", command);
          b.start().waitFor();
        }
      } catch (Exception e) {
        e.printStackTrace();
      }

      Element codecEnc = ElementFactory.make("lamemp3enc", "MP3 Encoder");
      Element mux = ElementFactory.make("flvmux", "FLV Muxer");
      Element queue = ElementFactory.make("queue2", "Fifo Queue");
      Element filesink = ElementFactory.make("filesink", "Fifo Sink");
      filesink.set("sync", false);
      filesink.set("location", fileFifo.getAbsolutePath());
      pipe.addMany(queue, codecEnc, mux, filesink);
      Element.linkMany(tee, queue, codecEnc, mux, filesink);

      startFFmpegProcess();
    }

    int i = 0;
    for (String url : inputURLs) {
      i++;
      if (checkUrl(url)) {
        addInput(url);
      }
    }

    prepareBus();
  }
  /**
   * Toma un archivo de audio en formato WAV, obtiene el raw audio y le aplica la compresión de
   * acuerdo a las características indicadas, devolviendo el conjunto de buffers que contienen el
   * audio comprimido.
   *
   * @param audioOriginal Archivo de audio en formato WAV
   * @param formatoObjetivo Propiedades del audio comprimido. Debe ser de tipo <code>FormatoCodecGst
   *     </code>
   * @return Los buffers con el audio comprimido
   * @throws AudioException Si ocurre un error durante el procesamiento
   * @see CodificadorAudio
   * @see FormatoCodecGst
   * @see Pipeline
   * @see Element
   */
  public synchronized BuffersAudio codificar(File audioOriginal, FormatoCodec formatoObjetivo)
      throws AudioException {

    FormatoCodecGst formatoObjetivoGst = (FormatoCodecGst) formatoObjetivo;
    FormatoRawAudioGst formatoRawAudioGst =
        (FormatoRawAudioGst) formatoObjetivoGst.getFormatoRawAudio();

    // El pipeline de gstreamer para codificación está formado por:
    // filesrc | wavparse | audioresample | audioconvert | capsfilter | element(codificador) |
    // appsink
    this.pipeline = new Pipeline("pipeline");
    Bus bus = this.pipeline.getBus();
    this.audioException = null;

    // definición de elementos
    FileSrc filesrc = (FileSrc) ElementFactory.make("filesrc", "source");
    filesrc.setLocation(audioOriginal);
    // System.out.println(filesrc.get("location"));
    Element demuxer = ElementFactory.make("wavparse", "fileDecoder");
    Element ident = ElementFactory.make("identity", "ident");
    Element audioconvert = ElementFactory.make("audioconvert", "audio converter");
    Element audioresample = ElementFactory.make("audioresample", "audio resampler");
    Element capsfilterreq = ElementFactory.make("capsfilter", "capsfiltereq");

    capsfilterreq.setCaps(formatoObjetivoGst.getCapsNecesarios());

    Element codaudio = ElementFactory.make(formatoObjetivoGst.getGstCodificador(), "codaudio");

    // seleccion de propiedades de codec
    PropiedadesCodificador pc = formatoObjetivoGst.getPropiedadesCodec();
    int numeroPropiedades = pc.getNumeroPropiedades();

    String[] nombrePropiedades = pc.getNombrePropiedades();
    for (int i = 0; i < numeroPropiedades; i++) {

      codaudio.set(nombrePropiedades[i], pc.getValorPropiedad(nombrePropiedades[i]));
    }

    AppSink appsink = (AppSink) ElementFactory.make("appsink", "appsink");
    appsink.set("emit-signals", true);
    appsink.set("sync", false);

    // creación del pipeline
    this.pipeline.addMany(
        filesrc, demuxer, ident, audioresample, audioconvert, capsfilterreq, codaudio, appsink);
    Element.linkMany(filesrc, demuxer);
    Element.linkMany(ident, audioresample, audioconvert, capsfilterreq, codaudio, appsink);

    // añadir listeners
    // enlace dinámico para el decodificador del fichero
    CodificadorAudioGst.SignalPadAdded signalPadAdded =
        new CodificadorAudioGst.SignalPadAdded(ident);
    demuxer.connect(signalPadAdded);

    // manejo del flujo de bytes en el pipeline
    CodificadorAudioGst.NewBufferSignal newBufferSignal =
        new CodificadorAudioGst.NewBufferSignal(appsink);
    appsink.connect(newBufferSignal);

    // fin de stream
    bus.connect(new CodificadorAudioGst.SignalBusEos());
    // error en el procesamient
    bus.connect(new CodificadorAudioGst.SignalBusError());

    // inicio la codificación
    this.pipeline.play();

    // esperar el fin de la codificación
    this.semaforo.acquireUninterruptibly();

    formatoObjetivoGst.setCapsCodificacion(newBufferSignal.capsCodificacion);
    formatoRawAudioGst.setCapsRawAudio(signalPadAdded.caps);

    newBufferSignal.buffersAudio.setFormatoCodec(formatoObjetivoGst);

    this.pipeline.dispose();

    if (this.audioException != null) throw this.audioException;

    return newBufferSignal.buffersAudio;
  }