2017-02-27 39 views
0

Gstreamerとその使用方法に関するほとんどのドキュメントを読んだことがありますが、Gstreamerとgstreamer関連の非 以外のスレッドを組み合わせることについての説明はほとんどありません。pthreadsでGstreamerを使用する

シンプルなアプリケーションを作成しようとしていますが、シンク要素に直接接続されたソース要素を持つ単純なパイプラインがあるスレッドで発生します。私はスレッドを管理するために "pthread"ライブラリを使用しています。次に、プログラムの他の部分を扱う別のpthreadを作成します。

これを行うには、この例(http://www.thegeekstuff.com/2012/04/create-threads-in-linux/?utm_source=feedburner)を使用しています。ここで

はプログラムです:

#include<gst/gst.h> 

#include<stdio.h> 
#include<string.h> 
#include<pthread.h> 
#include<stdlib.h> 
#include<unistd.h> 

pthread_t tid[2]; 

void* doSomeThing(void *arg) 
{ 
    GMainLoop *loop; 

    printf("\n Completed. \n"); 

    GstElement *pipeline; 

    loop = g_main_loop_new (NULL, FALSE); 

    pipeline = gst_parse_launch ("gst-launch v4l2src ! xvimagesink", NULL); 

    gst_element_set_state (pipeline, GST_STATE_PLAYING); 

    g_main_loop_run (loop); 

    gst_element_set_state (pipeline, GST_STATE_NULL); 

    gst_object_unref (GST_OBJECT (pipeline)); 

    g_main_loop_unref (loop); 

    return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
    gst_init (&argc, &argv); 

    pthread_create(&(tid[0]), NULL, &doSomeThing, NULL); 

    return 0; 
} 

だから私は、コンパイルします。エラーはありません。私がそれを実行すると、ウィンドウが開かず、ストリーミングや何かが始まらない。私はそれが私のパイプラインスレッドを作成している方法だという気持ちがあります。だからボトムラインはGstreamerの良い知識を持っていないと助けを非常に感謝しています。

(。問題は、パイプラインがストリーミングされていないということですので、前のコードで私は2番目のスレッドの作成を省略していることに注意してください)

+1

私は、pthreadsやgstreamerの経験や、UNIXのボックスでのスレッドの使い方については一度も知りませんが、あなたのアプリケーションがそのメインメソッドをそのまま実行して終了することを指摘します。私は賭けるpthreadsはバックグラウンドスレッドであり、メインスレッドが終了するとすぐに殺されます。あなたはそのメインメソッドをブロックし、すべてが完了するまで待つ必要があります。 – Will

+0

また、GStreamerパイプラインに余分なスレッドを持つ理由もありません。 GStreamerは独自のスレッドを内部的に生成し、そのAPIはほとんどの場合非ブロックです。 –

+0

@Florian Zwoch ..はい、私はパイプラインをすべて同じスレッドで実行しようとしましたが、そこから続行しません。だから私が知っている限り、それはブロックされています。私は私の質問が本当に馬鹿なので、誰も答えを知ることは初めてですので、私は何も答えを得ていないことがわかります。 Gstreamerと他の非Gstreamer関連スレッドとの組み合わせについての良い文書化の方向で、少なくとも私は誰かを指摘できますか? – user3521388

答えて

0

g_main_loop_run() GLibのイベントループです:内側のループがあります(送信あなたがそれを終了したいときに終了信号)。そうです、それ以外のものはスレッドのやり取りには関係ありません。

正しくありません:

gst_parse_launch ("gst-launch v4l2src ! xvimagesink", NULL);

はおそらくあるべき:

gst_parse_launch ("v4l2src ! xvimagesink", NULL); 

設定GST_DEBUG環境変数いくつかのレベルに。コードにチェックとエラーハンドラを追加します(パイプラインのバスでリッスンしてエラーを出力するか、またはgst_parse_launch(...) != NULLと状態が実際に "再生"に変更されているかどうかを確認します)。

+0

あなたが言及した最初のことは、gst-parse-launchがコマンドラインコマンドを解析し、 "v4l2src!xvimagesink"が機能しないため、問題ではありませんでした。 このトリックはsleep(5)を置いていたか、またはmain()関数でプログラムが終了するのを止めていたので、Willさんに感謝して助けてくれました。 Florian Wzochが言ったことは間違っています。私はパイプラインを演奏するように設定した後に何かをやろうとしましたが、それはしませんでした。したがって、パイプラインを作成し、非ブロッキングの方法でストリームする方法があるかもしれませんが、私が行っていた方法は間違いなくブロックしていました。 – user3521388

+0

ブロックしている場合は、パイプラインが事前ローリングしていないことを意味します。これは、他の何かがあなたのパイプラインで動作していないことを意味します。パイプラインの状態が正しく再生されると、プログラムの実行が継続されます。 –

関連する問題