如何使用xuggle在java中读取实时网络流? (我可以在ffmpeg中完成,只是不是xuggle)

所以,如果我跑:

ffmpeg -t 10 -re -i "rtmp://170.93.143.150/rtplive/ app=rtplive/ playpath=e000990f025f0075004d823633235daa swfUrl=http://www.chart.state.md.us/video/mediaplayer/player.swf pageUrl=http://www.chart.state.md.us/video/video.asp?feed=e000990f025f0075004d823633235daa stop=5000 flashver=`LNX 11,2,202,262` live=true" test.flv -report 

它让我从该网络流中获得了5秒钟的video,并将其放入test.flv。 现在我想在java中使用xuggle做同样的事情,除非我每次尝试打开容器时都会出错,并将x设置为-1:

  public IMediaReader grabStream(IMediaReader reader) throws IOException { String rtmp = "rtmp://170.93.143.150/rtplive/"; rtmp = rtmp + " app=rtplive/"; rtmp = rtmp + " playpath=e000990f025f0075004d823633235daa"; rtmp = rtmp + " swfUrl=http://www.chart.state.md.us/video/mediaplayer/player.swf"; rtmp = rtmp + " pageUrl=http://www.chart.state.md.us/video/video.asp?feed=e000990f025f0075004d823633235daa"; rtmp = rtmp + " flashver=`LNX 11,2,202,262`"; rtmp = rtmp + " live=true"; IContainer container = IContainer.make(); IMediaReader newReader = ToolFactory.makeReader(container); int x = container.open(rtmp, IContainer.Type.READ, null, true, false); if (x < 0) { IError ie = IError.make(x); System.out.println("Open error: " + ie.getType().toString()); throw new RuntimeException("failed to open with error" + x); } return newReader; } 

也许最好的方法是使用输入流以某种方式将ffmpeg流式传输到xuggle容器中? 或者也许还有另一种方法可以将网络流传输到java?

rtmp源字符串应采用以下格式

 String rtmpSourceUrl = "rtmp://hostname/appName/streamName"; 

然后我建议像下面这样创建阅读器

 IContainerFormat inFormat = IContainerFormat.make(); inFormat.setInputFormat("flv"); // set the input format to avoid FFMPEG // probing IMediaReader reader = ToolFactory.makeReader(rtmpSourceUrl); reader.setQueryMetaData(false); reader.setBufferedImageTypeToGenerate(-1); reader.getContainer().setForcedVideoCodec(ID.CODEC_ID_FLV1); reader.getContainer().open(rtmpSourceUrl , IContainer.Type.READ, inFormat, true, false); 

这会解决您的问题吗?