GStreamerの紹介:データソース

こんにちは、GStreamerフレームワークに興味のあるhabrayuzerです! 今日はメディアのソース(ソース)についてお話します。それにより、GStreamerに関する記事のコースを継続します。



前の記事: GStreamerの紹介:はじめに



エントリー





データソースは、ファイルシステムやサウンドカードのオーディオ入力など、さまざまなソースからメディアデータを読み取ることができるGStreamerプラグインのクラスです。 また、HTTP(ICECast、ShoutCast)、RTSP、RTMP、TCP、UDPなどのさまざまなストリーミングサーバーからメディアストリームを受信できます。 また、現在約30個のさまざまなプラグインを使用して、DVBカード、CDDAディスク(一般に単に「CD」と呼ばれる)などからデータを読み取ることができます。

注:前回の記事で述べたように、データソースには別の要素に接続できるが、何にも接続できないため、srcという1つのパッドしかありません。


この記事では、いくつかの(おそらく最も人気のある)データソースを分析し、いくつかのPythonコードを記述して、多くを学びます。



行こう



0. gst-launch-1.0


gst-launch-1.0ユーティリティを使用すると、1行のコードを記述することなくGStreamerパイプラインを開始できます。 これを使用して小さな例を実行しますが、今日知っておく必要があるのは、パイプラインの起動が次のようになることです。

gst-launch-1.0 -pipeline
      
      





パイプライン記述は、次の形式の要素の記述に順番に分割されます

 element1 property1=value1 property2=value2 ! element2
      
      





このスキームではすべてが明らかであり、それぞれvalue1およびvalue2の値を持つproperty1およびproperty2プロパティを持つelement1型の要素があり、element2型の要素があります。 「!」記号は、element1の出力をelement2の入力に接続する必要があることを示します。

gst-launchの可能性はこれに限定されず、今日の記事では役に立たないだけで、将来的に考慮されるでしょう。



1. filesrc


filesrc-私の意見では、これはマルチメディアデータの最も一般的に使用されるソースです。 その名前が示すように、ファイルからデータを読み取るための要素です。 前回の記事では、filesrcがデータソースとして表示されるプリミティブプレーヤーのスキームに注目しました。

filesrc要素にはいくつかのパラメーターがあります。 それらのいくつかを考えてみましょう。



場所


locationプロパティには、読み取り元のファイルへのパスが含まれている必要があります。

例: /foo/bar.mp3



ブロックサイズ


このパラメーターは、読み取りバッファーのサイズを設定します。 値は、符号なしの数値で記述する必要があります。



num個のバッファー


EOSメッセージが送信される読み取り後のブロック数。

blocksizeおよびnum-buffersプロパティは省略できます。 この場合、デフォルト値が使用されます。 また、示されたプロパティはすべてのデータソースで利用可能であり、これ以上検討されません。



filesrcソースの使用例は、前の記事から引用されています。

 gst-launch-1.0 filesrc location=/foo/bar.mp3 ! decodebin ! autoaudiosink
      
      





2. souphttpsrc


souphttpsrc要素は、HTTP(HTTPS)プロトコルを介してデータを読み取る機能を提供します。 読み取りは、HTTPプロトコル経由でアクセス可能な通常のファイルから、またはICECast / ShoutCastサーバーから行うことができます。 この要素は、ICYおよびICYXプロトコルを介してデータを読み取ることもできます。 これらのプロトコルによると、情報を見つけることができませんでした。

souphttpsrcにはfilesrcよりもわずかに多くのパラメーターがあります。最も重要なパラメーターを考えてみましょう。



場所


このパラメーターは、http、https、icy、またはicyx URIスキームのみがサポートされることを除いて、同じ名前のfilesrc要素パラメーターに似ています。



ユーザーエージェント


名前はそれ自身を表しています-このパラメーターは、HTTP要求を送信するときに使用するUser-Agentを設定します。



自動リダイレクト


リソースが移動されたことをサーバーが応答する場合の自動遷移を設定します(ステータス301および302)。



user-idおよびuser-pw


これらのプロパティは、リソースが認証(HTTP基本認証)を必要とする場合に、ユーザー名とパスワードを設定します。



proxy、proxy-id、proxy-pw


これらのプロパティは、プロキシサーバーのアドレス、ユーザー名、および承認用のパスワードを設定します(必要な場合)。 HTTPおよびHTTPSプロキシがサポートされています。



