年別: 2010年

BusMessageTutorial

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

BusMessageTutorial  

Busメッセージの監視.

導入

他のチュートリアルではこれまでエラー状態を扱っておらず、メディアファイルの再生が終了してもExitしていませんでした。

詳細

このチュートリアルは状態を検知するためにパイプラインバス上のメッセージを監視する方法を示します。

public class BusMessages {
   
public static void main(String[] args) {
        args
= Gst.init("BusMessages", args);
       
final PlayBin playbin = new PlayBin("BusMessages");
        playbin
.setVideoSink(ElementFactory.make("fakesink", "videosink"));
        playbin
.setInputFile(new File(args[0]));
        playbin
.getBus().connect(new Bus.EOS() {
           
public void endOfStream(GstObject source) {
               
System.out.println("Finished playing file");
               
Gst.quit();
           
}
       
});
        playbin
.getBus().connect(new Bus.ERROR() {
           
public void errorMessage(GstObject source, int code, String message) {
               
System.out.println("Error occurred: " + message);
               
Gst.quit();
           
}
       
});
        playbin
.getBus().connect(new Bus.STATE_CHANGED() {
           
public void stateChanged(GstObject source, State old, State current, State pending) {
               
if (source == playbin) {
                   
System.out.println("Pipeline state changed from " + old + " to " + current);
               
}
           
}
       
});
        playbin
.setState(State.PLAYING);
       
Gst.main();
        playbin
.setState(State.NULL);
       
Gst.deinit();
   
}
}

最初の数行はAudioPlayerTutorialからおなじみでしょう。
使用するための入力ファイルを設定した後、コードは面白くなってきます- Busイベントの為にリスナを登録します。
最初にEOS用のリスナを接続します- end-of-stream イベントはメディアファイルの再生が終了した時に送られてきます。

        playbin.getBus().connect(new Bus.EOS() {
           
public void endOfStream(GstObject source) {
               
System.out.println("Finished playing file");
               
Gst.quit();
           
}
       
});

endOfStream()内にあなたが望む全ての処理を置くことも出来ますが、ここでは伝達メッセージを出力し、Gst.quit()を呼び出します。Gst.quit()は, プログラムの終わりにGst.main()を呼び出して戻ります?
次にエラーイベント用のリスナを接続します – これはなんらかの理由でgstreamerがファイルを再生出来ないか、またはエラーがストリーム上で発見された場合にポストされます。

        playbin.getBus().connect(new Bus.ERROR() {
           
public void errorMessage(GstObject source, int code, String message) {
               
System.out.println("Error occurred: " + message);
               
Gst.quit();
           
}
       
});

最後に、状態変化イベント用のリスナを接続します。これはPipeline.setState()メソッドコールへのレスポンスで、どのようにgstreamerがパイプラインの状態を変更するかを見るのに有益です。

        playbin.getBus().connect(new Bus.STATE_CHANGED() {
           
public void stateChanged(GstObject source, State old, State current, State pending) {
               
if (source == playbin) {
                   
System.out.println("Pipeline state changed from " + old + " to " + current);
               
}
           
}
       
});

パイプライン中のどの要素もBusにメッセージをポストすることが出来るので、そのメッセージソースがパイプラインであることを確認する必要があります-すなわち、状態変化はトップレベルのパイプラインの状態変化であり、ある内部要素の状態変化ではありません。
最後にメディアファイルが再生している間はメインスレッドを維持し、その完了後にクリーンアップする、標準のgstreamerの定型コードを持ちます。

        playbin.setState(State.PLAYING);
       
Gst.main();
        playbin
.setState(State.NULL);
       
Gst.deinit();

VideoPlayerTutorial

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


VideoPlayerTutorial 

ビデオファイル再生を学ぶ

導入

オーディオプレイヤーのように gstreamerは簡単なビデオプレイヤーを構築する為に使用することが出来ます:

詳細

public class VideoPlayer {
   
public static void main(String[] args) {
        args
= Gst.init("VideoPlayer", args);
       
final PlayBin playbin = new PlayBin("VideoPlayer");
        playbin
.setInputFile(new File(args[0]));

       
SwingUtilities.invokeLater(new Runnable() {

           
public void run() {
               
VideoComponent videoComponent = new VideoComponent();
                playbin
.setVideoSink(videoComponent.getElement());

               
JFrame frame = new JFrame("VideoPlayer");
                frame
.getContentPane().add(videoComponent, BorderLayout.CENTER);
                frame
.setPreferredSize(new Dimension(640, 480));
                frame
.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame
.pack();
                frame
.setVisible(true);
                playbin
.setState(State.PLAYING);
           
}
       
});
       
Gst.main();
        playbin
.setState(State.NULL);
   
}
}

