Raspberry PiのカメラをGStreamerプラグインとして使用する方法

# GstRpiCamSrc

本稿では、Raspberry PiにGStreamer + GstRpiCamSrcをインストールし、Raspberry Piのカメラ映像をGStreamerのプラグインとして利用できるようにする。

なお、動作確認済みのカメラは次の通り。

|製品名|センサー|画素数|
|---|---|:-:|
|Raspberry Pi Camera Module v1|OmniVision OV5647|5M|
|Raspberry Pi Camera Module v2|Sony IMX219|8M|
|Raspberry Pi HQ Camera|Sony IMX477|12.3M|

## GStreamerをインストール

1. パッケージからインストールする。

    ```shell
    $ sudo apt install gstreamer1.0-omx gstreamer1.0-tools gstreamer1.0-plugins-*
    ```

## GstRpiCamSrcをインストール

### ソースからビルド

1. 関連パッケージをインストールする。

    ```shell
    $ sudo apt install libgstreamer1.0-dev  libgstreamer-plugins-base1.0-dev
    ```

1. ソースファイルをダウンロードする。

    ```shell
    $ cd /usr/src
    $ sudo git clone https://github.com/thaytan/gst-rpicamsrc.git
    $ sudo chown -R pi:pi gst-rpicamsrc
    ```

1. ビルドする。

    ```shell
    $ cd gst-rpicamsrc
    $ ./autogen.sh --prefix=/usr --libdir=/usr/lib/arm-linux-gnueabihf/
    $ make
    ```

1. インストールする。

    ```shell
    $ sudo make install
    ```

1. Element一覧に表示されることを確認する。

    ```shell
    $ gst-inspect-1.0 | grep rpicamsrc
    rpicamsrc:  rpicamsrcdeviceprovider (GstDeviceProviderFactory)
    rpicamsrc:  rpicamsrc: Raspberry Pi Camera Source
    ```

    ```shell
    $ gst-inspect-1.0 rpicamsrc
    ```

### GstRpiCamSrc のパラメータ

- 利用可能形式

    | フォーマット | 利用可能形式                                                                                            |
    | ------------ | ------------------------------------------------------------------------------------------------------- |
    | 共通         | width: [ 1, 2147483647 ]<br>height: [ 1, 2147483647 ]<br>framerate: [ 0/1, 2147483647/1 ]               |
    | video/x-h264 | stream-format: byte-stream<br>alignment: nal<br>profile: { constrained-baseline, baseline, main, high } |
    | image/jpeg   | -                                                                                                       |
    | video/x-raw  | format: { I420, RGB, BGR, RGBA }                                                                        |

### TS形式ファイルを比較

1.  TS形式ファイルに30秒間録画する。 

    ```shell
    $ timeout 30 gst-launch-1.0 -e \
    videotestsrc \
    ! video/x-raw, width=1920, height=1080, framerate=30/1 \
    ! clockoverlay \
    ! omxh264enc \
    ! h264parse \
    ! queue \
    ! mpegtsmux \
    ! filesink location=videotestsrc.ts
    ```

1.  Raspberry Piのハードウェアエンコーダー(OpenMAX)を使用し、TS形式ファイルに30秒間録画する。

    ```shell
    $ timeout 30 gst-launch-1.0 -e \
    rpicamsrc preview=0 bitrate=10000000 \
    ! video/x-raw, width=1920, height=1080, framerate=30/1 \
    ! clockoverlay \
    ! omxh264enc \
    ! h264parse \
    ! queue \
    ! mpegtsmux \
    ! filesink location=rpicamsrc.ts
    ```

1.  映像ファイル形式を確認する。

  - videotestsrc

    ```shell
    $ ls -l videotestsrc.ts
    -rw-r--r-- 1 pi pi 7000932 Feb  1 18:48 videotestsrc.ts
    ```

    ```shell
    $ gst-typefind-1.0 videotestsrc.ts
    videotestsrc.ts - video/mpegts, systemstream=(boolean)true, packetsize=(int)188
    ```
  - rpicamsrc

    ```shell
    $ ls -l rpicamsrc.ts
    -rw-r--r-- 1 pi pi 820620 Feb  1 18:49 rpicamsrc.ts
    ```

    ```shell
    $ gst-typefind-1.0 rpicamsrc.ts
    rpicamsrc.ts - video/mpegts, systemstream=(boolean)true, packetsize=(int)188
    ```