VideoTestTutorial

http://code.google.com/p/gstreamer-java/wiki/VideoTestTutorial


VideoTestTutorial  

ビデオテストパイプラインの構築

導入

SimplePipelineTutorialでパイプライン、要素、それらをリンクすることの概念を紹介しましたが、実際には有用ではありませんでした。


詳細

では実際に何かを表示するパイプラインを構築しましょう!

public class VideoTest {
   
public VideoTest() {
   
}
   
private static Pipeline pipe;
   
public static void main(String[] args) {
        args
= Gst.init("VideoTest", args);
        pipe
= new Pipeline("VideoTest");
       
final Element videosrc = ElementFactory.make("videotestsrc", "source");
       
final Element videofilter = ElementFactory.make("capsfilter", "filter");
        videofilter
.setCaps(Caps.fromString("video/x-raw-yuv, width=720, height=576"
               
+ ", bpp=32, depth=32, framerate=25/1"));
       
SwingUtilities.invokeLater(new Runnable() {

           
public void run() {
               
VideoComponent videoComponent = new VideoComponent();
               
Element videosink = videoComponent.getElement();
                pipe
.addMany(videosrc, videofilter, videosink);
               
Element.linkMany(videosrc, videofilter, videosink);
               
               
// Now create a JFrame to display the video output
               
JFrame frame = new JFrame("Swing Video Test");
                frame
.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame
.add(videoComponent, BorderLayout.CENTER);
                videoComponent
.setPreferredSize(new Dimension(720, 576));
                frame
.pack();
                frame
.setVisible(true);
               
               
// Start the pipeline processing
                pipe
.setState(State.PLAYING);
           
}
       
});
   
}
}

最初に作る要素はビデオソースです。

        final Element videosrc = ElementFactory.make("videotestsrc", "source");

如何なるメディアファイルへの依存性とでコーディング時に遭遇するかもしれない問題を避けるために’videotestsrc’要素を使用します。 
次に’videotestsrc’が算出するビデオ出力を制限するために’capsfilter’要素を作成します。このケースの場合、’videotestsrc’が YUV形式 720×576 32bit カラー 25フレーム/秒の映像を出力しようとしています。

        final Element videofilter = ElementFactory.make("capsfilter", "filter");
        videofilter
.setCaps(Caps.fromString("video/x-raw-yuv, width=720, height=576"
               
+ ", bpp=32, depth=32, framerate=25/1"));

幅と高さとフレームレートを変更することによって、算出されるビデオフレームのサイズと表示される速度を変えることが出来ます。
Swingコンポーネントを作成しているのでSwing EDT上で残りを実行します。(※Event Dispatcher Thread?) 
ではビデオを表示するコンポーネントを作成し、パイプライン全体を接続します。

                VideoComponent videoComponent = new VideoComponent();
               
Element videosink = videoComponent.getElement();
                pipe
.addMany(videosrc, videofilter, videosink);
               
Element.linkMany(videosrc, videofilter, videosink);

これはちょっとした変更があるだけでSimplePipelineTutorial からおなじみのはずです。
その後、ビデオコンポーネントを表示する為のJFrameを作成し、幾つかの標準のSwingのセットアップを行います。

                JFrame frame = new JFrame("Swing Video Test");
                frame
.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame
.add(videoComponent, BorderLayout.CENTER);
                videoComponent
.setPreferredSize(new Dimension(720, 576));
                frame
.pack();
                frame
.setVisible(true);

最後に、ビデオフレームを算出するvideotestsrcを開始するパイプライン再生を開始します。

                pipe.setState(State.PLAYING);

これはGUIプログラムでパイプラインへのグローバル(スコープ?)な参照を保持しているのでmainスレッド周りを維持する必要がないのでGst.mainへの呼び出しは不要であることに注意してください?