Open7

ラズパイカメラモジュール3を使ってみる

ktamidoktamido

rpicamera-* コマンドの使い方

https://www.raspberrypi.com/documentation/computers/camera_software.html

画像

# --hdr : HDRの有効化
# --width, --height: 解像度 (rpicam-hello --list-cameras で利用できる解像度を確認)
# --timeout: プレビューの表示時間 (ms)
# --metering: 測光モード centre(中央重点測光), spot(スポット測光), average(マルチパターン測光), custom
# --autofocus-mode: オートフォーカスモード auto(起動時に一回だけ), continuous(常にフォーカスを合わせ続ける), manual
# --awb: オートホワイトバランス auto(2500K to 8000K), indoor(3000K to 5000K), daylight(5500K to 6500K), cloudy(7000K to 8500K)
# --output: 出力ファイル
rpicam-jpeg \
  --hdr \
  --width 4608 \
  --height 2592 \
  --timeout 5000 \
  --metering spot \
  --autofocus-mode continuous \
  --output $PROJECT_ROOT/output/$DATETIME.jpg

動画

mp4

# --codec: 動画のコーデック h264など。指定可能な値は ffmpeg -formats でチェック。
#       libavを指定するとバックエンドがlibavエンコーダーに移譲され、--libav-*オプションが利用できる。
#  --libav-video-codec: libavの動画コーデック。指定可能な値はffmpeg -codecsでチェック
#  --libav-video-codec-opts: libav動画コーデックのオプション。指定可能な値はffmpeg -h encoder=h264_v4l2m2m でチェック
# --libav-format: libavエンコーダーの出力形式を指定。 指定可能な値は ffmpeg -formats
# --width, --height: 解像度
# --framerate: フレームレート
# --bitrate: ビットレート (FHD解像度だと2Mbps ~ 15Mbpsくらい)
# --timeout: 撮影時間 (ms)
# --flicker-period: フリッカー低減設定 (50Hz=10000, 60Hz=8333) ※ まだサポートされていないっぽい
# --metering: 測光モード centre(中央重点測光), spot(スポット測光), average(マルチパターン測光), custom
# --autofocus-mode: オートフォーカスモード auto(起動時に一回だけ), continuous(常にフォーカスを合わせ続ける), manual
# --output: 出力ファイル
rpicam-vid \
  --codec libav \
  --libav-video-codec h264_v4l2m2m \
  --libav-video-codec-opts "num_output_buffers=10;num_capture_buffers=10" \
  --libav-format mp4 \
  --width 1920 \
  --height 1080 \
  --framerate 30 \
  --bitrate 5000000 \
  --timeout 10000 \
  --metering spot \
  --autofocus-mode continuous \
  --output $PROJECT_ROOT/output/$DATETIME.mp4

h264

rpicam-vid \
  --hdr \
  --codec h264 \
  --width 1920 \
  --height 1080 \
  --framerate 30 \
  --timeout 10000 \
  --bitrate 5000000 \
  --flicker-period 10000 \
  --metering spot \
  --autofocus-mode continuous \
  --output $PROJECT_ROOT/output/$DATETIME.h264
ktamidoktamido

picamera2の使い方

https://github.com/raspberrypi/picamera2

https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf

GUIで色々いじる方法

git clone https://github.com/raspberrypi/picamera2

# デスクトップアプリが立ち上がる
python3 picamera2/apps/app_full.py

# ContinuousAFを試してみるためのアプリ
python3 picamera2/apps/app_capture_af.py

画像

カンタン撮影

ifrom datetime import datetime
import os
from picamera2 import Picamera2
from libcamera import controls

project_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
now = datetime.now().strftime("%Y%m%d_%H%M%S")

# picamera2: https://github.com/raspberrypi/picamera2
picam2 = Picamera2()

