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();