{"id":51417155,"url":"https://github.com/naporin0624/bucatini","last_synced_at":"2026-07-04T20:30:44.753Z","repository":{"id":367892367,"uuid":"1282172797","full_name":"naporin0624/bucatini","owner":"naporin0624","description":"Receive an NDI video source and republish it as a GPU texture — Syphon on macOS, Spout on Windows","archived":false,"fork":false,"pushed_at":"2026-06-28T22:17:09.000Z","size":997,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-28T23:17:31.338Z","etag":null,"topics":["cross-platform","ffi","gui","macos","metal","ndi","rust","spout","syphon","windows"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/naporin0624.png","metadata":{"files":{"readme":"README.ja.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-27T12:20:42.000Z","updated_at":"2026-06-28T21:58:47.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/naporin0624/bucatini","commit_stats":null,"previous_names":["naporin0624/ndi-to-sharedtexture","naporin0624/bucatini"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/naporin0624/bucatini","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naporin0624%2Fbucatini","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naporin0624%2Fbucatini/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naporin0624%2Fbucatini/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naporin0624%2Fbucatini/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/naporin0624","download_url":"https://codeload.github.com/naporin0624/bucatini/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naporin0624%2Fbucatini/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35135341,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-04T02:00:05.987Z","response_time":113,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cross-platform","ffi","gui","macos","metal","ndi","rust","spout","syphon","windows"],"created_at":"2026-07-04T20:30:44.271Z","updated_at":"2026-07-04T20:30:44.734Z","avatar_url":"https://github.com/naporin0624.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bucatini\n\n[English README](README.md)\n\nNDI 映像ソースを受信し、その映像を **GPU 共有テクスチャ** として再配信する\nクロスプラットフォーム対応の CLI + GUI ツールです。出力は macOS では **Syphon**\n（Metal）、Windows では **Spout** を使い、NDI 映像を Resolume・OBS などへ\n受信側で CPU コピーを挟まずに橋渡しします。macOS / Syphon は実機検証済みで、\nWindows / Spout は現状 CI でのコンパイル確認のみです（「対応範囲」を参照）。\n\n## 仕組み\n\nNDI はネットワーク経由で **CPU メモリ上の映像フレーム** を運び、Syphon は\n**GPU 上の Metal テクスチャ** をプロセス間で共有します。本ツールは受信フレームを\nBGRA で受け取り、IOSurface 経由で Metal テクスチャ化して `SyphonMetalServer` で\n公開します（色変換シェーダ不要）。\n\n```\nNDI 送信元 ──(ネットワーク)──▶ bucatini ──(Syphon / Metal)──▶ Resolume / OBS / Syphon Recorder\n```\n\n## インストール（ビルド済み）\n\n[Releases](../../releases) からインストーラを入手できます。\n\n- **macOS** — `Bucatini-\u003cversion\u003e-macos-universal.dmg`。開いて `Bucatini.app` を\n  Applications にドラッグします。**未署名**ビルドのため、初回は `Bucatini.app` を\n  右クリック →「**開く**」→「**開く**」で起動してください（それでもブロックされる\n  場合は dmg 内の *READ ME FIRST.txt* を参照）。\n- **Windows** — `Bucatini-\u003cversion\u003e-windows-x64-setup.exe`。実行すると GUI と CLI が\n  インストールされ、スタートメニューにショートカットが作成されます。未署名のため\n  SmartScreen が出たら「**詳細情報 → 実行**」で進めてください。\n\nインストールを好まない場合のために `.tar.gz` / `.zip` アーカイブも添付しています。\nいずれの場合も **NDI ランタイムは別途必要**です（下記参照）。\n\n## 前提条件\n\n### 実行に必要（配布バイナリを使う場合も含む）\n\n- **NDI ランタイム** — 本アプリは実行時に NDI ランタイムライブラリをロードするため、\n  配布バイナリを使う場合でもインストールが必要です。\n  - **macOS**: `brew install libndi`（`/usr/local/lib/libndi.dylib` を提供）。\n    または [NDI Tools](https://ndi.video/tools/) for macOS をインストール。\n  - **Windows**: [NDI Tools](https://ndi.video/tools/)（または NDI Runtime 単体）を\n    インストール。`Processing.NDI.Lib.x64.dll` が含まれます。本アプリは DLL を遅延\n    ロードし、ランタイムインストーラが設定する環境変数 `NDI_RUNTIME_DIR_Vx`\n    （例 `NDI_RUNTIME_DIR_V6`）から DLL を実行時に解決します。そのため **DLL を exe\n    の隣に置いたり PATH に追加したりする必要はありません**。NDI Tools が未インストール\n    だと起動時に「`Processing.NDI.Lib.x64.dll` が見つからない」エラーになります。\n\n### ビルドに必要（macOS）\n\n- **フル版の Xcode**（Command Line Tools だけでは不可）。`xcrun` が `MacOSX.sdk` を\n  見つけられない場合:\n  ```bash\n  sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer\n  ```\n- **Metal Toolchain**（Syphon の Metal シェーダのコンパイルに必要）。framework の\n  ビルドが `cannot execute tool 'metal'` で失敗する場合、一度だけ実行:\n  ```bash\n  xcodebuild -downloadComponent MetalToolchain   # 約 688 MB のダウンロード\n  ```\n- Rust（stable）。\n\n## ビルド（macOS）\n\n```bash\nsudo xcode-select --switch /Applications/Xcode.app/Contents/Developer   # 必要な場合のみ\nxcodebuild -downloadComponent MetalToolchain                            # 'metal' ツールが無い場合のみ、一度だけ\n./scripts/setup-syphon.sh   # vendor/Syphon.framework をビルド（初回のみ）\ncargo build --release\n```\n\n`scripts/setup-syphon.sh` は git submodule（`vendor/syphon-src` →\nSyphon-Framework）を取得し、`xcodebuild` で `vendor/Syphon.framework` をビルドします。\n\n## 開発\n\nlint / test のゲートは [rusty-hook](https://github.com/swellaby/rusty-hook)\n（Rust 製の git-hook インストーラ。Node 不要）で担保しています。フックは CI と\n同じコマンドを実行します。\n\n| フック | コマンド |\n|---|---|\n| `pre-commit` | `cargo fmt --all -- --check` \u0026\u0026 `cargo clippy --all-targets --features gui -- -D warnings` |\n| `pre-push` | `cargo test --features gui` |\n\nフックは dev-dependencies の初回ビルド時に自動でインストールされます。クローン後は\n一度ビルドして有効化してください。\n\n```bash\ncargo build --features gui   # rusty-hook が git フックを設置\n```\n\n## 使い方\n\n```bash\nbucatini --list                          # 検出された NDI ソース一覧を表示して終了\nbucatini --source \"STUDIO (Camera 1)\"    # 名前（部分一致）でソースを選んで配信\nbucatini                                 # 一覧から番号で対話的に選択\nbucatini --source Cam --name \"MyFeed\"    # Syphon 公開名を指定（既定: ソース名）\n```\n\n### オプション\n\n| オプション | 説明 |\n|---|---|\n| `--list` | 検出された NDI ソースを一覧表示して終了 |\n| `--source \u003c名前\u003e` | NDI ソース名（大文字小文字を無視した部分一致）。未指定かつ非 `--list` 時は対話選択 |\n| `--name \u003c名前\u003e` | Syphon の公開名（既定: 選択した NDI ソース名） |\n| `--timeout \u003cms\u003e` | 検出・キャプチャのタイムアウト（ミリ秒、既定 5000） |\n| `--verbose` | 受信解像度などのログを表示 |\n\n配信を受け取るには Syphon 対応アプリ（Resolume、Syphon Recorder、OBS の Syphon\nプラグインなど）を開いてください。停止は **Ctrl-C** です。\n\n## GUI（ランチャー）\n\nCLI と同じ動作を画面から操作できる、最小構成の GUI ランチャー `bucatini-gui` も\n同梱しています（[egui](https://github.com/emilk/egui) 製）。ソースをドロップダウンから\n選んで **Start / Stop** するだけです（公開名は選択したソース名になります）。\n\n\u003e GUI を初めてビルドする前に、同梱フォント（LINE Seed JP）を取得してください:\n\u003e ```bash\n\u003e ./scripts/fetch-fonts.sh   # vendor/fonts/ に LINE Seed JP を取得（初回のみ）\n\u003e ```\n\n```bash\n# GUI は `gui` フィーチャの別バイナリ（CLI ビルドには含まれません）\ncargo run --release --features gui --bin bucatini-gui\n# またはビルドだけして実行\ncargo build --release --features gui --bin bucatini-gui\n./target/release/bucatini-gui\n```\n\n操作:\n\n- **Source** — 検出された NDI ソースをドロップダウンから選択（**Refresh** で再検索）。\n- **Start / Stop** — 再配信の開始・停止。実行中は受信フレーム数がライブ表示されます。\n\nソース検索も受信ループもワーカースレッドで動くため、UI は固まりません。macOS では\nCLI と同じビルド前提条件（Xcode・Metal Toolchain・`vendor/Syphon.framework`）が\n必要です。\n\nウィンドウの **×** はアプリを終了せず、トレイ（macOS=メニューバー /\nWindows=通知領域）に格納します。格納中も再配信は継続します。トレイのアイコン／\nステータス項目をクリックすると復帰、**Quit** で終了します。（**Cmd+Q**／Windows は\n**Ctrl+Q** でも終了します）。テーマはローカルの `cannelloni` を参考にしたダーク配色です。\n\n## Windows / Spout（実験的・未検証）\n\nWindows では Spout 出力に対応します（`SharedTextureOutput` trait による抽象化で、\nmacOS=Syphon / Windows=Spout を切り替え）。\n\n\u003e ⚠️ **注意:** Windows/Spout バックエンドは現状 **GitHub Actions（windows-latest）で\n\u003e のコンパイル検証のみ**で、実機での動作確認は未実施です。色順・上下反転・SpoutDX\n\u003e 初期化まわりは実機検証で調整が必要な可能性があります。\n\n### 実行（配布バイナリを使う場合も含む）\n\n[NDI Tools](https://ndi.video/tools/) をインストールして NDI ランタイムを用意して\nください（上記「前提条件 → 実行に必要」を参照）。受信は Spout 対応アプリ（Resolume、\nOBS の Spout プラグインなど）で行います。\n\n### ビルド手順（Windows / PowerShell）\n\n```powershell\n./scripts/fetch-spout2.ps1            # vendor/Spout2 へ Spout2 SDK を取得\n./scripts/install-ndi-sdk.ps1         # NDI 6 SDK をサイレントインストール（Processing.NDI.Lib.x64.lib を提供）\n#   インストール先が標準と異なる場合は環境変数 NDI_SDK_DIR を設定\ncargo build --release\n```\n\nNDI のインポートライブラリは `%NDI_SDK_DIR%\\Lib\\x64\\Processing.NDI.Lib.x64.lib`\n（既定 `C:\\Program Files\\NDI\\NDI 6 SDK`）を参照します。ビルドには NDI **SDK** が、\n実行には NDI **Runtime** が必要です（SDK にはランタイムも同梱されます）。\n\n## 対応範囲\n\n- **macOS / Syphon** — 実機検証済み（v1）。\n- **Windows / Spout** — コンパイル検証のみ（実機動作は未検証）。\n\n## ライセンス / 第三者ソフトウェア\n\n本ツールは Syphon Framework（BSD）を同梱ビルドし、NDI ランタイム（libndi、別途\nインストール）にリンクします。詳細は [THIRD-PARTY-NOTICES](THIRD-PARTY-NOTICES) を\n参照してください。NDI® は Vizrt NV の登録商標です。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnaporin0624%2Fbucatini","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnaporin0624%2Fbucatini","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnaporin0624%2Fbucatini/lists"}