異なるOSプラットフォーム間でのシリアライズによるデータ共有
FlatBuffers
Webサイトの概要からその特徴を抜粋します。
- クロスプラットフォームシリアル化ライブラリ
- 解析/解凍せずにシリアル化されたデータにアクセス可
- データにアクセスするために必要なメモリはバッファメモリのみ
- 後方互換性と前方互換性を維持
- 小さなフットプリント
良くProtocol BuffersやJSONを用いたシリアライズの仕組みと比較されます。
本稿ではWindows11をホストとし、仮想環境のWSLをクライアントとして、そのプロセス間でシリアル化されたデータにアクセスできるFlatBuffersライブラリを使用して動画をホストからクライアントへ配信する仕組みを作成します。
Win-WSL FlatBuffers ビデオストリーミング 環境構築
以下、Windowsホストで動画をデコードし、FlatBuffersでシリアライズしたフレームをTCP経由でWSL2クライアントへ配信・表示するプロジェクトの環境構築を説明します。
アーキテクチャ概要
※SDL2(Simple Directmedia Layer): ビデオ再生ソフトウェア、エミュレーター、ゲーム等のグラフィックハードウェアへの低レベルアクセスを提供するために設計されたクロスプラットフォーム開発ライブラリ
開発プロジェクトの構成
※今回C:\dev\cppの直下にwin_wsl_flatbuffersフォルダを作成します。
win_wsl_flatbuffers/
├── common/
│ ├── shared_protocol.h # WireHeader・送受信ユーティリティ
│ ├── video_frame.fbs # FlatBuffersスキーマ
│ └── video_frame_generated.h # FlatBuffers v25.12.19 で生成
├── windows_host/
│ ├── win_host_fb.cpp # TCP サーバー(Windowsホスト)
│ └── CMakeLists.txt
├── wsl_client/
│ ├── wsl_client_fb.cpp # TCP クライアント(WSLクライアント)
│ └── CMakeLists.txt
└── scripts/
├── setup_windows_custom.bat # Windows側環境構築
├── setup_wsl_custom.sh # WSL側環境構築
├── build_and_run_windows.bat # TCPサーバーアプリビルド
└── build_and_run_wsl.sh # TCPクライアントアプリビルド
前提条件
Windows 側
- Windows 10/11 x64
- Visual Studio 2022 Build Tools(「C++ によるデスクトップ開発」ワークロード)
- Git for Windows
- 7-Zip(Gyan.dev FFmpeg バイナリを使用)
WSL 側
- WSL2(Ubuntu 22.04 または 24.04)
- WSLg 有効(Windows 11 推奨)
開発環境のセットアップ
ステップ 1: Windows環境セットアップ
Developer Command Prompt for VS 2022 でプロジェクトルートから実行します。
(1) 「開発者用コマンドプロンプト」を使用する
(Visual Studio専用の環境変数が設定されたプロンプトを使用)
→Windows のスタートメニューを開きます。
(2) 「Developer Command Prompt for VS 2022」
と入力して起動します
(3) 画面内で以下コマンドを実行してください。
※FFmpeg の選択肢でオプション 3(Gyan.dev lgpl-shared)を選択します。
cd C:\dev\cpp\win_wsl_flatbuffers
scripts\setup_windows_custom.bat
# "Press any key to continue . . ."のところで任意キー入力せずそのままにしておきます
オプション 3 選択後にGyan.dev FFmpegバイナリの手動展開
setup_windows_customがダウンロード完了したら、7-zipを公式サイト
https://www.7-zip.org/
からダウンロードします。続けてインストーラー64bit Windowsの場合は7-Zip 26.00 (x64)を選択します。
ダウンロードした7z2600-x64.exeをダブルクリックしてInstallボタンを押します。
(インストール先はデフォルトのC:\Program Files\7-Zipのままで問題ありません)
以下、別の PowerShellウィンドウを開いて以下を実行 します。
# 7-Zip で展開
& "C:\Program Files\7-Zip\7z.exe" x C:\temp\ffmpeg-lgpl.7z -oC:\
# 展開されたフォルダ名を確認
dir C:\ | Select-String ffmpeg
# ffmpeg-lgpl にリネーム(「8.0.1」は実際の該当バージョンの番号に置き換え)
Rename-Item C:\ffmpeg-8.0.1-full_build-shared C:\ffmpeg-lgpl
# ヘッダとライブラリの配置確認(どちらも True になればOK)
Test-Path C:\ffmpeg-lgpl\include\libavcodec\avcodec.h
Test-Path C:\ffmpeg-lgpl\lib\avcodec.lib
- → 配置確認後、setup_windows_custom実行画面に戻って任意のキーを押します。
ステップ 2: WSL環境セットアップ
新たにPowerShallウィンドウを起動してWSLを開始します。
※FFmpeg の選択肢でオプション 4(スキップ)を選択します。(WSLクライアントはFFmpegを使用しないため)
cd /mnt/c/dev/cpp/win_wsl_flatbuffers
bash scripts/setup_wsl_custom.sh
FlatBuffersバージョン確認・アップグレード
video_frame_generated.h は FlatBuffers v25.12.19 で生成されています。WSLにインストールしたapt版が古いバージョンの場合はアップグレードが必要です。
flatc --version
25.12.19以外のバージョン番号が表示された場合は以下でアップグレードします。
sudo apt-get remove -y libflatbuffers-dev flatbuffers-compiler
cd /tmp
wget -q https://github.com/google/flatbuffers/archive/refs/tags/v25.12.19.tar.gz \
-O flatbuffers.tar.gz
tar xzf flatbuffers.tar.gz
cd flatbuffers-25.12.19
cmake -B build -DCMAKE_BUILD_TYPE=Release \
-DFLATBUFFERS_BUILD_TESTS=OFF \
-DFLATBUFFERS_INSTALL=ON \
-DCMAKE_INSTALL_PREFIX=/usr/local
cmake --build build -j$(nproc)
sudo cmake --install build
flatc --version
# → 25.12.19 と表示されれば完了
アプリケーションのビルド
Windowsホスト側(TCPホスト)
Developer Command Prompt for VS 2022 画面上で実行します。
cd C:\dev\cpp\win_wsl_flatbuffers\windows_host
mkdir build
cd build
cmake .. -G "Visual Studio 17 2022" -A x64 ^
-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake ^
-DVCPKG_TARGET_TRIPLET=x64-windows ^
-DFFMPEG_ROOT=C:/ffmpeg-lgpl
cmake --build . --config Release
右記フォルダに実行形式ファイルが出力します: windows_host\build\Release\win_host_fb.exe
FFmpeg DLLを実行形式と同じフォルダにコピーします(必須):
copy C:\ffmpeg-lgpl\bin\*.dll C:\dev\cpp\win_wsl_flatbuffers\windows_host\build\Release\
WSLクライアント側(TCPクライアント)
WSLのウィンドウ上で実行します。
cd /mnt/c/dev/cpp/win_wsl_flatbuffers/wsl_client
mkdir -p build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
右記フォルダに実行形式ファイルが出力します: wsl_client/build/wsl_client_fb
アプリケーション(TCPホスト→TCPクライアントに動画配信)の実行
手順 1: Windows ホストの IP アドレスを確認
PowerShell画面上で確認:
ipconfig | Select-String "IPv4"
# 172.x.x.x 形式のIPがWSLと接続するネットワークインターフェースのIPアドレス(192.168.x.x は LAN 用なので今回未使用)。
手順 2: Windowsホスト(TCPホスト)を起動
PowerShell画面上で以下を実行します。
cd C:\dev\cpp\win_wsl_flatbuffers\windows_host\build\Release
# 合成アニメーションフレーム配信モード(アニメーションを自動生成)
.\win_host_fb.exe
# 動画ファイルを指定する場合
(以下配信したい動画ファイルがC:\dev\cpp\videoに該当するmp4ファイルが格納されている場合)
.\win_host_fb.exe C:\dev\cpp\video\sample.mp4
# ※ポート番号を変更する場合は以下の操作をおこなう(デフォルト: 9999)
.\win_host_fb.exe 9998
.\win_host_fb.exe C:\dev\cpp\video\sample.mp4 9998
win_host_fb起動成功時、以下の通り画面に表示されます:
[Host] TCP server: 0.0.0.0:9999
[Host] Resolution: 1920x1080
[Host] Frame loop started. Ctrl+C to stop.
[Host] Accept thread detached
[Host] Accept thread started
[Host] Frame 60 | 8100 KB | 10.0 ms
手順 3: WSLクライアント(TCPクライアント)を起動
WSLのウィンドウ上で以下を実行します。
cd /mnt/c/dev/cpp/win_wsl_flatbuffers
# 172.x.x.x の IP を指定して接続
DISPLAY=:0 wsl_client/build/wsl_client_fb 172.27.208.1
# ※ポートを指定する場合は以下
DISPLAY=:0 wsl_client/build/wsl_client_fb 172.27.208.1 9998
wsl_client_fbがwin_host_fbと接続を成功した時、以下の通り画面に表示します:
=== WSL FlatBuffers Video Client (TCP) ===
Server: 172.27.208.1:9999
[Main] Connected to 172.27.208.1:9999
[Main] First frame: 1920x1080 | FB size: 7910 KB
[SDL2] Renderer: opengl (1920x1080)
PowerShell上Windowsホスト側の画面にも以下のログが表示:
[Host] New client connected
[TCP] Client connected
このあと、PowerShell・WSL画面とは別にSDL2ウィンドウが開き、アニメーション(動画)のフレームが表示されます。
[VID_wsl_client_fb.mp4]
※ Q キー または Esc キー で終了します。
ソースコード変更後に再ビルドする場合
Windows側
cd C:\dev\cpp\win_wsl_flatbuffers\windows_host\build
cmake --build . --config Release
※scriptsフォルダのバッチファイルを使う場合:
cd C:\dev\cpp\win_wsl_flatbuffers
scripts\build_and_run_windows.bat
WSL側
cd /mnt/c/dev/cpp/win_wsl_flatbuffers/wsl_client/build
make -j$(nproc)
※scriptsフォルダのシェルスクリプトを使う場合:
cd /mnt/c/dev/cpp/win_wsl_flatbuffers
bash scripts/build_and_run_wsl.sh
-
注意:
build_and_run_wsl.shは必ずプロジェクトルートから実行してください。
scripts/フォルダ内から実行するとwsl_client ディレクトリが見つかりませんエラーになります。
GitHub
以下ソースコード・バッチファイル・シェルスクリプト・CMakeを保存しています。