souphttpsrcソースの使用は、filesrcソースの使用と同じです。

 gst-launch-1.0 souphttpsrc location=http://radio.localhost:1234 ! decodebin ! autoaudiosink
      
      





3. giosrc


GStreamerプラグインスイートには、興味深いgiosrc要素があります。 これはfilesrcとほぼ同じで、 GIOライブラリを介してのみ機能し、 GIOが機能するさまざまなソースからデータを受信できます。 ファイルからmtpまで、22のソースがあります。 また、この要素はftp、sftp、smbおよびwebdavプロトコルをサポートします。

この要素には、filesrc要素に類似したパラメーターがあります。 このソースを使用する例は、前のものを使用するのと似ています。

 gst-launch-1.0 giosrc location=ftp://ftp.localhost/foo/bar.mp3 ! decodebin ! autoaudiosink
      
      





4.rtspsrc


名前が示すように、この要素を使用すると、RTSPサーバーからデータを読み取ることができます。 この要素のプロパティについては詳しく検討しません。プロキシ設定を指定するためのデータソース、プロキシ、proxy-id、proxy-pwのアドレスを指定するlocationプロパティがあり、RTSPプロトコルに固有の多数のプロパティがあります。私たちの計画に。

しかし、rtspsrcには1つの機能があり、複数のパッドがあり、source_%uパターンに適した名前があります。 これは、サーバーが複数のストリームを同時にブロードキャストできるためです。たとえば、オーディオとビデオは2つのストリームに散らばっている可能性があります。

注:

私はRTSPプロトコルに精通していないため、上記の仮定に誤解される可能性があります。



rtspsrcの使用例は、前の要素と同様です。

 gst-launch-1.0 rtspsrc location=rtsp://rtsp.localhost/movie.mp4 ! decodebin ! autoaudiosink
      
      





5. multifilesrc


multifilesrc要素の本質はfilesrc要素と同​​じです-ディスクからファイルを読み取るために、1つの違いがあります-multifilesrcはファイルを順番に読み取ります(1.mp3、2.mp3 ...) 。 この要素には1つの欠点があります-ファイル名は、file-1.mp3、file-2.mp3などのように、数のみが異なる必要があります。 しかし、このような欠点は機能のカテゴリに起因する可能性があります。この「欠点」の助けを借りて、写真から画像0000.png-9999.png、サンプルからメロディー、またはトラックからミックスからビデオクリップを簡単に作成できるからです。

multifilesrc要素にはパラメーターがほとんどなく、奇妙なことに、これらはすべて有用です。 それらをより詳細に検討しましょう。



場所


ファイルパスには%d エスケープシーケンスを含めることができます(含める必要があります)。これは、sprintf()関数を使用して、現在のインデックスに等しい番号に自動的に置き換えられます。

例: /foo/bar-%04d.mp3



インデックス、開始インデックス、停止インデックス


これらのプロパティには、現在のインデックス、開始インデックス、および最終インデックスが含まれます。 これらのプロパティには整数が含まれます。



ループ


このプロパティにはブール値が含まれる場合があり、trueの場合、ファイルの読み取りはループされます。 大まかに言って、これは「すべて繰り返し」機能に類似しています。



ループオプションを有効にしてbar-1.mp3から始まる名前のファイルを読み取るmultifilesrc要素の使用例:

 gst-launch-1.0 multifilesrc location="/foo/bar-%d.mp3" loop=true start-index=1 ! decodebin ! autoaudiosink
      
      







6. fdsrc


私の意見では、最も役に立たない要素です。 ファイル記述子からデータを読み取ります。 gst-launchのfilesrcを記述するのが面倒な場合に使用できます。

この要素には1つのパラメーターがあります。



fd


このパラメーターには、開いているファイル記述子と等しい数値を含める必要があります。 デフォルトはゼロです。



使用例:

 cat /foo/bar.mp3 | gst-launch-1.0 fdsrc ! decodebin ! autoaudiosink
      
      





7. fakesrc


名前が示すように、この要素は何もしません-それは単に空のバッファのダミーソースです。



8. alsasrc、pulsesrc、osssrc、jackaudiosrc、autoaudiosrc


これらの要素は、サウンドカードのマイク入力からストリームを受信するように設計されています。 名前から、Alsa、PulseAudio、OSS、Jackなどのさまざまなサウンドサブシステムを操作するために使用されることがわかります。 autoaudiosrc要素は他の要素の「ラッパー」であり、音源を選択するすべての作業を肩にかけることで開発を簡素化します。

