Jetson NanoからSkyWayで送信

Jetson NanoからSkyWay経由でカメラ画像を送信できたので、その方法を備忘録として残したいと思います。

前提条件

  • Jetson Nano Developer Kit
  • JetPack SD Card Image r32.3.1がセットアップ済み
  • Raspberry Pi Camera Module V2

パッケージを更新

お約束として、パッケージを更新しておきます。

sudo apt update
sudo apt upgrade

curlをインストール

sudo apt install curl

最新のDockerをインストール

curl -sSL https://get.docker.com/ | sh

一応 docker-compose もインストールしておきます。

sudo apt install python3-pip libffi-dev libssl-dev
sudo pip3 docker-compose

SkyWayから提供されているSkyWay WebRTC Gatewayのバイナリがarm32用なので、qemuをインストールします。

sudo apt install binfmt-support qemu qemu-user-static

ユーザーをDOCKER GROUPに入れておきます。

sudo usermod -aG docker <ユーザー名>

Dockerfileの準備

こちらのDockerfileを元にJetson Nano用に以下のように修正しました。

FROM forumi0721alpinearmhf/alpine-armhf-glibc:latest

#default 8000
ENV PORT_NUM 8000
#error/warn/debug
ENV LOG_LEVEL "error"

# Set the working directory to /skyway
WORKDIR /skyway

RUN apk add --no-cache --virtual tmpPackages ca-certificates wget && \
    wget https://github.com/skyway/skyway-webrtc-gateway/releases/download/0.2.1/gateway_linux_arm && \
    chmod +x ./gateway_linux_arm && \
    apk add libgcc && \
    apk add libuuid && \
    apk add libpthread-stubs && \
    rm /root/.wget-hsts && \
    echo [general] > ./config.toml && \
    echo api_port=$PORT_NUM >> ./config.toml && \
    echo log_level=\"$LOG_LEVEL\" >> ./config.toml && \
    apk del tmpPackages

ENV LD_LIBRARY_PATH /lib:/lib/glibc:/usr/lib

# Run rest when the container launches
ENTRYPOINT /skyway/gateway_linux_arm

Dockerイメージのビルド&起動

docker build ./ -t <タグ名>
docker run -itd --name <コンテナ名> -p 8000:8000 -p 50000-50063:50000-50063/udp <タグ名>

タグ名・コンテナ名は適当な名前を入れてください。

udpポートはこちらのサポートコミュニティの議論を参考にとりあえず64個分とってみました。

docker-composeの場合は以下の設定でいけると思います。

version: "3"
services:
  skyway:
    container_name: <コンテナ名>
    build: ./
    ports:
      - "8000:8000"
      - "50000-50063:50000-50063/udp"

nodeJSの準備

アプリをJavascript(Typescript)で書いたので、nodeJSを準備します。

使い勝手を考えてnvm経由でインストールします。

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.2/install.sh | bash
nvm install v12.16.1

こちらがサンプルアプリになります。

PeerIDは SSG_{Jetson Nanoのシリアルナンバー}になるので、クライアントから指定して接続してください。

時間がありましたら、iOSのサンプルアプリも紹介できたらと思います。

DeepStream ContainerでH264ハードウエアエンコーダーを使う

nvidia DeepStream SDK 3.0 のDocker ContainerにGStreamer用のH264のハードウエアエンコーダーが入っていなかったので、自前でインストールする方法の備忘録です。

前提条件

Ubuntu 18.04 x86_64
nvidiaグラフィックカード(RTX2060)
nvidiaドライバ(Driver Version: 418.56, CUDA Version: 10.1)
docker-ce
nvidia-docker
※カッコ内は自分の環境です。

ソースコードの取得

まず、ホスト側にソースコードをダウンロードしておきます。

また、コンテナ内のGStreamerのバージョンが1.8.3なので、こちらも1.8.3をチェックアウトします。

git clone git://anongit.freedesktop.org/gstreamer/gst-plugins-bad
cd gst-plugins-bad/
git checkout -b 1.8.3 1.8.3

ヘッダファイルの取得

cuda.h

/usr/local/cuda/include/cuda.hgst-plugins-bad/sys/nvenc/にコピーします。

nvEncodeAPI.h

こちらからVideo Codec SDKをダウンロードして解凍します。

include/nvEncodeAPI.hgst-plugins-bad/sys/nvenc/にコピーします。

コンテナ起動

ダウンロードしたソースコードをマウントする設定を加えて、コンテナを起動します。

nvidia-docker run -it --rm -v /home/hogehoge/gst-plugins-bad:/root/gst-plugins-bad -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -w /root nvcr.io/nvidia/deepstream:3.0-18.11

事前準備&ビルド

以下、コンテナ内でのコマンドになります。

  • /etc/apt/sources.listでdeb-srcを有効化
  • ビルドに必要なライブラリとヘッダファイルをインストール
  • ビルドに必要なライブラリのsoファイルのシンボリックリンクを作成
  • config&make
sed -i -e 's/# deb-src/deb-src/g' /etc/apt/sources.list
apt updte
apt build-dep -y gstreamer1.0-plugins-bad
ln -s /usr/local/cuda/lib64/libcudart.so.10.0.130 /usr/local/cuda/lib64/libcudart.so
ln -s /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.418.56 /usr/lib/x86_64-linux-gnu/libnvidia-encode.so
cd ~/gst-plugins-bad
NVENCODE_CFLAGS="-I/root/gst-plugins-bad/sys/nvenc" ./autogen.sh --with-cuda-prefix="/usr/local/cuda"
cd sys/nvenc
make

エラーが出ずにビルドが成功すると、gst-plugins-bad/sys/nvenc/.libslibgstnvenc.soができてるはずなので、こちらを/usr/lib/x86_64-linux-gnu/gstreamer-1.0/へコピーします。

gst-inspect-1.0 nvh264enc

を実行して、情報が表示されれば成功です。

次回起動以降はDockerfileを作って、libgstnvenc.so/usr/lib/x86_64-linux-gnu/gstreamer-1.0/ADDするのがよいと思います。

とりあえず、DeepStream 4.0ではサポートされるらしいのでそれまでのつなぎとして(^^)

参考