1 ポイント 投稿者 GN⁺ 2024-08-08 | 1件のコメント | WhatsAppで共有
  • 1fps.video は、単一バイナリですぐに起動できるリンクベースの画面共有ツールで、開発者・ITチーム・セキュリティ専門家のように、会議よりも画面確認が必要なコラボレーションに向いている
  • コーディングでの共同作業では低いFPSでも十分な場合が多いという前提で、CPU・メモリ・ネットワーク使用量を減らし、古いノートPCへの負荷を下げる
  • 画面は 1 FPS で共有しつつ、WebSocketベースのカーソル追跡によりポインターの動きはほぼ30 FPSに近く表示し、精密なデモを補完する
  • エンドツーエンド暗号化を提供し、クライアントで生成されたキーはURLの # 以降に入り、バックエンドには送信されない
  • マルチモニター、画像品質・キャプチャサイズの調整、変更のない画面の送信省略により、長時間セッションと低トラフィック共有に重点を置く

1 FPSの画面共有方式

  • 1fps.video は画面共有を素早く開始できるツールで、Downloadからバイナリを入手できる
  • 主な対象は開発者、ITチーム、セキュリティ専門家、会議なしのコラボレーションを好むユーザー
  • 低FPSの画面共有は、ほとんどの共同作業、とくにコードを書く時間が多い開発者にとって十分な場合が多いという前提に立っている
  • この方式はリソースとトラフィックの削減に重点を置く
    • 音声が不要なため、会議なしの文化を促進する
    • CPU、メモリ、ネットワーク使用量を大幅に削減する
    • 古いノートPCでも画面共有中により快適に動作できる
    • リソース使用量が少ないため、より環境にやさしい
  • 共有環境はネットワーク条件に合わせて調整できる
    • マルチモニター共有に対応する
    • 画像品質を調整してトラフィック使用量を最適化できる
    • 大型ディスプレイでは画面キャプチャサイズを調整し、トラフィックをさらに減らせる
    • 画面が変わっていないときに不要なデータ送信を避けるインテリジェントな画面比較を使用する

セキュリティ、プライバシー、共有モデル

  • ほとんどのコーディング・開発作業には 1 FPS で十分だと考えており、カーソルの動きはWebSocketベースの追跡でほぼ30 FPSに近く提供する
  • 音声やビデオ通話なしで画面だけを共有したい内向的なユーザーやリモートワーカーに適している
  • 既存のチームチャットアプリケーションと併用でき、マルチモニター・画像品質・画面サイズ調整オプションにより、共有体験をネットワーク状況に合わせられる
  • プライバシーとセキュリティの構造は、リンクとクライアント側のキー管理に基づく
    • すべてのデータはエンドツーエンド暗号化される
    • 暗号化キーはクライアント側で生成され、サーバーには送信されない
    • キーはURLの # 以降に含まれ、バックエンドには渡されない
    • 完全なリンクを持つ人だけが共有画面にアクセスできる
    • 画面比較によりデータ送信を最小化し、プライバシーを強化する
  • 現在、カーソル座標の暗号化作業が進行中
  • ソースコードは Source Code で提供されている

