質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

5713閲覧

動画のストリーム配信(GStreamer使用)のチュートリアルが動かない

TOMO6181

総合スコア40

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/06/10 12:17

編集2020/06/10 15:14

GStreamerにより動画のストリーム配信を行うコードを、チュートリアルのコードを作成しながら勉強中です。
チュートリアルのコードはこちらのサイトを参考にしています。

動かそうとしているのは、GstElement の作成用の以下のコードです。

C

1#include <gst/gst.h> 2 3int 4main(int argc, 5char *argv[]) 6{ 7 GstElement *element; 8 9 /* init GStreamer */ 10 gst_init(NULL, NULL); 11 12 /* create element */ 13 element = gst_element_factory_make("fakesrc", "source"); 14 if (!element) { 15 g_print("Failed to create element of type 'fakesrc'\n"); 16 return -1; 17 } 18 19 gst_object_unref(GST_OBJECT(element)); 20 21 return 0; 22}

このコードを動かすと、gst_element_factory_make関数のところでNULLが返ってきます。
gst_element_factory_make関数でNULLが返ってくるのは、新しいGstElementの要素を作成できない場合と
リファレンスにありますが、何故要素が作成できないのか分かりません。
原因、解決方法が分かる方がおられましたら、宜しくお願い致します。

追記
以下の環境で実行しています。
OS:Windows 10 64bit
統合開発環境:Visual Studio Express 2013 for Windows Desktop

また、「gst-inspect-1.0 fakesrc」を実行すると以下の結果が得られます。
WARNING: no real random source present!
Factory Details:
Rank none (0)
Long-name Fake Source
Klass Source
Description Push empty (no data) buffers around
Author Erik Walthinsen omega@cse.ogi.edu, Wim Taymans wim@fluendo.com

Plugin Details:
Name coreelements
Description GStreamer core elements
Filename C:\gstreamer\1.0\x86_64\lib\gstreamer-1.0\libgstcoreelements.dll
Version 1.16.0
License LGPL
Source module gstreamer
Binary package GStreamer source release
Origin URL Unknown package origin

GObject
+----GInitiallyUnowned
+----GstObject
+----GstElement
+----GstBaseSrc
+----GstFakeSrc

Pad Templates:
SRC template: 'src'
Availability: Always
Capabilities:
ANY

Element has no clocking capabilities.
Element has no URI handling capabilities.

Pads:
SRC: 'src'
Pad Template: 'src'

Element Properties:
blocksize : Size in bytes to read per buffer (-1 = default)
flags: readable, writable
Unsigned Integer. Range: 0 - 4294967295 Default: 4096
can-activate-pull : Can activate in pull mode
flags: readable, writable
Boolean. Default: true
can-activate-push : Can activate in push mode
flags: readable, writable
Boolean. Default: true
data : Data allocation method
flags: readable, writable
Enum "GstFakeSrcDataType" Default: 1, "allocate"
(1): allocate - Allocate data
(2): subbuffer - Subbuffer data
datarate : Timestamps buffers with number of bytes per second (0 = none)
flags: readable, writable
Integer. Range: 0 - 2147483647 Default: 0
do-timestamp : Apply current stream time to buffers
flags: readable, writable
Boolean. Default: false
dump : Dump buffer contents to stdout
flags: readable, writable
Boolean. Default: false
filltype : How to fill the buffer, if at all
flags: readable, writable
Enum "GstFakeSrcFillType" Default: 1, "nothing"
(1): nothing - Leave data as malloced
(2): zero - Fill buffers with zeros
(3): random - Fill buffers with random data
(4): pattern - Fill buffers with pattern 0x00 -> 0xff
(5): pattern-span - Fill buffers with pattern 0x00 -> 0xff that spans buffers
format : The format of the segment events
flags: readable, writable
Enum "GstFormat" Default: 2, "bytes"
(0): undefined - GST_FORMAT_UNDEFINED
(1): default - GST_FORMAT_DEFAULT
(2): bytes - GST_FORMAT_BYTES
(3): time - GST_FORMAT_TIME
(4): buffers - GST_FORMAT_BUFFERS
(5): percent - GST_FORMAT_PERCENT
is-live : True if the element cannot produce data in PAUSED
flags: readable, writable
Boolean. Default: false
last-message : The last status message
flags: readable
String. Default: null
name : The name of the object
flags: readable, writable
String. Default: "fakesrc0"
num-buffers : Number of buffers to output before sending EOS (-1 = unlimited)
flags: readable, writable
Integer. Range: -1 - 2147483647 Default: -1
parent : The parent of the object
flags: readable, writable
Object of type "GstObject"
parentsize : Size of parent buffer for sub-buffered allocation
flags: readable, writable
Integer. Range: 0 - 2147483647 Default: 40960
pattern : Set the pattern (unused)
flags: readable, writable
String. Default: null
signal-handoffs : Send a signal before pushing the buffer
flags: readable, writable
Boolean. Default: false
silent : Don't produce last_message events
flags: readable, writable
Boolean. Default: true
sizemax : Maximum buffer size
flags: readable, writable
Integer. Range: 0 - 2147483647 Default: 4096
sizemin : Minimum buffer size
flags: readable, writable
Integer. Range: 0 - 2147483647 Default: 0
sizetype : How to determine buffer sizes
flags: readable, writable
Enum "GstFakeSrcSizeType" Default: 1, "empty"
(1): empty - Send empty buffers
(2): fixed - Fixed size buffers (sizemax sized)
(3): random - Random sized buffers (sizemin <= size <= sizemax)
sync : Sync to the clock to the datarate
flags: readable, writable
Boolean. Default: false
typefind : Run typefind before negotiating (deprecated, non-functional)
flags: readable, writable, deprecated
Boolean. Default: false

Element Signals:
"handoff" : void user_function (GstElement* object,
GstBuffer* arg0,
GstPad* arg1,
gpointer user_data);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katsuko

2020/06/10 12:44 編集

プログラムを動かしている環境(OSなど)を書いてください。 あと、「gst-inspect-1.0 fakesrc」を実行するとどのようになるか、結果を質問を編集して書いてください。 ちなみに、ubuntu20.04では問題なく動きました。 (この手の問題はプラグインがインストールされていないという事が多いのだけど、流石にfakesrcは入っていると思うけどなぁ)
TOMO6181

2020/06/10 15:11

回答ありがとうございます。 環境、及び「gst-inspect-1.0 fakesrc」を実行したときの結果を追記しました。
katsuko

2020/06/10 15:19