# --- --- --- カメラ設定 --- --- ---
# # Appendix C: Camera controles: https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
camera_controls = {
    # AF設定
    "AfMode": controls.AfModeEnum.Continuous,
    "AfSpeed": controls.AfSpeedEnum.Fast,
    # フリッカー低減モード
    "AeFlickerMode": controls.AeFlickerModeEnum.Manual, # manual flicker
    "AeFlickerPeriod": 10000, # 50Hz=10000, 60Hz=8333
    # 測光モード
    "AeMeteringMode": controls.AeMeteringModeEnum.Matrix, # CenterWeighted, Matrix, Spot
    # オートホワイトバランス
    "AwbEnable": True, # True or False
    "AwbMode": controls.AwbModeEnum.Indoor # Auto, Indoor, Daylight, Cloudy
    # HDR
    # Picamera2では、RaspberryPiカメラモジュール3のハードウェアHDRをサポートしていないため、有効・無効の切り替えは外部コマンドで行う
    # ちなみにソフトウェアHDRの機能は存在するが、ラズパイ5にならないと使えない
    #   - 有効化: v4l2-ctl --set-ctrl wide_dynamic_range=1 -d /dev/v4l-subdev0
    #   - 無効化: v4l2-ctl --set-ctrl wide_dynamic_range=0 -d /dev/v4l-subdev0
}

# --- --- --- スチル撮影 --- --- ---
preview_config = picam2.create_preview_configuration(
    main={"size": (2304, 1296)},
    controls=camera_controls,
)
still_config = picam2.create_still_configuration(
    main={"size": picam2.sensor_resolution},
    controls=camera_controls,
)
# start_and_capture_file: https://github.com/raspberrypi/picamera2/blob/main/picamera2/picamera2.py#L1766
picam2.start_and_capture_file(
    name=os.path.join(project_dir, f"output/{now}.jpg"),
    delay=5,
    preview_mode=preview_config,
    capture_mode=still_config,
    show_preview=True,
)

通常

import json
from datetime import datetime
import os
from time import sleep

from picamera2 import Picamera2, Preview
from libcamera import controls

project_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
now = datetime.now().strftime("%Y%m%d_%H%M%S")

# Picamera2 Document:
#   GitHub: https://github.com/raspberrypi/picamera2
#   PDF: https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
picam2 = Picamera2()

# --- --- --- カメラ設定 --- --- ---
# # Appendix C: Camera controles: https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
camera_controls = {
    # AF設定
    "AfMode": controls.AfModeEnum.Continuous,
    "AfSpeed": controls.AfSpeedEnum.Fast,
    # フリッカー低減モード
    "AeFlickerMode": controls.AeFlickerModeEnum.Manual, # manual flicker
    "AeFlickerPeriod": 10000, # 50Hz=10000, 60Hz=8333
    # 測光モード
    "AeMeteringMode": controls.AeMeteringModeEnum.Matrix, # CenterWeighted, Matrix, Spot
    # オートホワイトバランス
    "AwbEnable": True, # True or False
    "AwbMode": controls.AwbModeEnum.Indoor # Auto, Indoor, Daylight, Cloudy
    # HDR
    # Picamera2では、RaspberryPiカメラモジュール3のハードウェアHDRをサポートしていないため、有効・無効の切り替えは外部コマンドで行う
    # ちなみにソフトウェアHDRの機能は存在するが、ラズパイ5にならないと使えない
    #   - 有効化: v4l2-ctl --set-ctrl wide_dynamic_range=1 -d /dev/v4l-subdev0
    #   - 無効化: v4l2-ctl --set-ctrl wide_dynamic_range=0 -d /dev/v4l-subdev0
}


# --- --- --- プレビュー表示 --- --- ---
# NOTE: create_*_configurationは色々と状態を変更しているので使う直前に呼び出す
#       https://github.com/raspberrypi/picamera2/blob/main/picamera2/picamera2.py#L668
preview_config = picam2.create_preview_configuration(
    # 4.3. Configuration objects: https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
    main={"size": (2304, 1296)},
    buffer_count=4,
    controls=camera_controls,
)
# NOTE: configを適用して、プレビューを起動して、カメラを起動
#       https://github.com/raspberrypi/picamera2/blob/main/picamera2/picamera2.py#L1129
picam2.start(config=preview_config, show_preview=True)
sleep(15)


# --- --- --- スチル撮影 --- --- ---
# NOTE: create_*_configurationは色々と状態を変更しているので使う直前に呼び出す
#       https://github.com/raspberrypi/picamera2/blob/main/picamera2/picamera2.py#L702
still_config = picam2.create_still_configuration(
    # 4.3. Configuration objects: https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
    main={"size": picam2.sensor_resolution},
    buffer_count=1,
    controls=camera_controls,
)
# NOTE: switch_mode_and_capture_file は ざっくり stop, configure, start, capture_file をまとめたもの
#       https://github.com/raspberrypi/picamera2/blob/main/picamera2/picamera2.py#L1386
res = picam2.switch_mode_and_capture_file(
    camera_config=still_config,
    file_output=os.path.join(project_dir, f"output/{now}.jpg")
)
print(json.dumps(res, indent=2, ensure_ascii=False))


