ビデオデバイスのレイテンシ計測

通常、何らかの処理や伝送をしているということは、その処理や伝送による時間がかかるので、絶対に何らかの形で遅れが生じます。

例えば、音が空気中を伝わるのには300m/s程度かかります。これはスピーカーからの距離が**10m**だった場合には**60fps換算で2フレーム**の遅れになります。1秒間に地球を7周半という途方も無いと思われる速度で伝わる光でさえも、**地球の裏側まで到達**するのに**60fps換算で8フレーム**の遅れがあります。

音や光以外でも、カメラや伝送プロトコル、オーディオインターフェイスやビデオチャプチャボードなどには固有のレイテンシ(遅れ)があります。リアルタイムに生成された事象を使って表現をするということは、この**レイテンシがある事を理解し、レイテンシとどう付き合っていくか**という側面があります。

なので、どのデバイスがどの程度のレイテンシを持っているかを正しく把握することはとても大切です。

### FrameDelayCalculator.tox

[![](http://img.youtube.com/vi/BhZ-aNPxftE/0.jpg)](http://www.youtube.com/watch?v=BhZ-aNPxftE)
http://www.youtube.com/watch?v=BhZ-aNPxftE

本記事の主題ですが、映像のデバイスのレイテンシを計測するためのtoxを作りました。Githubで公開しています。

[satoruhiga/TouchDesigner-FrameDelayCalculator](https://github.com/satoruhiga/TouchDesigner-FrameDelayCalculator)

計測には、ネットワークやオーディオの分野でよく使われる [ラウンドトリップタイム - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%83%88%E3%83%AA%E3%83%83%E3%83%97%E3%82%BF%E3%82%A4%E3%83%A0) と呼ばれる手法を使います。情報を出力してから入力が返ってくるまでの時間を計測する手法で、今回のtoxでは画像の輝度変化を観測値として使っています。


#### 映像プロトコルのレイテンシを計測する

![](images/2018-12-03-04-04-29.png)![download.png](https://qiita-image-store.s3.amazonaws.com/0/38051/21bcdbb2-6fe4-a67f-4341-e462d31c1d0d.png)

映像プロトコルのレイテンシの計測は非常に簡単です。↑ のスクリーンショットの例では `NDI In/Out TOP` のレイテンシを計測するセットアップですが、toxのインプットとアウトプットをそれぞれ`NDI In/Out TOP`に繋ぎます。その時に、`NDI Out TOP` から `NDI In TOP` に正しく動画が転送されているかを確認してください。

接続が終わったら `FrameDelayCalculator` の `Params > Run Test` を押します。10秒間計測して、平均値が表示されます。

#### 映像デバイスのレイテンシを計測する

![download.png](https://qiita-image-store.s3.amazonaws.com/0/38051/a78e2c52-04b3-a860-031e-bbd6c927ac65.png)

カメラやビデオキャプチャデバイスのような映像機器のレイテンシ計測の時にはまず計測したいデバイスの絵が表示されているTOPを接続します。↑ の例では `Video Device In TOP` を使いました。続けて、`Params > Open Output Window` を押して計測用のウィンドウを表示します。

`FrameDelayCalculator` のビューの中の白丸の位置のピクセルの輝度を見てフレームの輝度の立ち上がりを検出しているため、さきほど開いたウィンドウが白丸の位置にくるようにカメラの位置かウィンドウを位置を調整します。その後、`Params > Run Test` を押せばレイテンシが計算されます。

#### フレームの情報量

NDIなど、ネットワークごしに映像データをやりとりするプロトコルの場合、通常は画像を圧縮して転送することが多いです。圧縮にもそれなりの時間がかかったり、圧縮による映像の乱れが発生することがあります。

`Params > Noise Overlay` では、送出する画像にホワイトノイズを重ねることで情報量の多い(=圧縮しずらい)フレームを作り出すオプションです。プロトコルによってはホワイトノイズに近い映像だとフレームが欠けたり画質が落ちたりするので、この機能でそのような問題がないか確認します。

#### フレーム落ちの確認

`Params > Check Frame Drop` では、動画中にフレーム落ちがないかを確認できます。

![download.png](https://qiita-image-store.s3.amazonaws.com/0/38051/fa42fb79-9019-5317-5fea-57c94335f29c.png)

このオプションをOnにすると送出する映像にそれぞれ 60fps/30fps/15fps で動く四角の映像が乗せられます。戻ってきた映像に対して `Feedback TOP` で処理を加えることでフレームが足りていなければ歯抜け状に表示されるので、フレーム落ちが視覚的にわかりやすく確認できます。

### 色々なデバイスのレイテンシの計測

`FrameDelayCalculator` の基本的な使い方は以上です。

ツールとしては単純なものですがあとはアイディアと代数的な計算で色々なもののレイテンシが計測できます。

例えば:

- 他のPCにNDIで映像を送り、NDIで遅り戻してきた時間を計測 → **(NDI In/Out * 2分のレイテンシ) + ネットワーク往復のレイテンシ**
- PCの出力からHDMIキャプチャデバイスを用いた入力の時間 - 間にHDMIミキサーを挟んだ時の時間 → **HDMIミキサー単体のレイテンシ**
- 会場のモニタをカメラ撮影で計測したレイテンシ - 事前に計測したカメラのレイテンシ → **会場の映像システムのレイテンシ**

などでしょうか。これ以外にも色々と計測できるものがあると思うので色々計測してみましょう！

### Video Latency List

こちらに、作った色々なデバイスやシステムのレイテンシを投稿できるフォームを作りました。

[Video Latency List 投稿フォーム](https://docs.google.com/forms/d/e/1FAIpQLScRMEHehMMlzq5vM1VgWzEWffgkbVzk56m4gkGhtb4nCn28Ug/viewform)

投稿された内容はこちらのGoogleスプレッドシートにたまっていきます。

[Video Latency List](https://docs.google.com/spreadsheets/d/16rsY-cOrfBRStVVHAD3eKouEAymoFTIGcwUPl2MDVHI/edit?usp=sharing)

こちらも手持ちの機材はどしどし追加していくつもりですが、みなさんのお手元になんかメチャクチャ早いぞこのUSBカメラ… みたいなものがあったら是非計測して共有してみてください。

それでは、Happy Designing!