これらの要素のプロパティはそれほど多くありません。 主なプロパティはdeviceで、最初の3つの要素に存在し、デバイスの名前(hw:0、hw:1 ...)を含む必要があります。 残りのプロパティは、各サウンドサブシステムに固有に使用されるため、考慮しません。



9. v4l2src


この要素は、 Video4Linux2インターフェイスを介してビデオストリームを開くことを目的としています。 V4L2インターフェイスは、ほとんどのWebカメラ、TVチューナー、DVBカード、およびビデオキャプチャカードをサポートしています。

最も重要なパラメーターを検討してください。



装置


キャプチャ元のデバイスの名前を指定します。 使用可能なデバイスのリストを見つける

 ls -l /dev/v4l/by-id
      
      





このパラメーターの値は、デバイスへのフルパスを指定する必要があります。

例: device = / dev / video0



色相、彩度、コントラスト。 明るさ


これらのパラメータは、それぞれカラーバランス、彩度、コントラスト、明るさを担当します。 もちろん、ビデオキャプチャデバイスがこれらのパラメーターをサポートしていない場合、画像はデバイスが提供するものになります。 これらのプロパティの値は、-2147483648〜2147483647の範囲である必要があります。



要素の使用例:

 gst-launch-1.0 v4l2src ! xvimagesink
      
      





10. audiotestsrc


この要素はfakesrc要素に似ていますが、実際のオーディオ信号を生成するという点で異なります。 gst-launchを介して起動された複雑なパイプラインのテスト、記述されたアプリケーションでのパイプラインのパフォーマンスのテスト、およびさまざまなフィルターによって導入された周波数応答と歪みを測定するためのリファレンスジェネレーターとして使用できます。

この要素の最も興味深いパラメーターを検討してください。





このパラメーターは波形を設定します。 13の値を使用できます: 正弦、四角、のこぎり、三角形、無音、ホワイトノイズ、ピンクノイズ、サインテーブル、ティック、ガウスノイズ、レッドノイズ、ブルーノイズ、バイオレットノイズ



ボリューム


このパラメーターが信号レベル(ボリューム)を設定することを推測することは難しくありません。 有効な値の範囲は0〜1です。



頻度


このプロパティは信号の周波数を設定し、値の範囲は0〜20,000です。



audiotestsrc要素の使用例:

 gst-launch-1.0 audiotestsrc wave=saw freq=205 ! autoaudiosink
      
      





11. videotestsrc


audiotestsrcのようなこの要素は、テストデータ、つまりビデオストリームを生成するために使用されます。 パイプライン全体の操作性を確認するため、またはフィルターによって生じる歪みを確認するために使用できます。

この要素には多くのパラメーターがありますが、1つだけを検討します。これは私の意見では最も興味深いものです。



模様


このパラメータは、ビデオ信号パターンを設定します。 有効な値は21のいずれかです。全リスト: smpte、snow、black、white、red、green、blue、checkers-1、checkers-2、checkers-4、checkers-8、circular、blink、smpte75、zone-plate 、色域、クロマゾーンプレート、ソリッドカラー、ボール、smpte100、バー

すべての値にこだわるわけではありません。smpte、smpte75、およびsmpte100の値は、TV /ビデオ機器の設定で使用されるSMPTE設定テーブルであるとのみ言います。 パターンチェッカー-*はNxNピクセルのグリッドです。Nはパターン名の番号です。 残りの値は、単色のイメージ(色の塗りつぶしなど)でテンプレートを設定します。



使用例:

 gst-launch-1.0 videotestsrc pattern=smpte ! xvimagesink
      
      





説明



上記では15の主要なデータソースを調査しましたが、これはソースカテゴリで利用可能なすべてのプラグインの約半分です。 残りのプラグインは、次の2つの理由で考慮されませんでした。



プラグインを検討する際、基本的にすべてが「微調整」に使用されるため、多くのパラメーターが省略されました。ご存知のように、GStreamerについて知るようになりました。 または、これらのオプションは読み取り専用です。 使用可能なすべてのプロパティのリストとそれらの有効な値を取得するには、たとえばgst-inspect-1.0 <_>



を実行します。

 gst-inspect-1.0 filesrc
      
      





「要素のプロパティ」セクションでは、すべてのプロパティ(継承されたものを含む)を観察できます。





今日は、GStreamerを使用する1つの簡単な例を見ていきます。 この例では、Python 2.7、GStreamer 1.0、およびGObject Introspectionを使用します。

