私はgstreamer for javaを使用していますので、ライブビデオストリームを再生して同時に録音しようとしています。今は一度に1つしかできませんが、同時に両方を行う方法がわかりません。私はそれをスレッドしようとしましたが、両方のスレッドが同じリソースにアクセスしようとしていたので、競合がありました。その後、私はティーとキューを使用する必要があると私に言いました。基本的には、さまざまなパスがすべて同じリソースを共有しています(私が思うもの)。 Javaでは、今、インターネットは、チュートリアルについてのJavaの良いチュートリアルを持っていません...(少し見て、それは私のマシン上でコンパイルdoesntのコードです)heres私がやっていることのアイデアGstreamer Tee/Queue複数のパイプライン
public class Main {
private static Pipeline pipe;
private static Pipeline pipeB;
public static void main(String[] args) {
args = Gst.init("SwingVideoTest", args);
pipe = new Pipeline("pipeline");
pipeB = new Pipeline("pipeline");
final Element tee = ElementFactory.make("queue", null);
Element queue0 = ElementFactory.make("queue", null);
Element queue1 = ElementFactory.make("queue", null);
AppSink appsink = (AppSink)ElementFactory.make("appsink", null);
tee.set("silent", "false");
appsink.set("emit-signals", "true");
final Element videosrc = ElementFactory.make("v4l2src", "source");
videosrc.set("device" , "/dev/video1");
final Element colorspace = ElementFactory.make("ffmpegcolorspace", "colorspace");
final Element videofilter = ElementFactory.make("capsfilter", "flt");
videofilter.setCaps(Caps.fromString("video/x-raw-yuv, width=640, height=480, framerate=10/1"));
final Element enc = ElementFactory.make("ffenc_mpeg4", "Encoder");
final Element mux = ElementFactory.make("avimux", "muxer");
final Element sink = ElementFactory.make("filesink", "File sink");
sink.set("location", "./test.avi");
final Element videosrcB = ElementFactory.make("v4l2src", "source");
videosrcB.set("device" , "/dev/video0");
final Element videofilterB = ElementFactory.make("capsfilter", "flt");
videofilterB.setCaps(Caps.fromString("video/x-raw-yuv, width=640, height=480"));
VideoPlayer threadA = new VideoPlayer("screen", videosrcB, null, videofilterB, null, null, null, pipe);
VideoPlayer threadB = new VideoPlayer("recorder", videosrc, colorspace, videofilter, enc, mux, sink, pipeB);
threadA.run();
threadB.run();
}
public class VideoPlayer implements Runnable{
private String playerType;
private Element videosrc, colorspace, videofilter, enc, mux, sink;
private Pipeline pipe;
VideoPlayer(final String playerType, final Element videosrc, final Element colorspace, final Element videofilter, final Element enc, final Element mux, final Element sink, final Pipeline pipe){
this.playerType = playerType;
this.videosrc = videosrc;
this.colorspace = colorspace;
this.videofilter = videofilter;
this.enc = enc;
this.mux = mux;
this.sink = sink;
this.pipe = pipe;
}
public void run(){
VideoComponent videoComponent = new VideoComponent();
Element videosink = videoComponent.getElement();
if(playerType.equals("screen")){
System.out.println(playerType);
pipe.addMany(videosrc, videofilter, videosink);
Element.linkMany(videosrc, videofilter, videosink);
JFrame frame = new JFrame("Swing Video Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(videoComponent, BorderLayout.CENTER);
videoComponent.setPreferredSize(new Dimension(640, 480));
frame.pack();
frame.setVisible(true);
// Start the pipeline processing
pipe.setState(State.PLAYING);
}
else if(playerType.equals("recorder")){
System.out.println(playerType);
pipe.addMany(videosrc, colorspace, videofilter, enc, mux, sink);
Element.linkMany(videosrc, colorspace, videofilter, enc, mux, sink);
JFrame frame = new JFrame("Swing Video Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(videoComponent, BorderLayout.CENTER);
videoComponent.setPreferredSize(new Dimension(640, 480));
frame.pack();
//frame.setVisible(true);
pipe.setState(State.PLAYING);
}
}
ちょっとわかりましたが、私が何をしようとしていたか分かりやすいです。もし誰かが私にティーを実装する方法を教えてくれたら(私は試しましたか?)それは素晴らしいでしょう。ありがとう!
ここで、キューを配置しますか? –