最初の数行はまたしてもgstreamerを初期化し、ファイルを再生する為にPlayBinをセットアップしています:

        args = Gst.init("VideoPlayer", args);
       
final PlayBin playbin = new PlayBin("VideoPlayer");
        playbin
.setInputFile(new File(args[0]));

次にビデオを表示する場所を作成しなければなりません。Swingコンポーネントが作成され、Swingはスレッドセーフではないので、これらの全ての操作はSwingイベントディスパッチャスレッド上で実行されなければなりません。 従ってSwingUtilitiesを使用してまるごとラップします。

        SwingUtilities.invokeLater(new Runnable() {
           
public void run() {
               
// Do video setup here ...
           
}
       
});

最初にビデオコンポーネントを作成します – これは送られてきたビデオを表示するSwingの軽量コンポーネントです。

                VideoComponent videoComponent = new VideoComponent();

二番目に、ビデオ出力としてPlayBinにビデオコンポーネントを接続しなければなりません。AudioPlayerTutorial ではplaybin.setVideoSink()でビデオ出力を向こうにしましたが、ここではビデオを出力を有効にするためにビデオコンポーネントを使用します 

                playbin.setVideoSink(videoComponent.getElement());

次に、表示する為にJFrameにビデオコンポーネントを追加し、ウィンドウを健全な状態にする為に、いくつかの基本的なセットアップをします。

                JFrame frame = new JFrame("VideoPlayer");
                frame
.getContentPane().add(videoComponent, BorderLayout.CENTER);
                frame
.setPreferredSize(new Dimension(640, 480));
                frame
.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame
.pack();
                frame
.setVisible(true);

最後に、パイプラインを再生します。

                playbin.setState(State.PLAYING);

メインメソッドの最後にいつもgstreamerの(終了の?)定型コードを持ちます:

        Gst.main();
        playbin
.setState(State.NULL);

gstreamer のGUIアプリケーション用のチュートリアルで厳密な必要がない間は、親和性のために他のチュートリアルで使われているのと同じパターンのコードを使用していきます。

(原文のneccessaryはCが一つ余計?)

AudioPlayerWithMetadata

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

 AudioPlayerWithMetadata  

メタデータの読み込み (メディアタグ).

導入

音楽/映像ファイルは通常アーティスト、アルバム、ファイルを構築する為に使用されたエンコーダなどのようなメタデータを含みます。

詳細

メタデータ情報はタグイベントを監視するためにパイプラインにリスナを追加することによって、パイプラインから抽出することが出来ます。

public class AudioPlayerMetadata {
   
public static void main(String[] args) {
        args
= Gst.init("AudioPlayerMetadata", args);
       
PlayBin playbin = new PlayBin("AudioPlayer");
        playbin
.setVideoSink(ElementFactory.make("fakesink", "videosink"));
        playbin
.setInputFile(new File(args[0]));

        playbin
.getBus().connect(new Bus.TAG() {

           
public void tagsFound(GstObject source, TagList tagList) {
               
for (String tagName : tagList.getTagNames()) {
                   
for (Object tagData : tagList.getValues(tagName)) {
                       
System.out.printf("[%s]=%sn", tagName, tagData);
                   
}
               
}
           
}
       
});
       
        playbin
.setState(State.PLAYING);
       
Gst.main();
        playbin
.setState(State.NULL);
   
}
}
上記のプログラムの最初の部分はAudioPlayerTutorialと同じでファイルを再生するパイプラインをセットアップしています。
ここからがタグメッセージを監視する面白い部分です。
すべてのパイプラインは、新しいメタデータが検出された-といったようなパイプラインがアプリケーションに何かが起きたことを報せたい時にパイプラインが使用する要素である’Bus’を持ちます。
だから、これらのメッセージを監視する為にリスナをバスに接続します-このケースでは’tag’メッセージを監視したいので:

        playbin.getBus().connect(new Bus.TAG() {
           
public void tagsFound(GstObject source, TagList tagList) {
               
// Add code here to print out the tags
           
}
       
});
各タグは複数の値(例えば複数のアーティスト)を持つことが出来るので、特定のタグの全ての値を検索して、それらを処理/出力することが必要です。
上記の’tagsFound’メソッドに次のコードを追加します:

                for (Object tagData : tagList.getValues(tagName)) {
                   
System.out.printf("[%s]=%sn", tagName, tagData);
               
}
あなたはこのリスナの中で、後の為にタグを格納する、GUIでそれらを表示する等々、何でも望むことが出来ます。

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への呼び出しは不要であることに注意してください?