# --- --- --- クローズ --- --- ---
picam2.close()

動画

カンタン

from datetime import datetime
import os
from picamera2 import Picamera2
from libcamera import controls
from picamera2.encoders import Quality

project_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
now = datetime.now().strftime("%Y%m%d_%H%M%S")

# picamera2: https://github.com/raspberrypi/picamera2
picam2 = Picamera2()

# --- --- --- カメラ設定 --- --- ---
# # Appendix C: Camera controles: https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
camera_controls = {
    # AF設定
    "AfMode": controls.AfModeEnum.Continuous,
    "AfSpeed": controls.AfSpeedEnum.Fast,
    # フリッカー低減モード
    "AeFlickerMode": controls.AeFlickerModeEnum.Manual, # manual flicker
    "AeFlickerPeriod": 10000, # 50Hz=10000, 60Hz=8333
    # 測光モード
    "AeMeteringMode": controls.AeMeteringModeEnum.Matrix, # CenterWeighted, Matrix, Spot
    # オートホワイトバランス
    "AwbEnable": True, # True or False
    "AwbMode": controls.AwbModeEnum.Indoor # Auto, Indoor, Daylight, Cloudy
    # HDR
    # Picamera2では、RaspberryPiカメラモジュール3のハードウェアHDRをサポートしていないため、有効・無効の切り替えは外部コマンドで行う
    # ちなみにソフトウェアHDRの機能は存在するが、ラズパイ5にならないと使えない
    #   - 有効化: v4l2-ctl --set-ctrl wide_dynamic_range=1 -d /dev/v4l-subdev0
    #   - 無効化: v4l2-ctl --set-ctrl wide_dynamic_range=0 -d /dev/v4l-subdev0
}

# --- --- --- ビデオ撮影 --- --- ---
# start_and_record_video: https://github.com/raspberrypi/picamera2/blob/main/picamera2/picamera2.py#L1851
video_config = picam2.create_video_configuration(
    main={"size":(1920, 1080)},
    controls=camera_controls,
)
picam2.start_and_record_video(
    output=os.path.join(project_dir, f"output/{now}.mp4"),
    duration=10,
    config=video_config,
    quality=Quality.HIGH,
    show_preview=True,
)

通常 (mp4)

from datetime import datetime
import os
from time import sleep
from picamera2 import Picamera2, Preview
from picamera2.encoders import H264Encoder, LibavH264Encoder
from picamera2.outputs import FfmpegOutput
from libcamera import controls

project_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
now = datetime.now().strftime("%Y%m%d_%H%M%S")

# Picamera2 Document:
#   GitHub: https://github.com/raspberrypi/picamera2
#   PDF: https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
picam2 = Picamera2()

# --- --- --- カメラ設定 --- --- ---
# # Appendix C: Camera controles: https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
camera_controls = {
    # AF設定
    "AfMode": controls.AfModeEnum.Continuous,
    "AfSpeed": controls.AfSpeedEnum.Fast,
    # フリッカー低減モード
    "AeFlickerMode": controls.AeFlickerModeEnum.Manual, # manual flicker
    "AeFlickerPeriod": 10000, # 50Hz=10000, 60Hz=8333
    # 測光モード
    "AeMeteringMode": controls.AeMeteringModeEnum.Matrix, # CenterWeighted, Matrix, Spot
    # オートホワイトバランス
    "AwbEnable": True, # True or False
    "AwbMode": controls.AwbModeEnum.Indoor # Auto, Indoor, Daylight, Cloudy
    # HDR
    # Picamera2では、RaspberryPiカメラモジュール3のハードウェアHDRをサポートしていないため、有効・無効の切り替えは外部コマンドで行う
    # ちなみにソフトウェアHDRの機能は存在するが、ラズパイ5にならないと使えない
    #   - 有効化: v4l2-ctl --set-ctrl wide_dynamic_range=1 -d /dev/v4l-subdev0
    #   - 無効化: v4l2-ctl --set-ctrl wide_dynamic_range=0 -d /dev/v4l-subdev0
}

