Sora Python SDK for Raspberry Pi を PyPI に公開した
まとめ
- Raspberry Pi の H.264 ハードウェアアクセラレーターに対応した
- ハードウェアアクセラレーターは V4L2 M2M 経由で利用
- libcamera と libcamera-controls に対応した
Sora Python SDK で Raspberry Pi に対応しました。ただ Raspberry Pi で動くというわけではなく、Raspberry Pi の能力を最大限に引き出せるよう、H.264 ハードウェアアクセラレーターや libcamera を利用できるようにしました。
Raspberry Pi 専用パッケージの提供
Raspberry Pi の性能を引き出すにはかなり特殊な対応が必要となるため、時雨堂では PyPI に sora-sdk とは別に Raspberry Pi 専用のパッケージ sora-sdk-rpi を用意しました。

これは sora-sdk とほぼ同じなのですが、Raspberry Pi 専用のハードウェアアクセラレーターや libcamera の機能を搭載したパッケージになります。使い方は通常の sora-sdk と同様 import sora_sdk
です。
今回パッケージを明確に分けたことにより管理やインストールが簡単になりました。
Raspberry Pi の H.264 ハードウェアアクセラレーターに対応
Raspberry Pi 4 までには H.264 のハードウェアアクセラレーターが搭載されています。これは VideoCore というチップが搭載されており、これにハードウェアアクセラレーターが搭載されています。
この仕組みを Raspberry Pi 64 bit で利用するには V4L2 M2M という機能を利用する必要があるのですが、しっかりと対応しました。
これにより CPU をほとんど利用する事無く、 H.264 のエンコードやデコードを行うことができます。
libcamera に対応
Raspberry Pi では USB カメラではなく Raspberry Pi Camera と呼ばれる MIPI CSI-2 が主流です。このカメラを活用するには libcamera と呼ばれるライブラリへの対応が必要になります。
Raspberry Pi の libcamera を WebRTC 経由で利用する仕組みを Sora Python SDK for Raspberry Pi では提供しました。
また libcamera にはコントロール機能があり、様々な機能に対応しています。Sora Python SDK for Raspberry Pi では全てのコントロール機能に対応しました。
以下に掲載している機能が全て利用できます。
https://libcamera.org/api-html/namespacelibcamera_1_1controls.html
サンプルコード
from sora_sdk import (
Sora,
SoraVideoCodecImplementation,
SoraVideoCodecPreference,
SoraVideoCodecType,
)
def main():
signaling_urls = ["wss://sora.example.com/signaling"]
video_codec_preference = SoraVideoCodecPreference(
codecs=[
# Raspberry Pi 5 には H.264 ハードウェアアクセラレーターが搭載されていません。
SoraVideoCodecPreference.Codec(
type=SoraVideoCodecType.H264,
encoder=SoraVideoCodecImplementation.RASPI_V4L2M2M,
decoder=SoraVideoCodecImplementation.RASPI_V4L2M2M,
),
],
)
sora = Sora(
video_codec_preference=video_codec_preference,
# native_frame_output=True を指定する場合は force_i420_conversion=False を指定する必要があります。
force_i420_conversion=False,
)
video_source = sora.create_libcamera_source(
width=1280,
height=720,
fps=30,
# native_frame_output=True を指定すると、libcamera から直接 I420 フォーマットのフレームが取得できます。
native_frame_output=True,
# libcamera のオートフォーカスを有効にする。
controls=[("AsFocusMode", "1")],
)
sora.create_connection(
signaling_urls=signaling_urls,
role="sendonly",
channel_id="libcamera",
video=True,
video_codec_type="H264",
video_source=video_source,
)