Gstreamer-java UDP管道不发送任何数据

时间:2014-03-25 20:25:03

标签: java udp gstreamer

我正在编写一个Java程序来将视频文件流式传输到我正在编写的Java客户端。我有一个使用gst-launch命令的工作版本:

$ gst-launch-0.10 -v filesrc location="beauty.mp4" 
! decodebin2 
! queue 
! jpegenc 
! rtpjpegpay 
! udpsink host=127.0.0.1 port=5000 sync=true

并使用此命令成功流式传输到客户端:

$ gst-launch-0.10 -v udpsrc uri="udp://127.0.0.1:5000" 
! "application/x-rtp, 
    media=(string)video, 
    clock-rate=(int)90000, 
    encoding-name=(string)JPEG, 
    payload=(int)96, 
    ssrc=(uint)2156703816, c
    lock-base=(uint)1678649553, 
    seqnum-base=(uint)31324" 
! rtpjpegdepay 
! jpegdec 
! ffmpegcolorspace 
! autovideosink

但是,当尝试将其转换为Java时,我似乎无法发送单个字节。这就是我所拥有的:

public static void main(String[] args) {
    System.out.println("Starting testserver on port 45001...");
    try {
        startStreaming();
        Thread.sleep(50000);
    } catch(Exception e) {
        e.printStackTrace();
    }
}

private static void startStreaming() {
    // create the pipeline here
    Gst.init();
    Pipeline pipe = new Pipeline("pipeline");
    Element fileSrc = ElementFactory.make("filesrc", "source");
    fileSrc.set("location", "videos/beauty.mp4");
    Element decoder = ElementFactory.make("decodebin2", "decoder");
    Element queue = ElementFactory.make("queue", "queue");
    Element encoder = ElementFactory.make("jpegenc", "encoder");
    Element payloader = ElementFactory.make("rtpjpegpay", "payloader");
    Element sink = ElementFactory.make("udpsink", "sink");
    sink.set("host", "127.0.0.1");
    sink.set("port", "45001");
    sink.set("sync", "true");
    pipe.addMany(fileSrc, decoder, queue, encoder, payloader, sink);
    Element.linkMany(fileSrc, decoder, queue, encoder, payloader, sink);

    pipe.setState(State.PLAYING);
}

我首先尝试使用类似构造的Java管道播放此流,但在没有发生任何事情后,我尝试使用简单的gst-launch命令读取流:

$ gst-launch-0.10 udpsrc uri="udp://127.0.0.1:45001" ! fakesink dump=1

并且没有收到任何字节。可能是什么导致了这个?我没有得到任何运行时错误,这个管道在命令行上工作得很好。

1 个答案:

答案 0 :(得分:0)

知道了!我最终制作了一个PlayBin2来解码文件,然后创建一个包含编码器,payloader和UDP sink的新Bin元素,并将其设置为Playbin的视频接收器。我不完全确定为什么这有效并且使用decodebin2没有,但无论如何。它有效。