我正在编写一个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
并且没有收到任何字节。可能是什么导致了这个?我没有得到任何运行时错误,这个管道在命令行上工作得很好。
答案 0 :(得分:0)
知道了!我最终制作了一个PlayBin2来解码文件,然后创建一个包含编码器,payloader和UDP sink的新Bin元素,并将其设置为Playbin的视频接收器。我不完全确定为什么这有效并且使用decodebin2没有,但无论如何。它有效。