# --- --- --- プレビュー表示 --- --- ---
# NOTE: create_*_configurationは色々と状態を変更しているので使う直前に呼び出す
#       https://github.com/raspberrypi/picamera2/blob/main/picamera2/picamera2.py#L668
preview_config = picam2.create_preview_configuration(
    # 4.3. Configuration objects: https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
    main={"size":(1920, 1080)},
    buffer_count=4,
    controls=camera_controls,
)
picam2.configure(preview_config)
# NOTE: この時点ではまだプレビューは表示されない
picam2.start_preview(preview=Preview.QTGL)

# --- --- --- ビデオ撮影 --- --- ---
# NOTE: create_*_configurationは色々と状態を変更しているので使う直前に呼び出す
#       https://github.com/raspberrypi/picamera2/blob/main/picamera2/picamera2.py#L736
video_config = picam2.create_video_configuration(
    # 4.3. Configuration objects: https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
    main={"size":(1920, 1080)},
    buffer_count=6,
    controls=camera_controls,
)
encoder = H264Encoder(bitrate=5000000, framerate=30)
output = os.path.join(project_dir, f"output/{now}.mp4")
ffmpeg_output = FfmpegOutput(output_filename=output, audio=False)
# start_recording: https://github.com/raspberrypi/picamera2/blob/main/picamera2/picamera2.py#L1729
picam2.start_recording(
    encoder=encoder,
    output=ffmpeg_output,
    config=video_config,
)
sleep(15)
picam2.stop_recording()

# --- --- --- クローズ --- --- ---
picam2.close()

通常 (h264)

from datetime import datetime
import os
from time import sleep

from picamera2 import Picamera2, Preview
from picamera2.encoders import H264Encoder, Quality
from libcamera import controls

project_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
now = datetime.now().strftime("%Y%m%d_%H%M%S")

# Picamera2 Document:
#   GitHub: https://github.com/raspberrypi/picamera2
#   PDF: https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
picam2 = Picamera2()

# --- --- --- カメラ設定 --- --- ---
# # Appendix C: Camera controles: https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
camera_controls = {
    # AF設定
    "AfMode": controls.AfModeEnum.Continuous,
    "AfSpeed": controls.AfSpeedEnum.Fast,
    # フリッカー低減モード
    "AeFlickerMode": controls.AeFlickerModeEnum.Manual, # manual flicker
    "AeFlickerPeriod": 10000, # 50Hz=10000, 60Hz=8333
    # 測光モード
    "AeMeteringMode": controls.AeMeteringModeEnum.Matrix, # CenterWeighted, Matrix, Spot
    # オートホワイトバランス
    "AwbEnable": True, # True or False
    "AwbMode": controls.AwbModeEnum.Indoor # Auto, Indoor, Daylight, Cloudy
    # HDR
    # Picamera2では、RaspberryPiカメラモジュール3のハードウェアHDRをサポートしていないため、有効・無効の切り替えは外部コマンドで行う
    # ちなみにソフトウェアHDRの機能は存在するが、ラズパイ5にならないと使えない
    #   - 有効化: v4l2-ctl --set-ctrl wide_dynamic_range=1 -d /dev/v4l-subdev0
    #   - 無効化: v4l2-ctl --set-ctrl wide_dynamic_range=0 -d /dev/v4l-subdev0
}

# --- --- --- プレビュー表示 --- --- ---
# NOTE: create_*_configurationは色々と状態を変更しているので使う直前に呼び出す
#       https://github.com/raspberrypi/picamera2/blob/main/picamera2/picamera2.py#L668
preview_config = picam2.create_preview_configuration(
    # 4.3. Configuration objects: https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
    main={"size":(1920, 1080)},
    buffer_count=4,
    controls=camera_controls,
)
picam2.configure(preview_config)
# NOTE: この時点ではまだプレビューは表示されない
picam2.start_preview(preview=Preview.QTGL)

# --- --- --- ビデオ撮影 --- --- ---
# NOTE: create_*_configurationは色々と状態を変更しているので使う直前に呼び出す
#       https://github.com/raspberrypi/picamera2/blob/main/picamera2/picamera2.py#L736
video_config = picam2.create_video_configuration(
    # 4.3. Configuration objects: https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
    main={"size":(1920, 1080)},
    buffer_count=6,
    controls=camera_controls,
)
encoder = H264Encoder(bitrate=5000000, framerate=30)
output = os.path.join(project_dir, f"output/{now}.h264")
picam2.start_recording(
    encoder=encoder,
    output=output,
    config=video_config,
)
sleep(15)
picam2.stop_recording()

