ねこライブ配信システム gstreamerでカメラから転送(その2)


この記事では、ねこライブ配信システムの解説(その1)で説明した全体システムの中、カメラとそのエンコードの部分を説明しています。(以下の図の部分です)




3年前に構築したので、当時の開発環境やコンパイル手順などがなくなってしまい、最近のネットの情報を検索して掲載しています。 コンパイル、インストールなどの情報は検証済みではありませんので、悪しからず。


この部分で使っている機器はRaspberyPi, Raspbianの書き込まれたSDカード、電源、LANケーブル、SSHでRaspberryPiを制御するためLAN経由でパソコンが必要です。


おっと、USBカメラも必需品です。


高解像度を追いかけないなら1000円ぐらいで入手できるVGA解像度のUVC規格のUSBカメラがお手軽です。 私はLogitechのC270が大好きです。 画像がほんとにキレイ。 同じ価格で他の製品はここまで画像がきれいではないと思います。(自分の経験だけのハナシ。)


さて、USBカメラから取り込んだ映像をエンコードする中核のソフトウエアGstreamerを準備します。


1.raspberrypi と USBカメラによる撮影とエンコード、そして映像データをcrtmpserverへ送出。


ここではラズベリーパイを使ったUSBカメラからの映像をh.264で圧縮し、そのデータをcrtmpserverへ転送するところを説明します。


USBカメラからの映像の転送ソフトにはGstreamerを使います。


最近のUSBカメラは便利なものもありまして、カメラの中にh.264で映像を圧縮できる機能を持つものがあります。こういうカメラの場合には、h.264エンコーディングをしなくて済むので、raspberrypi側ではビデオコンテナの処理だけで済むようになり、負担が軽くなります。


1.カメラのh.264内蔵エンコーダを利用する。


このようなカメラの例はいくつかあるようですが、代表的なカメラは Logitech(日本ではLogicool)のC920(現在はC930ですかね)です。


このようなカメラは1920x1080の解像度での撮影が可能です。 h.264でエンコード済みのデータを取り込むには、それに対応した処理が必要です。


Gstreamerのプラグインの中にはそれをうまく処理できるものがあります。 「uvch264src」というもので、UVC規格に沿ったh.264エンコーダーを内蔵したUSBカメラのストリームをうまく取り込んでくれます。


2.RaspberryPiのハードウエアエンコーダを利用する。


低価格USBカメラの代表例が LogitechのC270です。とっても安くて解像度はVGA程度ですがそれなりにキレイな映像が得られます。 MJPEGというJPEG方式の画像圧縮ができるのですが、圧縮したデータを得られても、ライブストリーミングに利用するには、h.264などの圧縮効率の良いコーデックを使って再変換する必要があるので、この機能は使いません。


USBカメラから生データを取り込んで、RaspberryPi上のハードウエアエンコーダを使って圧縮する方法を使います。 これによりRaspberryPiのCPU負担が軽くなります。


ここでもGstreamerを使いますが、プラグインの中でRaspberryPino内蔵エンコーダを利用するモジュールを使います。それがomx-h264srcです。これを利用することでハードウエアエンコーダを利用することができます。


3.Gstreamerのインストール


RaspberryPiに使うOSはサポートが豊富な、Raspbianを使います。 また、Minimumのものを使うことでCPUリソースやSDカードのスペースを食うXWindowなどを使わないようにします。

RASPBIAN JESSIE LITE Minimal image based on Debian Jessie

RaspbianのLITEバージョンを使って、GUIを使わないサーバを構築します。


サーバ構築などの作業はこの記事の目的ではないため、割愛します。


ただし、最新のRaspbianはSSHサーバがデフォルトでは動作していないとのことなので、これらの作業はディスプレイが必要かな?


標準でGstreamerをインストールすると、上記のuvch264srcやomx-h264srcは含まれていないようなので以下のサイトにあるスクリプトを利用してコンパイル、インストールします。


以下にコンパイル一式のコマンドを張り付けていただいている方がいらして、これを利用するのが便利かと思います。


RaspberryPiから直接インターネットからソースをダウンロードしていき、コンパイル、インストールまでしてくれる命令が詰まっています。 もちろんRaspberryPiからインターネットにアクセスできる状態にしておきましょう。


http://pastebin.com/u8T7mE18


コンパイル・インストールが終了したら、目的のモジュールが使える状態かどうかを確かめます。

