Сегментация исходного кода Java Gstreamer Gnonlin

Используя привязку Java Gstreamer 1, я хочу прочитать аудиофайл с диска и записать сегмент этого файла обратно на диск. Для этого я не могу использовать элемент "filesrc", но вместо этого я обнаружил, что могу использовать элемент "gnlurisource" из плагина Gnonlin 2.

Я взял связывание Java Gstreamer и скомпилировал его локально, получив jar-файл, который я добавил в свой проект. Я также установил Gstreamer в Ubuntu, используя следующие команды:

sudo apt-get install libgstreamer1.0-dev
sudo apt-get install gstreamer1.0-gnonlin

Программа компилируется без ошибок, но она застревает и ничего не делает. Ниже я прилагаю код моей программы:

import java.util.concurrent.TimeUnit;
import org.freedesktop.gstreamer.Element;
import org.freedesktop.gstreamer.ElementFactory;
import org.freedesktop.gstreamer.Gst;
import org.freedesktop.gstreamer.Pipeline;
import org.freedesktop.gstreamer.State;


public class AudioSegmentation {

public static void main(String[] args) {

    Pipeline pipe;
    Element asr;
    Element composition;
    Element gnlsource;
    Element convert;
    Element filesink;

    Gst.init();

    pipe = new Pipeline("SimplePipeline");
    composition = ElementFactory.make("gnlcomposition", "comp");
    gnlsource = ElementFactory.make("gnlurisource", "gnlsource");

    convert = ElementFactory.make("audioconvert", "compconvert");
    filesink = ElementFactory.make("filesink", "filesink");

    gnlsource.set("uri", "file:///home/user/Desktop/file-source.wav");
    gnlsource.set("start", TimeUnit.SECONDS.toNanos(5));
    gnlsource.set("duration", TimeUnit.SECONDS.toNanos(2));

    filesink.set("location", "/home/user/Desktop/file-destination.wav");

    composition.link(gnlsource);
    pipe.addMany(composition, convert, filesink);
    Element.linkMany(composition, convert, filesink);

    pipe.setState(State.PLAYING);
    Gst.main();
    Gst.quit();

}

}

У меня нет такого большого опыта работы с Gstreamer, можете ли вы дать мне подсказку о том, что не так?

Спасибо!

1 ответ

ОБНОВЛЕНИЕ: мне удалось использовать gstreamer из командной строки, чтобы выбрать сегмент из аудиофайла. Элемент "gnlurisource" имеет параметр "inpoint" для установки времени начала сегмента и "duration" для указания продолжительности сегмента. Вот команда:

gst-launch-1.0 gnlurisource uri=file:///home/user/Desktop/file-source.wav inpoint=2000000000 duration=1500000000 ! audioconvert ! wavenc ! filesink location=/home/user/Desktop/file-destination.wav

Я все еще пытаюсь реализовать этот конвейер в Java. Я пробовал что-то подобное, но это не работает:

import java.util.concurrent.TimeUnit;
import org.freedesktop.gstreamer.Element;
import org.freedesktop.gstreamer.ElementFactory;
import org.freedesktop.gstreamer.Gst;
import org.freedesktop.gstreamer.Pipeline;
import org.freedesktop.gstreamer.State;


public class AudioSegmentation {

public static void main(String[] args) {

    Pipeline pipe;
    Element gnlsource;
    Element audioconvert;
    Element wavenc;
    Element filesink;

    Gst.init();

    pipe = new Pipeline("SimplePipeline");
    gnlurisource = ElementFactory.make("gnlurisource", "gnlurisource");
    audioconvert = ElementFactory.make("audioconvert", "audioconvert");
    wavenc = ElementFactory.make("wavenc", "wavenc");
    filesink = ElementFactory.make("filesink", "filesink");

    gnlurisource.set("uri", "file:///home/user/Desktop/file-source.wav");
    gnlurisource.set("inpoint", TimeUnit.SECONDS.toNanos(2));
    gnlurisource.set("duration", TimeUnit.SECONDS.toNanos(3));

    filesink.set("location", "/home/user/Desktop/file-destination.wav");

    pipe.addMany(gnlurisource, audioconvert, wavenc, filesink);
    Element.linkMany(gnlurisource, audioconvert, wavenc, filesink);

    pipe.setState(State.PLAYING);
    Gst.main();
    Gst.quit();

}
Другие вопросы по тегам