Open10
esp-webrtc-solution メモ

モチベーション
- espressif/esp-webrtc-solution を利用して自社製品の ESP 向け SDK やクライアントを作りたい
前提
- Erlang/OTP と Python が書ける
- ESP32 が何かすらわからないところからスタート
- C 言語を仕事で書いたことはない
- 組み込み知らない

ESP32-P4
- H.264 HWA が利用できるのは ESP32-P4 のみ
-
ESP32-P4 High-performance SoC | Espressif Systems
including H.264 encoding support with a maximum performance of 1080p@30fps
- Espressif Reveals ESP32-P4: A High-Performance MCU with Numerous IO-Connectivity and Security Features | Espressif Systems
- 日本ではまだ売っていない模様
-
esp-h264-component/esp_h264/README.md at master · espressif/esp-h264-component
The hardware encoder (HW encoder) is designed specifically for the esp32p4 chip
-
ESP32-S3
でも OpenH264 ベースのソフトウェアエンコーダーは動くらしい -
ESP32-P4
の場合 HWA を使うと 1080p 30fps がメモリ 140k で行ける - esp-video-components/esp_video/README.md at master · espressif/esp-video-components
ESP32-S3
- 音声だけなら S3 でも良さそう
- ESP32-S3 Wi-Fi & BLE 5 SoC | Espressif Systems

ESP Component Registry
使いそうなやつ
- espressif/esp_libsrtp • v1.0.0 • ESP Component Registry
- espressif/esp_websocket_client • v1.4.0 • ESP Component Registry
- espressif/esp_codec_dev • v1.3.4 • ESP Component Registry
- espressif/esp_muxer • v1.1.2 • ESP Component Registry
- espressif/esp_audio_codec • v2.1.0 • ESP Component Registry
- espressif/esp_audio_effects • v1.0.1 • ESP Component Registry
- espressif/esp_video_codec • v0.5.1 • ESP Component Registry

macOS で環境構築
公式にある。VS Code 拡張は便利だが色々はまるという噂があったので、素直にマニュアルインストールを採用。
brew install cmake ninja dfu-util
mkdir -p ~/esp
cd ~/esp
git clone -b v5.4 --recursive https://github.com/espressif/esp-idf.git
cd ~/esp/esp-idf
./install.sh esp32
. ./export.sh
esp_websocket_client のサンプルをビルドしてみる
git clone --recursive git@github.com:espressif/esp-protocols.git
まだビルドできてない。
idf.py --preview set-target linux
idf.py build
./websocket.elf

OpenAI シグナリグメモ
- esp_peer_signaling は start / send_msg / stop の 3 種類があり、シグナリングの仕組みとしてはこれだけ
OpenAI の場合は WHIP っぽい Offer SDP を POST で投げて、Answer SDP を貰うという仕様。
const esp_peer_signaling_impl_t *esp_signaling_get_openai_signaling(void)
{
static const esp_peer_signaling_impl_t impl = {
.start = openai_signaling_start,
.send_msg = openai_signaling_send_msg,
.stop = openai_signaling_stop,
};
return &impl;
}
-
openai_signaling_t
がハンドラーとして引っ張ってきて、コールバックがある - send_msg というコールバック、スゴイ不思議
static int openai_signaling_send_msg(esp_peer_signaling_handle_t h, esp_peer_signaling_msg_t *msg)
{
openai_signaling_t *sig = (openai_signaling_t *)h;
if (msg->type == ESP_PEER_SIGNALING_MSG_BYE) {
} else if (msg->type == ESP_PEER_SIGNALING_MSG_SDP) {
printf("Receive local SDP\n");
char content_type[32] = "Content-Type: application/sdp";
char auth[128];
snprintf(auth, 128, "Authorization: Bearer %s", (char *)sig->cfg.extra_cfg);
char *header[] = {
content_type,
auth,
NULL,
};
int ret = https_post(OPENAI_REALTIME_URL, header, (char *)msg->data, openai_sdp_answer, h);
if (ret != 0 || sig->remote_sdp == NULL) {
ESP_LOGE(TAG, "Fail to post data to %s", OPENAI_REALTIME_URL);
return -1;
}
esp_peer_signaling_msg_t sdp_msg = {
.type = ESP_PEER_SIGNALING_MSG_SDP,
.data = sig->remote_sdp,
.size = sig->remote_sdp_size,
};
sig->cfg.on_msg(&sdp_msg, sig->cfg.ctx);
}
return 0;
}

ICE transport policy
ICE Transport Policy に対応していなかったので、要望をだしたら対応してくれました。嬉しい。

WHIP 対応
OpenAI Realtime API に対応していたので、WHIP にも対応して欲しいと要望だしたら、対応してくれました。