0

使用 Java Gstreamer binding 1,我想从磁盘读取音频文件并将该文件的一部分写回磁盘。为此,我不能使用“filesrc”元素,而是发现我可以使用 Gnonlin 插件2中的“gnlurisource”元素。

我采用了 Gstreamer Java 绑定并在本地编译它,得到一个添加到我的项目中的 jar 文件。我还使用以下命令在 Ubuntu 上安装了 Gstreamer:

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 没有太多经验,你能告诉我有什么问题吗?

谢谢!

4

1 回答 1

0

更新:我设法从命令行使用 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();

}
于 2017-10-13T13:41:56.847 回答