すぐに予約します。コードは理想的ではないかもしれませんし、いわゆる「たわごとコード」であるかもしれませんが、その唯一の目的はGStreamerの使用方法を示すことです。



シンプルなプレーヤー


この例は、要素のリンク方法、メッセージの処理方法、および要素のプロパティの変更方法を示しています。

プレイヤーコード
 #env python2 # coding=utf-8 import gi gi.require_version("Gst", "1.0") gi.require_version("Gtk", "3.0") from gi.repository import Gst from gi.repository import Gtk from gi.repository import GObject import os import signal import argparse Gst.init("") signal.signal(signal.SIGINT, signal.SIG_DFL) GObject.threads_init() def parse_args(): parser = argparse.ArgumentParser(prog='example1.py') parser.add_argument('--volume', help='  (0-100)', type=int, default=100) parser.add_argument('location') args = parser.parse_args() return args class Player(): def __init__(self, args): self.pipeline = self.create_pipeline(args) ##       ##      message_bus = self.pipeline.get_bus() message_bus.add_signal_watch() message_bus.connect('message', self.message_handler) ##   self.pipeline.get_by_name('volume').set_property('volume', args.volume / 100.) def create_source(self, location): """create_source(str) -> Gst.Element""" if not args.location.startswith('http') and not os.path.exists(args.location): raise IOError("File %s doesn't exists" % args.location) if location.startswith('http'): source = Gst.ElementFactory.make('souphttpsrc', 'source') else: source = Gst.ElementFactory.make('filesrc', 'source') source.set_property('location', location) return source def create_pipeline(self, args): """create_pipeline() -> Gst.Pipeline""" pipeline = Gst.Pipeline() ##      source = self.create_source(args.location) decodebin = Gst.ElementFactory.make('decodebin', 'decodebin') audioconvert = Gst.ElementFactory.make('audioconvert', 'audioconvert') volume = Gst.ElementFactory.make('volume', 'volume') audiosink = Gst.ElementFactory.make('autoaudiosink', 'autoaudiosink') ## decodebin   pad',     ##   def on_pad_added(decodebin, pad): pad.link(audioconvert.get_static_pad('sink')) decodebin.connect('pad-added', on_pad_added) ##      pipeline [pipeline.add(k) for k in [source, decodebin, audioconvert, volume, audiosink]] ##      : ## *src* -> (decodebin + audioconvert) -> volume -> autoaudiosink source.link(decodebin) audioconvert.link(volume) volume.link(audiosink) return pipeline def play(self): self.pipeline.set_state(Gst.State.PLAYING) def message_handler(self, bus, message): """ """ struct = message.get_structure() if message.type == Gst.MessageType.EOS: print(' .') Gtk.main_quit() elif message.type == Gst.MessageType.TAG and message.parse_tag() and struct.has_field('taglist'): print('GStreamer    -') taglist = struct.get_value('taglist') for x in range(taglist.n_tags()): name = taglist.nth_tag_name(x) print(' %s: %s' % (name, taglist.get_string(name)[1])) else: pass if __name__ == "__main__": args = parse_args() player = Player(args) player.play() Gtk.main()
      
      







このスクリプトの実行例:

 python2 ./example1.py /foo/bar.mp3 python2 ./example1.py --volume 50 /foo/bar.mp3 python2 ./example1.py http://myradio.localhost:5678/foo.mp3
      
      





すべてが正常に実行される場合、必要なトラックが聞こえ、ID3タグがある場合はそのリストが表示されます。

GitHubにサンプルがあります



まあそれはすべてです



今日、「すぐに使用可能な」利用可能なデータソースの約半分を調べ、これらの要素を起動する例を調べ、GStreamerに基づいた単純なプレーヤーの例を調べました。 次の記事では、他のクラスのプラグインを検討し、GStreamerの使用例をさらに検討し、もちろん、より多くのコードを記述します。

1週間後にまた会いましょう!



文学



  1. GStreamerアプリケーション開発マニュアル
  2. GStreamer Core Pluginsリファレンスマニュアル
  3. GStreamer Base Pluginsリファレンスマニュアル
  4. GStreamer Good Pluginsリファレンスマニュアル
  5. Video4Linux
  6. GIOリファレンスマニュアル
  7. ID3v2 / Shoutcastスタンダード
  8. シャウトキャスト




UPD 1:audiotestsrc、videotestsrcの要素が追加されました。



前の記事 | 次の記事



All Articles