2012-02-14 45 views
3

私は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); 
    } 
} 

ちょっとわかりましたが、私が何をしようとしていたか分かりやすいです。もし誰かが私にティーを実装する方法を教えてくれたら(私は試しましたか?)それは素晴らしいでしょう。ありがとう!

答えて

4

2つのビデオソースを作成しないでください。 videosrc & videosrcB

基本的に、videosrcからデータを受け取り、GstTeeに渡す必要があります。ここでTeeには2つのSrcPadが必要です。これにより、2つのパスを別々に機能させることができます。

最初のsrcパスはencmuxに接続する必要があります。これが録画に移行し、2番目のパスが表示されます。すべてが同時に動くはずです。

Teeは、各パスにQueueでバッファリングできます。回路の観点からすると、これは必須ではありませんが、ブロッキングコールの下でパス#1が終了するまでパス#2が待機しないようにするのは良いことです。

ここで、回路の外観を示します。

Circuit

+0

ここで、キューを配置しますか? –

関連する問題