# --- --- --- クローズ --- --- ---
picam2.close()
ktamidoktamido

Gstreamerの導入

Gstreamerのインストール

https://gstreamer.freedesktop.org/documentation/installing/on-linux.html?gi-language=c#

sudo apt-get install -y \
  libgstreamer1.0-dev \
  libgstreamer-plugins-base1.0-dev \
  libgstreamer-plugins-bad1.0-dev \
  gstreamer1.0-plugins-base \
  gstreamer1.0-plugins-good \
  gstreamer1.0-plugins-bad \
  gstreamer1.0-plugins-ugly \
  gstreamer1.0-libav \
  gstreamer1.0-tools \
  gstreamer1.0-x \
  gstreamer1.0-alsa \
  gstreamer1.0-gl \
  gstreamer1.0-gtk3 \
  gstreamer1.0-qt5 \
  gstreamer1.0-pulseaudio

Gstreamerのlibcameraプラグインをインストール

https://libcamera.org/getting-started.html

for gstreamer: [optional]

sudo apt-get install -y \
  gstreamer1.0-libcamera \
  gstreamer1.0-libcamera-dbgsym

Gstreamerのkvssinkプラグインをインストール

https://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/producersdk-cpp-rpi-software.html

https://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/producersdk-cpp-rpi-download.html

https://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/producersdk-cpp-rpi-run.html

# 依存パッケージのインストール
# https://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/producersdk-cpp-rpi-software.html
sudo apt update
sudo apt install -y \
  automake \
  build-essential \
  cmake \
  git \
  gstreamer1.0-plugins-base-apps \
  gstreamer1.0-plugins-bad \
  gstreamer1.0-plugins-good \
  gstreamer1.0-plugins-ugly \
  gstreamer1.0-tools \
  gstreamer1.0-omx-generic \
  libcurl4-openssl-dev \
  libgstreamer1.0-dev \
  libgstreamer-plugins-base1.0-dev \
  liblog4cplus-dev \
  libssl-dev \
  pkg-config

sudo curl https://www.amazontrust.com/repository/AmazonRootCA1.pem -o /etc/ssl/AmazonRootCA1.pem
sudo chmod 644 /etc/ssl/AmazonRootCA1.pem

# インストール
# https://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/producersdk-cpp-rpi-download.html
git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git
mkdir -p amazon-kinesis-video-streams-producer-sdk-cpp/build
cd amazon-kinesis-video-streams-producer-sdk-cpp/build
cmake .. -DBUILD_GSTREAMER_PLUGIN=ON -DBUILD_DEPENDENCIES=FALSE
make

# 環境変数設定
cat <<EOF >> ~/.bashrc

export GST_PLUGIN_PATH=${HOME}/amazon-kinesis-video-streams-producer-sdk-cpp/build
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxx
EOF
source ~/.bashrc
ktamidoktamido

Gstreamerについて

https://qiita.com/saxxos/items/e5b452502ad9aca3c997

メディアに対して1つの処理を行う「エレメント」と呼ばれる機能を、パイプ(Linuxコマンド等で使われるパイプと同様)で繋ぎ、パイプラインを構築する。

利用できるエレメントの一覧は gst-inspect-1.0 コマンドで確認できる。

gst-inspect-1.0

エレメントには一つ前のエレメントからメディアを受け取る口と、処理した後のメディアを送り出す口が存在する。
受け取る口を Sink Pad と呼び、送り出す口を Source Pad と呼ぶ。

SinkやSource、エレメントが取るプロパティは gst-inspect-1.0 <エレメント> コマンドで表示できる。
Pad Templates 項目に各Padがどのような形式のメディアを扱うかが記載されている。
このメディア形式を Capability と呼び、 Capabilities 項目に記載されている。

$ gst-inspect-1.0 v4l2h264enc

# ... 略 ...
Pad Templates:
  SINK template: 'sink'
    Availability: Always
    Capabilities:
      video/x-raw
                 format: { (string)I420, (string)YV12, (string)NV12, (string)NV21, (string)RGB16, (st
ring)RGB, (string)BGR, (string)RGBA, (string)BGRx, (string)BGRA, (string)YUY2, (string)YVYU, (string)
UYVY }
                  width: [ 1, 32768 ]
                 height: [ 1, 32768 ]
              framerate: [ 0/1, 2147483647/1 ]
  
  SRC template: 'src'
    Availability: Always
    Capabilities:
      video/x-h264
          stream-format: byte-stream
              alignment: au
                  level: { (string)1, (string)1b, (string)1.1, (string)1.2, (string)1.3, (string)2, (
string)2.1, (string)2.2, (string)3, (string)3.1, (string)3.2, (string)4, (string)4.1, (string)4.2, (s
tring)5, (string)5.1 }
                profile: { (string)baseline, (string)constrained-baseline, (string)main, (string)high
 }

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