まず内蔵ハードウエアエンコーダ用のomx関連。 omxh264encが目的のモジュール。

daimao@win ~ $ gst-inspect-1.0 |grep omx
omx:  omxmpeg2videodec: OpenMAX MPEG2 Video Decoder
omx:  omxmpeg4videodec: OpenMAX MPEG4 Video Decoder
omx:  omxh263dec: OpenMAX H.263 Video Decoder
omx:  omxh264dec: OpenMAX H.264 Video Decoder
omx:  omxtheoradec: OpenMAX Theora Video Decoder
omx:  omxvp8dec: OpenMAX VP8 Video Decoder
omx:  omxmjpegdec: OpenMAX MJPEG Video Decoder
omx:  omxvc1dec: OpenMAX WMV Video Decoder
omx:  omxh264enc: OpenMAX H.264 Video Encoder
omx:  omxanalogaudiosink: OpenMAX Analog Audio Sink
omx:  omxhdmiaudiosink: OpenMAX HDMI Audio Sink
daimao@win ~ $



次は、uvch264src
daimao@win ~ $ gst-inspect-1.0 |grep uvc
uvch264:  uvch264mjpgdemux: UVC H264 MJPG Demuxer
uvch264:  uvch264src: UVC H264 Source
daimao@win ~ $



gst-inpect-1.0 はどのようなモジュールがどのようなエレメント(入出力要素)、処理機能を持っているかなどを確かめる便利なツールです。 gstreamerでいろいろとパイプラインをつなげていくときにヘルプとして欠かせません。


ダウンロードしたソースなどがSDカードを圧迫するなら削除しておきます。


4.Gstreamerの使い方


Gstreamerはデータのソース(元)=>「処理」=>シンク(排)という基本的な流れで配管のように分岐させたり処理を重ねていったりという処理を行うことができるライブラリ群です。


本来はこれらのライブラリを使って実行形式のアプリケーションを書くのだろうと思いますが、スクリプト形式でこれらの流れをコマンドラインで記述して実行することも可能です。 これを行うには、Gst-Launchというツールを使ってやります。 コマンドライン形式なので、試行錯誤が簡単です。


C920のようなh.264エンコーダ内蔵のカメラから転送する場合。
/usr/local/bin/gst-launch-1.0 -v -e uvch264src rate-control=2 fixed-framerate=true initial-bitrate=5000000 average-bitrate=5000000 iframe-period=1000 device=/dev/video0 name=src auto-start=true src.vfsrc ! queue ! video/x-raw,format=(string)YUY2,width=160,height=90,framerate=5/1 ! fakesink \src.vidsrc ! queue ! video/x-h264,width=1024,height=576,framerate=30/1 ! h264parse ! mpegtsmux ! tcpclientsink host=配信サーバIP port=ポート番号



こちらは、同じC920カメラをPCサーバのほうに直接接続しているケース「ねこ基地」
/usr/local/bin/gst-launch-1.0 -v -e uvch264src initial-bitrate=5000000 average-bitrate=5000000 iframe-period=1000 device=/dev/v4l/by-id/usb-046d_HD_Pro_Webcam_C920_D5CC2CAF-video-index0 name=src auto-start=true src.vfsrc ! queue ! video/x-raw,format=(string)YUY2,width=160,height=90,framerate=10/1 ! fakesink \src.vidsrc ! queue ! video/x-h264,width=800,height=448,framerate=30/1 ! h264parse ! mpegtsmux ! tcpclientsink host=配信サーバIP port=ポート番号

書き方はRaspberrypiでもPCサーバ上でも全く同じですね。。。


C270のような生データをカメラから転送してRaspberrypiの内蔵エンコーダを利用する場合。
/usr/bin/gst-launch-1.0 -v -e v4l2src ! video/x-raw,width=640,height=480,framerate=25/1 ! omxh264enc target-bitrate=1500000 control-rate=variable ! video/x-h264,profile=high ! h264parse ! mpegtsmux ! tcpclientsink host=配信サーバIP port=ポート番号



エンコーダである、omxh264enc モジュールには以下のような各設定パラメータを制御することができます。 すべてを試しているわけではなくて、機能の一覧です。 gst-inspect-1.0で表示できます。
daimao@tower ~ $ gst-inspect-1.0 omxh264enc
Factory Details:
  Rank:         primary (256)
  Long-name:            OpenMAX H.264 Video Encoder
  Klass:                Codec/Encoder/Video
  Description:          Encode H.264 video streams
  Author:               Sebastian Droge <sebastian.droege@collabora.co.uk>