1件のコメント

 
GN⁺ 2024-08-08
Hacker News のコメント
  • プロジェクト公開おめでとう。アイデアは素晴らしく、驚くほどミニマルだが、ソースを見るといくつもの暗号学的な欠陥があり、暗号化が重要な場面では使うべきではない

    1. ランダムキーを作ったあと [0] PBKDF2 に入れて [1] 32バイトの AES-GCM キーを作っているが、10個の制限された ASCII 文字とキー・ストレッチングを使えるなら、最初から 32バイトの乱数を作ればよい。PBKDF2 はパスワードをキーに変換するためのもので、今どき推奨されるアルゴリズムからは外れているので、こうした処理が必要なら scrypt のほうがよい
    2. AES-GCM に 12バイトのランダム nonceを使っている。GCM ではランダム IV を使うべきではなく、認証が破られる可能性がある [2] [3]。ランダム nonce に関する AES-GCM の落とし穴を避けるなら、XSalsa20+Poly1305 に切り替えたほうがよいかもしれない。XSalsa は nonce 長が拡張されているため、ランダム nonce を安心して使える利点がある
    3. 制限された文字集合からランダムキーを導出すると、総当たり攻撃が容易になる可能性がある。256ビットのランダムキーを使うべきで、そのキーを特定の文字集合に収めたいなら、暗号学的乱数生成器のバイト出力をその文字集合にエンコードするべきだ
    4. 1fps は URL のフラグメント識別子("#")で対称鍵を配布しているが、この部分はサーバーには送信されないはず。したがって、安全な鍵配布チャネルを前提としている。リンクに鍵が入っているので、"#" 以降は意図した受信者だけが見られる必要がある。サーバーが本当に悪意を持っていれば、クライアント JavaScript を配布してフラグメントをサーバーへ送るようにでき、その場合サーバーは鍵と平文通信の両方にアクセスできてしまう
      [0]: https://github.com/1fpsvideo/1fps/blob/main/1fps.go#L99
      [1]: https://github.com/1fpsvideo/1fps/blob/main/1fps.go#L287
      [2]: https://eprint.iacr.org/2016/475.pdf
      [3]: https://soatok.blog/2020/05/13/why-aes-gcm-sucks/
    • こういう助言をもらうためにここへ来たのでありがたい。できるだけ早くこれらの変更を反映するつもりだ
    • 論文は少し難しく感じる。ここでランダム IVを使うことの問題点を、もう少し具体的に説明してもらえるだろうか? ChaCha に切り替えられず、GCM しか使えないとしたら、代わりにどうすべきだろう?
    • こういうものを設計するときは落とし穴が多すぎる気がする。その上にアプリケーションを作れる標準的で信頼できる基盤はあるだろうか? TLS が使えるのかも気になる
    • XSalsa20+Poly1305 を勧めてくれてありがとう。以前から暗号には関心があったので、自前で暗号やプロトコルを作ってはいけない理由を学ぶのは興味深い
      この場合、nonce の問題を自分で直せとはあまり言われない主な理由が、実装時の落とし穴にあるのか、それとも上の記事にある一般的な問題ともっと微妙な形で結び付いているのか気になる
      素朴に考えると、AES-GCM は TLS や SRTP など多くの場所で使われているので、暗号に詳しくない人はこれが良い選択だと思ってしまいそうだ
    • 4番目の問題を解決するおすすめの方法はある? Web アプリに本質的な問題のように見えるし、ProtonMail も似たようなものに見える
  • コードを見ると、毎秒スクリーンショット(.jpg)を撮って送る方式のようだ。この方式が、前のフレーム情報を再利用する現代的な動画圧縮より本当に帯域を節約できるのか気になる
    VS Code でコードを編集する 1 分間の動画を 1440p・10fps・AV1 エンコードで録画したところ、同じ画面の JPEG スクリーンショット 60 枚より半分ほどのサイズだった。もしテストした数値があれば知りたい

    • 10年前の Windows 用フリーユーティリティ TimeSnapper Classic を試したことがあるが、5秒ごとにスクリーンショットを撮って 1 日をタイムラプスで見られる機能がよかった
      スクリーンショットがディスク容量をかなり食い、画像間で変わる部分がほとんどないのを見て、後続画像との差分だけを保存するアルゴリズムを思いついた。数分後、自分が動画圧縮を再発明していると気付いた
      そこで ffmpeg で画像シーケンスを mp4 に変換したところ、ファイルサイズはおよそ 95% 減った。ImageMagick でタイムスタンプ付きファイル名を画像に焼き込んで、実質的に TimeSnapper Classic の機能をコマンド 2 つで再現していたようなものだ
    • これは帯域だけの問題ではなく、CPU 使用率の問題でもある。スクリーンショットを ffmpeg や別のツールに流し込んでみたが、動作はしてもリソースを食いすぎて実用的ではなかった。少なくとも自分の 2019 年モデルの 13 インチ MacBook ではそうだった
      一方には CPU 使用率があり、もう一方にはネットワークがある。ネットワークは安いがエンコードは高くつく、というのが自分の感覚だ。証拠はなくローカル実験だけだが、測定を始めるのは本当に良い考えだと思う
      画面を走査して変化した部分だけを送る別案もある。画面の半分だけ送るだけでも、ネットワーク面では動画エンコードに勝てるかもしれない。ただし diff アルゴリズムは非常に高速である必要がある。1280x720 なら 914400 ピクセルで、1 ピクセル 4 バイトなら 1 秒あたり 3.49MB の情報を処理することになる
      動画エンコード効率と JPEG 60 枚生成のコストも気になる。両者は近いのだろうか?
    • 自分も真っ先にそう思った。標準的なコーデックを使って、なおかつ 1fps に設定しない理由はないように見える
    • 帯域の最小化というより、データの永続化を防ぐ、つまり置き換えと削除を選んでいるように見える
      望むなら両方とも簡単にできるだろうが、その手間に見合うかはわからない。同じ IP から規模が大きくなると、この方式が厳しくなるだろうという点には同意する
  • いいね
    私たちのワークフローは、オフィスや技術インフラの必要性をなくす方向で組まれている。タイムラインの出力物、つまり動画編集結果をリアルタイムでストリーミングし、オープンなコミュニケーションチャネルを用意している。チームメンバーの大半はかなり内向的なので push-to-talk 方式で、全体での議論が必要ない限り、たいていはチャットにメモを残すだけだ
    無骨な解決策のほうが、かえって採用されることが多い

    • そう聞けてうれしい。たった今サーバー側をオープンソースとして公開したので、もう少しいじって遊べる。ドキュメントは時間をかけて改善して、追いやすいものにしていくつもりだ
  • オーディオなしの画面共有の ユースケース は何だろう? いつ役立つのかよく分からない。とはいえ、結局は相手と何らかの形でやり取りしないといけないのでは?

    • たくさんある。たとえば家のコンピュータを置いたまま出勤するとき、リンクを保存しておけば家で何が起きているか見られる。リモートデスクトップも同じだ
      長い会議の最中でも、画面共有を続けておく必要があることがある。1〜2時間の会議に座って聞いているより、コーディングしていたいこともある
      それに、私のようにオーディオが好きではない人にも向いている。助けたい学生はたくさんいるが、オーディオまで含めたくはない。私の音声チャットは並列化しやすいリソースではない
    • 記事によると、1fps.video はオーディオやビデオ通話の負担なしに画面共有をしたい内向的な人やリモートワーカー向けで、すでに使っているチームチャットアプリと一緒に動く多目的ソリューションとのことだ
      音声通話中の画面共有 というより、スクリーンショットを送りながらテキストチャット するのに近く見える。これを好む人がいる理由は分かる
    • 詐欺師は、標的と電話で話しながら オーディオなしの画面共有 を使うこともある
    • 普通に電話すればいいのでは? みんな常に携帯電話を持っているのだから、その車輪を再発明する必要はない
  • 「Google Meet は1時間制限、Zoom は40分制限なので画面共有にうんざりした」という点については、jitsi[0] は WebRTC ベースのオープンソース[1]ビデオ会議代替だ。Zoom、Google Meet、Slack のようなものの代替として、かなり機能がそろっている
    メインサイトで使ってもいいし、望むなら自分でホスティングすることもできる
    [0]: https://meet.jit.si/
    [1]: https://github.com/jitsi

  • どのフレームを使うか選ぶ ヒューリスティック を作ってみると面白いかもしれない。常に最新フレームを無条件に選ぶのが理想とは限らず、動きが少ない、進行中のアニメーションがない、あるいは似た指標を持つフレームを選んだほうがよいかもしれない
    さらに凝るなら、ウィンドウ単位で分析してから全体フレームの集計のような形を組み立てることもできる

    • ウィンドウ単位で分析したあと全体フレームの集計を作るというのは、スマートフォンの「カメラ」が光センサー出力に過剰な計算をかけて、もはや写真と呼びにくくなる領域に近づくかもしれない [0]
      すばらしいアイデアだし、チェスでは似た発想を 静止探索(quiescence search)[1] と呼ぶと聞いたことがあるが、おそらく労力に見合う価値はないだろう
      [0] https://old.reddit.com/r/Android/comments/11nzrb0/samsung_sp...
      [1] https://en.wikipedia.org/wiki/Quiescence_search
    • そうすると、計算資源の使用を最小限にする という目的には反するかもしれない
      それでも、すばらしいアイデアであり興味深い問題に聞こえる
    • 実のところ、このアイデアは気に入っている。以前、変化が見つかった地点の周辺を 5〜10 ピクセル間隔の疎な 100x100 行列でスキャンして、起こりうる画面変化を検出することを考えていた
  • github.com/go-vgo/robotgoX11/extensions/XTest.h がないというコンパイルエラーが出る
    https://github.com/go-vgo/robotgo?tab=readme-ov-file#require...
    ページには書かれていない前提条件がある。Mint 22 では libxtst-dev パッケージをインストールする必要があった

    • ドキュメントを更新する。robotgo は Windows でいくつか問題があるので、今はその一部を調べているところだ
  • 今日まさにこういうものを探していた。物理テストイベントをリモート監視しているのだが、録画を有効にした Google Meet を開きっぱなしにしておくのはひどく、それでもインターフェース用の テキストチャット は必要だった
    とても良いミニマルなインターフェースに見える。気が向けば、チャットの永続性を何らかの形で付け足してみることもできそうだ
    追加の同期テキストや音声は、電話や Slack のテキスト説明のように別の場所でやるという理解で合っている?

    • たまに友人とこうしている。WhatsApp の通話と、私のノートPCと友人のPCのあいだのシンプルな画面共有を併用している
    • 今日こういうものを探していたと言っていたけど、今日の早い段階で本当に 1fps が必要だと思っていたの?
  • 私の用途では Moonlight Game Streaming がほぼ VNC を置き換えた。ファイル転送やクリップボード共有のような機能がもう少し良くなれば十分だ

    • 正直、クリップボードさえあればいいし、NAT 越えをしてくれるサービスがあるとうれしい
  • カーソル追跡に問題がある。モニターが複数あるせいかは分からない
    ここにある画像では、リングが実際のカーソル位置だ https://i.imgur.com/TvzskjS.png

    • 主要なユースケースごとに修正を入れていくと約束する。後でまた確認して、直っているか見てもらえると助かる。フィードバックありがとう