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番目のスレッドの作成を省略していることに注意してください)
私は、pthreadsやgstreamerの経験や、UNIXのボックスでのスレッドの使い方については一度も知りませんが、あなたのアプリケーションがそのメインメソッドをそのまま実行して終了することを指摘します。私は賭けるpthreadsはバックグラウンドスレッドであり、メインスレッドが終了するとすぐに殺されます。あなたはそのメインメソッドをブロックし、すべてが完了するまで待つ必要があります。 – Will
また、GStreamerパイプラインに余分なスレッドを持つ理由もありません。 GStreamerは独自のスレッドを内部的に生成し、そのAPIはほとんどの場合非ブロックです。 –
@Florian Zwoch ..はい、私はパイプラインをすべて同じスレッドで実行しようとしましたが、そこから続行しません。だから私が知っている限り、それはブロックされています。私は私の質問が本当に馬鹿なので、誰も答えを知ることは初めてですので、私は何も答えを得ていないことがわかります。 Gstreamerと他の非Gstreamer関連スレッドとの組み合わせについての良い文書化の方向で、少なくとも私は誰かを指摘できますか? – user3521388