# ... 略 ...

カメラなどのデバイスがどのようなケイパビリティを出力するのかは gst-device-monitor-1.0 コマンドで調べられる。
caps 項目がこのデバイスのケイパビリティ。

 $ gst-device-monitor-1.0

# ... 略 ...
Device found:

        name  : imx708
        class : Video/Source
        caps  : video/x-raw, format=NV21, width=640, height=480
                video/x-raw, format=NV21, width=160, height=120
                video/x-raw, format=NV21, width=240, height=160
                video/x-raw, format=NV21, width=320, height=240

ちなみに、余談だがラズパイのカメラモジュールから出力されるrawデータは下記の色情報のエンコーディングを利用できる。

https://gstreamer.freedesktop.org/documentation/video/video-format.html?gi-language=c#GstVideoFormat

-- -- -- RGB -- --- --
GST_VIDEO_FORMAT_xRGB (9) – sparse rgb packed into 32 bit, space first
GST_VIDEO_FORMAT_xBGR (10) – sparse reverse rgb packed into 32 bit, space first
GST_VIDEO_FORMAT_RGB (15) – RGB packed into 24 bits without padding (R-G-B-R-G-B)
GST_VIDEO_FORMAT_BGR (16) – reverse RGB packed into 24 bits without padding (B-G-R-B-G-R)
GST_VIDEO_FORMAT_RGB16 (29) – rgb 5-6-5 bits per component

-- -- -- YUV -- --- --
GST_VIDEO_FORMAT_I420 (2) – planar 4:2:0 YUV
GST_VIDEO_FORMAT_YV12 (3) – planar 4:2:0 YVU (like I420 but UV planes swapped)
GST_VIDEO_FORMAT_YUY2 (4) – packed 4:2:2 YUV (Y0-U0-Y1-V0 Y2-U2-Y3-V2 Y4 ...)
GST_VIDEO_FORMAT_UYVY (5) – packed 4:2:2 YUV (U0-Y0-V0-Y1 U2-Y2-V2-Y3 U4 ...)
GST_VIDEO_FORMAT_YVYU (19) – packed 4:2:2 YUV (Y0-V0-Y1-U0 Y2-V2-Y3-U2 Y4 ...)
GST_VIDEO_FORMAT_NV12 (23) – planar 4:2:0 YUV with interleaved UV plane
GST_VIDEO_FORMAT_NV21 (24) – planar 4:2:0 YUV with interleaved VU plane
GST_VIDEO_FORMAT_VYUY (64) – packed 4:2:2 YUV (V0-Y0-U0-Y1 V2-Y2-U2-Y3 V4 ...)

実践

テストビデオ信号の表示

  • videotestsrc: テスト用の動画ソースエレメント
  • autovideosink: 利用可能なビデオ出力デバイスに映像を自動的に表示する
gst-launch-1.0 videotestsrc ! autovideosink

ラズパイカメラモジュールの映像を表示

  • libcamerasrc: ラズパイカメラデバイスからビデオストリームを取得
  • videoscale: ビデオフレームのサイズを変更する
  • clockoverlay: ビデオに時間表示を追加する
gst-launch-1.0 \
  libcamerasrc auto-focus-mode=2 ! video/x-raw,width=1920,height=1080,framerate=30/1,format=I420 !\
  videoscale ! video/x-raw,width=1280,height=720 ! \
  clockoverlay time-format="%D %H:%M:%S" ! \
  autovideosink

ラズパイカメラモジュールの映像をkvsに送信

  • v4l2h264enc: ideo4Linux2 (V4L2) ベースの H.264 エンコーダー。ビデオストリームを H.264 形式にエンコードする。
    • video/x-h264
      • level
        レベル1からレベル5.1まで、16段階が定義されている。それぞれのレベルにおいて、処理の負荷や使用メモリ量等を表すパラメータの上限が定められ、画面解像度やフレームレートの上限を決定している。
      • profile
        H.264規格では当初ベースラインプロファイル、メインプロファイル、拡張プロファイルのみだった。その後、規格の拡張に伴い種類が増加している。
  • h264parse: H.264エンコードされたビデオストリームを解析し、適切にフォーマットする
  • kvssink: kvsに映像を送信
