※このサンプルアプリケーションはActcastOS 3 に対応しています
RTSP を用いてリモートの映像を再生するサンプルアプリです。
- RTSP の映像をキャプチャするために actfw-gstreamer を利用しています。
- Actcast アプリでは外部と通信するために SOCKS プロキシを経由する必要がありますが、gstreamer は SOCKS プロキシに対応していないため、tcp2socks を用いて通信を透過させています。
- 対象機種: ディスプレイ接続済み Raspberry Pi (3 以上)
- RTSP で映像を配信できるサーバー (ネットワークカメラなど)
- PC からテスト映像を配信する方法に記載の手順により、PC から映像を配信することもできます。
- actdk
- Docker
make
これにより tcp2socksd のバイナリが app/bin/tcp2socksd
にダウンロードされます。
actdk に確認用 Raspberry Pi を登録します。
actdk remote add <IDENTIFIER_YOU_LIKE>@<REMOTE>
act_settings.json
を編集し、ネットワークカメラなどの RTSP URL を指定します。
actdk run
により Actsim 上でアプリケーションの動作確認をすることができます。停止させるには Ctrl + C
を押します。
actdk run -a <IDENTIFIER_YOU_LIKE>
[{"fps": 4.998874520340274}]
といったログが出力されます。また、Raspberry Pi にディスプレイを接続している場合はディスプレイに映像が表示されます。
以下はテスト映像を再生したときの様子です。
まずActcast に新規アプリケーションを作成します。
.actdk/setting.json
の app_server_id
を、先程作成したアプリケーションの ID に変更します。
アプリケーションをアップロードし、実機にインストールします。
display
: ディスプレイに表示するかどうかを指定します。rtsp_url
: RTSP の URL を指定します。fps
: RTSP で映像を再生する際のフレームレートを指定します。
このディレクトリ上で docker compose up
することにより、PC から rtsp://{YOUR_LOCAL_IP}:8554/test
でテスト映像を配信することができます。
デバイスが PC と同じネットワーク上にある場合はこの RTSP URL を設定値の rtsp_url
に指定することで、PC から配信される映像を再生することができます。なお、firewall などでポート 8554 がブロックされている場合は、ポートを開放する必要があります。
YOUR_LOCAL_IP
は PC のローカル IP アドレスになります (Docker コンテナの IP アドレスではありません)。OS によって確認方法が異なります。
Windows (WSL2)
- WSL2 上で
docker compose up
して rtsp 配信を開始しておく - PowerShell で 以下を実行して Windows の IP アドレスを拾う
$ ipconfig
:
:
Wireless LAN adapter Wi-Fi:
接続固有の DNS サフィックス . . . . .:
リンクローカル IPv6 アドレス. . . . .: fe80::d4ea:db39:34eb:71a5%7
IPv4 アドレス . . . . . . . . . . . .: 192.168.11.5
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 192.168.11.1
- Windows の IP アドレスを RTSP URL に指定する
rtsp_url
は Windows の IP アドレスを指定します。
以下は act_settings.json
の例です。
{
"display": true,
"rtsp_url": "rtsp://192.168.11.5:8554/test",
"fps": 5
}
ここで指定する IP アドレスは WSL2 の IP アドレスではなく、Windows の IP アドレスであることに注意してください。
- PowerShell を 管理者権限で実行して以下のスクリプトを実行する
以下は firewall の設定、および Windows への通信を WSL2 に中継するための設定になります。
# 出典: https://qiita.com/k_tomo/items/82234030e712c44c2e40
# 現在のユーザーが管理者権限を持っていない場合に、スクリプトを管理者権限で再実行するための処理です。
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) { Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs; exit }
# WSL 2 インスタンスの IP アドレスを取得します。
# bash.exe を使って、ip r コマンドを実行し、結果から IP アドレスを抽出します。
# IP アドレスが取得できない場合、スクリプトは終了します。
# IP アドレスのうち 'XXX.XXX.XXX.1' を除く
$ip = bash.exe -c "ip addr show | grep -oP '(?<=inet\s)\d+\.\d+\.\d+\.\d+' | grep -v '\.1$'"
if( ! $ip ){
echo "The Script Exited, the ip address of WSL 2 cannot be found";
exit;
}
# 通信を許可するポート番号のリストを指定します。
# このスクリプトでは、8554, 554 の 2 つのポートを指定しています。
$ports=@(8554,554);
$ports_a = $ports -join ",";
# 以前に作成されたファイアウォールの例外ルールを削除します。
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";
# New-NetFireWallRule コマンドを使用して、指定したポート番号に対するインバウンドおよびアウトバウンドのファイアウォール例外ルールを作成します。
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";
# netsh interface portproxy コマンドを使用して、ポートプロキシの設定を行います。
# 指定したポート番号に対して、IP アドレスを介しての接続を許可します。
for( $i = 0; $i -lt $ports.length; $i++ ){
$port = $ports[$i];
iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=* connectport=$port connectaddress=$ip";
}
# 作成されたポートプロキシの設定を表示します。
iex "netsh interface portproxy show v4tov4";
最後に以下のようなログが出力されれば設定完了です。
ipv4 をリッスンする: ipv4 に接続する:
Address Port Address Port
--------------- ---------- --------------- ----------
* 8554 172.20.86.32 8554
* 554 172.20.86.32 554
Linux
以下のコマンドでローカル IP アドレスを確認することができます。
ip addr show | grep -oP '(?<=inet\s)\d+\.\d+\.\d+\.\d+' | grep -v '\.1$'
macOS
以下の手順でローカル IP アドレスを確認することができます。
- 「システム環境設定」を開く
- 「ネットワーク」を選択
- 「Wi-Fi」(あるいは確認したいネットワーク接続名) を選択
- 「詳細...」ボタンを押下
- 「TCP/IP」を選択
- 「IPv4 アドレス」欄を確認