ラズパイカメラモジュール3を使ってみる
rpicamera-*
コマンドの使い方
画像
# --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
picamera2の使い方
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()
Gstreamerの導入
Gstreamerのインストール
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プラグインをインストール
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
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
Gstreamerについて
メディアに対して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データは下記の色情報のエンコーディングを利用できる。
-- -- -- 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: ラズパイカメラデバイスからビデオストリームを取得
- video/x-raw: ケイパビリティの指定
- 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 形式にエンコードする。
- 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を利用して出力を分岐する
-
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
ビット深度
色空間
YUVとRGBの違い
カラーモデルというのは色空間でも色域でもありません。輝度と色の記録方法を決めたデザインのことです。RGBとYUVの他にも様々なカラーモデルが存在します。
カメラのセンサーでディベイヤーされた情報はRGBデータですが、エンコーディングされる際にYUVへと変換されて収録されます。(この際にデータレベルはコーデックによって判断されます)動画エンコーディングする場合は一般的にカラーサブサンプリングという色を間引いた圧縮が行われていて、それが4:4:4、4:2:2、4:2:0などとして表示されます。色を間引くのはデータを軽くするためで、YUVを使ったエンコーディングを行うのは色を圧縮するのに向いているからです。色だけを圧縮するのは人間の目が色の画質劣化に気づきにくいからだそうです。
※ 基本的に動画はエンコーディングの際にYUVに変換される。
RGB
YUV
Y: 輝度
U: 輝度情報と青色成分との差
V: 輝度情報と赤色成分との差
YUVフォーマットでは、人間の目が色相の変化よりも明るさの変化に敏感であるという性質を利用して、輝度情報により多くのデータ量を割くことで、少ない画質の劣化で高いデータ圧縮率を得ている。 このYUV方式の信号をパソコンのディスプレイで表示するには、RGB形式に変換する必要がある。
GStreamer を使用した端末間での映像転送
Using UDP Multicast with GStreamer