UVCカメラ アイソクロナス転送のデバッグ:帯域、Alternate Setting、フレーム欠落
USB UVCカメラの失敗、アイソクロナス転送、Alternate Setting、帯域割り当て、フレーム欠落をトラブルシュートする方法を解説します。
USB Video Classデバイスはあらゆるところにあります。Webカメラ、産業用カメラ、顕微鏡カメラ、組み込みビジョンモジュール、テスト治具。UVCカメラが壊れたときの表面的な症状は単純です。映像が出ない、フレームレートが低い、フレームが落ちる、ある解像度では動くカメラアプリが別の解像度で失敗する。
USB証拠はそう単純ではありません。UVCカメラはディスクリプタ/クラス固有ネゴシエーション/Alternate Interface Setting/エンドポイント帯域/アイソクロナス転送挙動に依存します。「カメラが動かない」レポート単体では情報が足りないことが多いです。
UVCは列挙だけではない
UVCデバイスは正しく列挙されてもストリーミングに失敗します。列挙は「ホストがディスクリプタを読み、コンフィギュレーションを選んだ」ことを証明するだけです。映像ストリーミングには追加のネゴシエーションとエンドポイントトラフィックが必要です。
確認ポイント:
- Video Controlインターフェース
- Video Streamingインターフェース
- Formatディスクリプタ
- Frameディスクリプタ
- Frame Intervalの選択肢
- Probe/Commitコントロール
- 選択されたAlternate Setting
- アイソクロナスエンドポイントディスクリプタ
- パケットサイズと転送ステータス
640x480では動くが1080pで失敗するなら、ディスクリプタと帯域の証拠が理由を説明してくれるかもしれません。
Alternate Settingが重要
多くのUVCデバイスは、Alternate Interface Settingを使って複数の帯域レベルを提供します。ホストはストリーミング前にAlternate Settingを選びます。選択されたSettingがネゴシエートされたフォーマット/帯域と噛み合わないと、ストリーミングは失敗したりフレームを落としたりします。
キャプチャでの問い:
- どのAlternate Settingが選ばれたか?
- 提示されたエンドポイントの最大パケットサイズは?
- どのフォーマット/フレーム間隔がコミットされたか?
- アイソクロナス転送は始まったか?
- 転送エラーが直後から出たか?
- ホストは低いSettingへフォールバックしたか?
これは、ファームウェアエンジニアがフレームディスクリプタやエンドポイントコンフィギュレーションを変更する前に必要な証拠です。
アイソクロナス転送はタイミング優先
アイソクロナス転送は時間に敏感なデータ向けに設計されています。帯域を予約しますが、バルク転送のように再送はしません。映像には適切ですが、落ちたデータは「フレーム破損」「画像データ欠落」として現れます。
よくある原因:
- バスの帯域不足
- ハブトポロジ問題
- 競合するUSBデバイス
- 誤ったAlternate Setting
- ファームウェアのバッファ枯渇
- ホストコントローラの制限
- ケーブル/信号品質の問題
キャプチャは、パケットがスケジュールされたか、データが届いたか、ステータスエラーが起きたかを示すべきです。
アプリ側だけでUVCをデバッグしない
カメラアプリはUSBネゴシエーションを隠しがちです。自動で低い解像度に切り替えたり、MJPEGにフォールバックしたり、フレーム間隔をリトライしたり、転送エラーを覆い隠したりします。ファームウェア/デバイスメーカーにはそれでは足りません。
良いUVCサポート用キャプチャが残すもの:
- 要求フォーマット
- 要求フレームサイズ
- 要求フレーム間隔
- Probe/Commitの結果
- 選択されたAlternate Setting
- 転送ステータス
- 観測されたペイロードフロー
これがあれば、あるホスト/解像度で動いて別のそれで失敗する理由を説明できます。
Bus Scopeが活きる場面
Bus Scopeは「USBの証拠」のために作られています。UVCの場合、ディスクリプタ・コントロールリクエスト・エンドポイント選択・転送タイムラインを結びつける手助けをします。カメラビューアである必要はありません。ゴールは映像を見せることではなく、バス挙動を説明することです。
「UVC camera no video」「USB camera isochronous transfer failed」「webcam dropped frames USB capture」といった検索の答えは、ディスクリプタ/Alternate Setting/帯域/転送ステータスから始めるべきです。