Plugin Details:
  Name:                 omx
  Description:          GStreamer OpenMAX Plug-ins
  Filename:             /usr/lib/arm-linux-gnueabihf/gstreamer-1.0/libgstomx.so
  Version:              1.0.0
  License:              LGPL
  Source module:        gst-omx
  Source release date:  2013-03-22
  Binary package:       GStreamer OpenMAX Plug-ins source release
  Origin URL:           Unknown package origin

GObject
 +----GInitiallyUnowned
       +----GstObject
             +----GstElement
                   +----GstVideoEncoder
                         +----GstOMXVideoEnc
                               +----GstOMXH264Enc
                                     +----GstOMXH264Enc-omxh264enc

Implemented Interfaces:
  GstPreset

Pad Templates:
  SINK template: 'sink'
    Availability: Always
    Capabilities:
      video/x-raw
                  width: [ 1, 2147483647 ]
                 height: [ 1, 2147483647 ]
              framerate: [ 0/1, 2147483647/1 ]

  SRC template: 'src'
    Availability: Always
    Capabilities:
      video/x-h264
                  width: [ 16, 4096 ]
                 height: [ 16, 4096 ]


Element Flags:
  no flags set

Element Implementation:
  Has change_state() function: gst_omx_video_enc_change_state

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

Pads:
  SINK: 'sink'
    Implementation:
      Has chainfunc(): gst_video_encoder_chain
      Has custom eventfunc(): gst_video_encoder_sink_event
      Has custom queryfunc(): gst_video_encoder_sink_query
      Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
    Pad Template: 'sink'
  SRC: 'src'
    Implementation:
      Has custom eventfunc(): gst_video_encoder_src_event
      Has custom queryfunc(): gst_video_encoder_src_query
      Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
    Pad Template: 'src'

Element Properties:
  name                : The name of the object
                        flags: readable, writable
                        String. Default: "omxh264enc-omxh264enc0"
  parent              : The parent of the object
                        flags: readable, writable
                        Object of type "GstObject"
  control-rate        : Bitrate control method
                        flags: readable, writable, changeable only in NULL or READY state
                        Enum "GstOMXVideoEncControlRate" Default: -1, "default"
                           (0): disable          - Disable
                           (1): variable         - Variable
                           (2): constant         - Constant
                           (3): variable-skip-frames - Variable Skip Frames
                           (4): constant-skip-frames - Constant Skip Frames
                           (-1): default          - Component Default
  target-bitrate      : Target bitrate (0xffffffff=component default)
                        flags: readable, writable, changeable in NULL, READY, PAUSED or PLAYING state
                        Unsigned Integer. Range: 0 - 4294967295 Default: 4294967295
  quant-i-frames      : Quantization parameter for I-frames (0xffffffff=component default)
                        flags: readable, writable, changeable only in NULL or READY state
                        Unsigned Integer. Range: 0 - 4294967295 Default: 4294967295
  quant-p-frames      : Quantization parameter for P-frames (0xffffffff=component default)
                        flags: readable, writable, changeable only in NULL or READY state
                        Unsigned Integer. Range: 0 - 4294967295 Default: 4294967295
  quant-b-frames      : Quantization parameter for B-frames (0xffffffff=component default)
                        flags: readable, writable, changeable only in NULL or READY state
                        Unsigned Integer. Range: 0 - 4294967295 Default: 4294967295
daimao@tower ~ $



Gstreamerでの映像転送の実例を書きました。 Gstreamerで設定していないUSBカメラのいろいろな設定をv4l2-utilを使って行っています。

これらの解説は次回その3で書きたいと思います。



アタチたちには関係ないニャっ

ねこライブ配信システム 全体(その1)
ねこライブ配信システム gstreamerでカメラから転送(その2)
ねこライブ配信システム v4l-utilsでカメラ制御(その3)
ねこライブ配信システム crtmpserver配信の主役(その4)
ねこライブ配信システム WEBで動画再生FlowPlayer(その5)
ねこライブ配信システム 便利ツールffmpegの準備(その6)
ねこライブ配信システム ffmpegでサムネイル生成(その7)

コメントを残す

メールアドレスが公開されることはありません。


× 八 = 40