AWS_ACCESS_KEY_ID=xxxxxxxxxx
AWS_SECRET_ACCESS_KEY=xxxxxxxxxx
AWS_DEFAULT_REGION=ap-northeast-1
KVS_STREAM_NAME="test"

gst-launch-1.0 \
  libcamerasrc auto-focus-mode=2 ! video/x-raw,width=1920,height=1080,framerate=30/1,format=I420 !\
  videoscale ! video/x-raw,width=1280,height=720 ! \
  clockoverlay time-format="%D %H:%M:%S" ! \
  v4l2h264enc extra-controls="controls,repeat_sequence_header=1" ! video/x-h264,level='(string)4' !\
  h264parse ! video/x-h264,stream-format=avc,alignment=au,width=1280,height=720,framerate=30/1 !\
  kvssink stream-name="$KVS_STREAM_NAME" access-key="$AWS_ACCESS_KEY_ID" secret-key="$AWS_SECRET_ACCESS_KEY" aws-region="$AWS_DEFAULT_REGION"
exit 

teeとqueueを利用して出力を分岐する

Gstreamerについて5 出力先分岐コマンド解説

https://dev.classmethod.jp/articles/kinesis-video-streams-gstreamer-tee-queue/

  • tee name=t
    分岐の始まりを宣言している。
  • t.
    次の処理の始まりを示している。ここから2つめの処理に分岐。
AWS_ACCESS_KEY_ID=xxxxxxxxxx
AWS_SECRET_ACCESS_KEY=xxxxxxxxxx
AWS_DEFAULT_REGION=ap-northeast-1
KVS_STREAM_NAME="test"

gst-launch-1.0 \
  libcamerasrc auto-focus-mode=2 ! video/x-raw,width=1920,height=1080,framerate=30/1,format=I420 !\
  videoscale ! video/x-raw,width=1280,height=720 ! \
  clockoverlay time-format="%D %H:%M:%S" ! \
  tee name=t ! \
  queue ! \
    autovideosink t. ! \
  queue ! \
    v4l2h264enc extra-controls="controls,repeat_sequence_header=1" ! video/x-h264,level='(string)4' !\
    h264parse ! video/x-h264,stream-format=avc,alignment=au,width=1280,height=720,framerate=30/1 !\
    kvssink stream-name="$KVS_STREAM_NAME" access-key="$AWS_ACCESS_KEY_ID" secret-key="$AWS_SECRET_ACCESS_KEY" aws-region="$AWS_DEFAULT_REGION"
exit 
ktamidoktamido

ビット深度

https://qiita.com/yoya/items/41b00127b0b1fea8c4f1

色空間

https://sharpcap-jp.sakura.ne.jp/SharpCapUserManual_JP-web/13_.htm

YUVとRGBの違い

https://vook.vc/n/507

カラーモデルというのは色空間でも色域でもありません。輝度と色の記録方法を決めたデザインのことです。RGBとYUVの他にも様々なカラーモデルが存在します。

カメラのセンサーでディベイヤーされた情報はRGBデータですが、エンコーディングされる際にYUVへと変換されて収録されます。(この際にデータレベルはコーデックによって判断されます)動画エンコーディングする場合は一般的にカラーサブサンプリングという色を間引いた圧縮が行われていて、それが4:4:4、4:2:2、4:2:0などとして表示されます。色を間引くのはデータを軽くするためで、YUVを使ったエンコーディングを行うのは色を圧縮するのに向いているからです。色だけを圧縮するのは人間の目が色の画質劣化に気づきにくいからだそうです。

※ 基本的に動画はエンコーディングの際にYUVに変換される。

RGB

https://e-words.jp/w/RGB.html

YUV

https://e-words.jp/w/YUV.html

Y: 輝度
U: 輝度情報と青色成分との差
V: 輝度情報と赤色成分との差

YUVフォーマットでは、人間の目が色相の変化よりも明るさの変化に敏感であるという性質を利用して、輝度情報により多くのデータ量を割くことで、少ない画質の劣化で高いデータ圧縮率を得ている。 このYUV方式の信号をパソコンのディスプレイで表示するには、RGB形式に変換する必要がある。

https://qiita.com/Yossy_Hal/items/8e0b9676698ba552c210