一応「gst-inspect」の結果は問題なさそう。(WARNINGが出ているのは気になるけど) 申し訳ないがもう一つ、「gst-launch-1.0 fakesrc ! fakesink」も試してみてください。 「パイプラインを再生中(PLAYING)にしています...」と表示されてそのまま止まれば、問題ないです(CTRL+Cで止めてください。) (いや、問題ないのも困るんだけど(^^;)
TOMO6181

2020/06/11 12:47 編集

「gst-launch-1.0 fakesrc ! fakesink」を試してみました。 「パイプラインを再生中(PLAYING)にしています...」の表示が出て止まりましたので、問題ないようです。 以下のようにメッセージが出てきます。 Setting pipeline to PAUSED ... Pipeline is PREROLLING ... Pipeline is PREROLLED ... Setting pipeline to PLAYING ... New clock: GstSystemClock 「Setting pipeline to PLAYING ...」が該当するメッセージかと思います。
katsuko

2020/06/11 13:39

解決策ではありませんが、ちょっと長くなるので、回答に書きます。
guest

回答3

0

GStreamerを使用するとき、以下の環境変数の設定が必要なようでした。

(1)ユーザーの環境変数設定で、以下の2つの環境変数を作成
・GST_PLUGIN_PATH
「C:\gstreamer\1.0\x86_64\lib\gstreamer-1.0」に設定

 ・GSTREAMER_1_0_ROOT_X86_64
「GSTREAMER_1_0_ROOT_X86_64」に設定

(2)ユーザー環境変数の「Path」に以下を追加
%GSTREAMER_1_0_ROOT_X86_64%\bin

(3)システム環境変数の「Path」に以下を追加
C:\gstreamer\1.0\x86_64\bin
%GSTREAMER_1_0_ROOT_X86_64%\bin

上記のうち「GST_PLUGIN_PATH」の作成をしていなかったのが、今回の問題の原因でした。

投稿2020/06/13 09:46

TOMO6181

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

fakesrcが正しく読み込めないのでは、といろいろと試してもらいましたが、どうも怪しい点はないようなので視点を変えてみます。

gst_element_factory_makeがエラーを返す要因として、初期化がされていない場合があります。
もしかすると、gst_initが失敗しているのかもしれません。

gst_initには戻り値がないので、代わりにgst_init_checkを使います。
以下のように書き換えてください。

c

1#include <gst/gst.h> 2/* ヘッダの追加も忘れないように。 */ 3#include <glib.h> 4 5int 6main(int argc, 7char *argv[]) 8{ 9 GstElement *element; 10 11 /* init GStreamer */ 12#if 0 13 gst_init(NULL, NULL); 14#else 15 { 16 GError *err = NULL; 17 if (!gst_init_check(NULL, NULL, &err)) { 18 g_print("failed to initialize Gstreamer, %s.\n", err->message); 19 exit(1); 20 } 21 } 22#endif 23 24 /* create element */ 25 element = gst_element_factory_make("fakesrc", "source"); 26 if (!element) { 27 g_print("Failed to create element of type 'fakesrc'\n"); 28 return -1; 29 } 30 31 gst_object_unref(GST_OBJECT(element)); 32 33 return 0; 34}

エラーの詳細も表示するようにしておいたので、ヒントになると思います。


ちなみに、せっかくなのでやってもらったことも説明しておきます。

gst-inspect」は、プラグインの情報を表示するツールです。
これで「fakesrc」が正しくインストールされていなければ、何らかのエラーが出ると思いました。

gst-launch」は、プログラムを書かずに、プラグインを呼び出すツールです。
これで動かないのであれば、プログラムで書いても動かないと思いました。

あと、参考にされているドキュメントは、バージョン0.10の頃のもので、結構古いものです。(現在一般的なのは、1.0)
とはいうものの、0.10と1.0とではそんなに変わったこともなかったと思いますが、注意はしておいたほうがいいでしょう。

投稿2020/06/11 13:39

編集2020/06/12 01:39
katsuko

総合スコア3538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TOMO6181

2020/06/13 09:40

再度ご回答、及び丁寧な解説ありがとうございます。 ツールの意味までお教え頂き、大変勉強になりました。 gst_init_checkを動かしてみましたが、エラーは出なかったです。 いろいろ調べてみたところ、どうやらプラグインのパスが環境変数に設定されていないのが 原因のようでした。環境変数を設定したところ、gst_element_factory_make関数でNULL以外の戻り値が返ってくるようになりました。 参考までに回答欄に載せておきます。 原因を考えていただき、ツールもお教えして頂きましたので、ベストアンサーに選ばせて頂きます。
guest

0

サイトにも記載してあるとおり、gst_element_factory_make("fakesrc", "source");fakesrcという名前のエレメントファクトリからsourceという名前のエレメントを作成するものです。
ですので、コードの中にfakesrcを作成するものがないので、NULLとなります。

投稿2020/06/10 12:43

Mashiro

総合スコア654

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TOMO6181

2020/06/10 15:12

回答ありがとうございます。 指定したエレメントファクトリがないと駄目なのですね。 ファクトリを新たに作成することはできるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問