Skip to content

About

AI junk junk Garbage junk

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

RecordStudio

1〜5台のカメラを同時収録するブラウザアプリ。白系の画面、PC直結カメラ、別端末のカメラ、WebRTCでの録画バイト転送に対応します。

起動

Node.js 22以上とcloudflaredを用意します。npm installは不要です。 ip.example.txtをip.txtへコピーし、Node.jsと同じPCで動作する収録ブラウザのLAN IPv4アドレスをUTF-8で一行指定します。ブラウザのWebRTCのICE host候補にこのIPを使用します。Node.jsの待受IPを設定するファイルではありません。ファイルが存在しない場合や、IPアドレスではない値は起動を拒否します。 標準ではNode.jsが静的画面も配信し、trycloudflareのHTTPS URLで使用できます。GitHub PagesやSitesの配備を待つ必要はありません。設定を変える場合はconfig.example.jsonをconfig.jsonへコピーします。cloudflaredがPATHにない場合はcloudflaredに実行ファイルの絶対パスを指定します。 node server.mjsまたはStart.cmdで起動します。Node.jsの外部パッケージ依存はありません。 コンソールのAuthentication / QRリンクを開き、初回のローカル証明書を確認後、「収録画面を開く」を押します。カメラ端末ではQRを読み取り、カメラを追加します。画面やJS/CSSの配信にもSHA-512認証コードを必須にしています。 PCで保存先を選び「収録を開始」を押します。カメラは1台から使用できます。PC直結と別端末を合計して最大5台です。 標準ではPCのフォルダを選び、ファイルへ直接保存します。明示的にブラウザ内保存を選んだ場合は、同じ接続先を使える間にダウンロードしてください。Quick Tunnelのホスト名は再起動で変わるため、通常はフォルダ保存を使用します。 送信クライアントは専用のcamera.htmlで、自分のカメラ映像と自分の録画状態だけを表示します。

保存

カメラ側のMediaRecorderで一度だけエンコードします。別端末はその出力バイトをreliable/ordered WebRTC DataChannelで転送し、PCブラウザが再エンコードせず書き込みます。Node.jsへ映像は送信しません。 PCのフォルダへ順次書き込む方式と、OPFSへWorkerから書き込む方式があります。OPFSのファイルは「保存済みを開く」から取り出せます。録画全体をBlob配列へ蓄積しません。送信窓512KiB、DataChannelパケット最大48KiB、各カメラの録画キュー24MiBを上限とし、書き込みが追いつかなければ停止して不完全として記録します。受信側は他端末の映像を自動再生せず、受信バイトをそのまま保存します。ブラウザ内部のエンコーダやOSのバッファはアプリから完全には制御できません。 各カメラの映像と*_session.jsonを保存します。MP4/WebMは実際に利用できる形式から選択します。最大画質はカメラの設定値と実際の解像度・fpsを画面で確認できます。USB帯域、端末の発熱、ブラウザのエンコーダにより同時に維持できる画質は異なります。 映像はカメラごとに別ファイルです。同じ開始時刻を各端末へ予約し、端末間の時計差と実際の開始時刻を記録します。ハードウェアによるフレーム同期は保証しません。

接続

Node.jsのシグナリングと認証・QRページはTLS 1.3で127.0.0.1だけに待受します。Quick Tunnelは認証・シグナリング用ポートだけへ接続します。映像は送信ブラウザからip.txtの収録ブラウザへWebRTCのUDPで直接送り、Node.jsやtrycloudflareへ中継しません。Node.jsにWebRTCプロキシはありません。 QRとコピーする接続URLは、起動ごとに作り直す128桁のSHA-512認証コードを付けたtrycloudflareの入口を使います。時刻を種にせず、毎回OSの暗号学的乱数で1024byteの起動seedを生成します。SHA-256で作る鍵の基点は、その起動中の接続間だけで共通に使います。用途別のSHA-512 URLコードと32byteの役割別認証鍵・暗号鍵を作り、永続化しません。以前のURLやQRは再起動後に使えません。固定のサーバー識別値は設けません。 typed-voice-serverとtyped-voiceの添付コードを参照し、nonceによる相互HMAC-SHA-256認証、方向別HKDF-SHA-256/AES-256-GCMを実装しています。QRを包む鍵もランダム生成し、共通の秘密鍵や認証情報をコードに埋め込みません。送信クライアントは認証完了後にカメラを有効にします。URLコードは定時間比較し、失敗回数・接続数・認証待ち・リクエスト量を制限します。 STUN/TURNは使用せず、UDPのhost候補だけを交換します。収録側の候補のmDNSホスト名をip.txtのIPへ置き換え、送信側はそのIPの候補だけを受け付けます。送信前と経路変更時にブラウザが実際に選んだ接続先も確認し、指定IPへのUDP host/prflx経路でなければ映像を送信しません。

配備

GitHub Actionsでpublicをdistへビルドし、GitHub Pagesへ配備します。サーバー配布ZIPもArtifactsへ出力します。npmのインストールは行いません。 詳しい通信仕様はdocs/protocol.mdを参照してください。

About

AI junk junk Garbage junk

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages