アマレコTV Ver3.00a 不具合修正版と再生音の話
■アマレコTV Ver3.00a
【更新内容】
(1) タイマー録画時に時間になっても録画が停止しない。再生できないビデオファイルが出来上がるのを修正。
(2) HDDの残り容量が少なくなっても録画が停止しない。再生できないビデオファイルが出来上がるのを修正。
(3) ステータスバーに表示するHDDの空き容量の小数点以下が表示されないのを修正。
(4) ステータスモニターに録音デバイスの実際のアロケーターサイズの表示を追加。
ダウンロード
(Ver3.00に対する差分のみです、Ver3.00に上書きして使ってください。)
■アマレコTV、アマミキ!の再生音について
アマレコTVとアマミキ!では再生音が遅延しないように極めて少ない再生バッファで音を再生するようになっています。そのため、一般的なアプリケーションより再生音がプチプチしたり、ゆがんだりと不安定になる場合があります。
以前のバージョンでは遅延が増えてきたときに急激な補正をかけて短い時間で遅延から回復するように制御(もしくはデータを捨てる)していましたが、それだと、”音がゆがむ”(データを捨てる場合はプチプチする)のが目立つため、Ver3.00では急激な補正を辞め、長い時間をかけて少しずつ遅延から回復するように変えました。そのため、音のゆがみはほぼ知覚できないと思います。その代わり、遅延から復帰するのに数十秒かかる感じです(以前は数秒で遅延から回復)。
■反応時間と補正状況の表示
アマレコTVの場合はステータスモニター画面で確認できます。

「Audio」をOnにして、RendererのLatency部で確認できます。

アマミキ!の場合は設定画面の再生デバイスにある「反応時間を表示」をOnにします。

メイン画面の左下のステータス欄に反応時間が表示されます。

Lが反応時間、カッコ内は目標反応時間の設定値でそれぞれの単位はミリ秒です。反応時間は再生デバイスのバッファに溜まっているデータ量を示していて、40なら1000分の40秒ぶんの音データが再生デバイスのバッファに溜まっていることを表します。これは、向こう40ミリ秒は安定した再生ができるけど、40ミリ秒以内に次のデータをバッファにセットできないと音が途切れる(プチプチする)ことを意味しています。
MFはマイクロフィードバックの略で、補正状況を表しています。0なら現在補正を行っていません。
マイナスの場合は遅延が許容量を超えたため再生速度をほんのわずかに速めて遅延を減らします(Lが少しづつ減るように制御)。
プラスの場合はバッファの溜まりが少なく音が途切れる可能性があるため、ほんのわずかに再生速度を遅くします(Lがすこしづつ増えるように制御)。
これらにより、反応時間が目標値に近づくように制御します。
■反応時間の設定
アマレコTVの高度な設定にある「再生プロパティ」。アマミキ!の場合は、再生デバイスにある「レンダラープロパティ」を押すとオーディオレンダラーの設定画面が表示されます。
なお、ライブ機能がインストールされていないとこの設定画面は表示されないので先にライブ機能をインストールして下さい。

「目標反応時間」と「反応時間許容範囲」の2つをスライダーを動かして設定します。
初期値は目標反応時間40ms、反応時間許容範囲10msとなっています。
■設定例
目標反応時間:40ms
反応時間許容範囲:10ms
の場合は次のように動作します。
反応時間が30msから50msの間(許容範囲内=目標値の±10ms)にある場合はマイクロフィードバック制御をおこないません。
反応時間が30ms未満、または、50msを超える(間許容範囲を外れる)場合は反応時間が40ms(目標値)になるようにマイクロフィードバック制御を行います。
■実際の音遅延は?
今回は再生デバイスにおける遅延なので、実際はこれに録音デバイスの遅延とプラスαが加わります。録音デバイスの遅延は一概には言えませんが大抵アロケータサイズで決まります、また、プラスαは大体20ms位なので、
アロケーターサイズ:40ms
目標反応時間:40ms
プラスα:20ms
の場合、音の遅延は約100msとなります。
ちなみに、HDMIなどを使ってテレビやPCモニターのスピーカーから音を出すとテレビ、モニターによる遅延がさらに加わります。
実際の音遅延に関しては過去の記事を見てください。
アマレコTV・アマミキ!用 オーディオレンダラーフィルタ Ver2.30a ベータ版
アマレコ・オーディオ・レンダラー デバックログとビデオキャプチャ編
フィードバック制御の仕方が変更になっていますが、目標反応時間が同じなら実際の遅延も同じ結果となります。
アマレコ・オーディオ・レンダラー デバックログとビデオキャプチャ編
またビデオキャプチャカードに搭載されているオーディオデバイスについてもふれます。
アマレコ・オーディオ・レンダラーのデバックログを見ると録音デバイス、再生デバイスの挙動がある程度見えてきます。主に次のことがわかります。
・録音デバイスが何ミリ秒単位で録音処理しているか(実際のアロケータサイズ)
・録音デバイスが何ミリ秒間隔でデータを送ってくるか(インターバルタイム)
・再生デバイスの実再生レート(再生サンプリングレート)
・そのとき再生デバイスにバッファリングされているデータ量(Latency)
・アマレコ・オーディオ・レンダラーの可変再生速度により補正された様子
1.デバックログのとり方
AmaAudioRenderer.iniのiDebugLogを1にするとAmaRecTV.exeまたはAmaMix.exeと同じフォルダに
「AmAudioRenderer(日時)[デバイス名].txt」と言ったファイル名でデバックログが作成されます。
2.デバックログの見方
例
0:02:46.341s(41ms):Smp( recv=1920, write=1901( 99%+0), 48000Hz), Latency=29(20)ms, FALSE= 0, Pos=07981185, 48040, 0:######### |
項目 | 例 | 説明 |
最初 | 0:02:46.341s(41ms) | データを記録した時間です。例ではプレビューを開始してから2分46秒341ミリ秒経過したときに録音デバイスからデータを受け取っています。 カッコ内は前のデータからの間隔(インターバルタイム)です。例では41ミリ秒間隔でデータを受け取っています。 |
Smp | Smp( recv=1920, write=1901( 99%+0), 48000Hz) | recvは録音デバイスから受け取ったデータのサンプル数(=アロケータサイズ)。例では1920サンプル(約40ミリ秒分の音声)のデータを受け取りました。 writeは再生デバイスの再生バッファへ書き出したデータのサンプル数。例では1901サンプル(約39.6ミリ秒分の音声)のデータを書き出しています。 カッコ内は可変再生速度による補正がどのように行われたかを記録しています。 100%なら補正を行っていません。99%なら1%再生時間が短くなるよう補正しています。 101%なら1%再生時間が長くなるよう補正しています。 パーセントの後の+0はさらに細かい制御(マイクロフィードバック制御)情報です。+1か-1になることがあります。 それぞれ1サンプル分再生時間を長く(短く)なるよう補正したことを表します。 最後に再生デバイスの再生レート(サンプリングレート)の実測値を10秒間の平均値で記録しています。 |
Latency | Latency=29(20)ms | その時点での反応時間です。再生バッファに溜まっているデータ量を1ミリ秒単位で記録しています。 カッコ内は設定値の目標反応時間です。この値に近づくよう可変再生速度が働きます。 例では目標が20ミリ秒に対し現在の反応速度が29ミリ秒と遅れているため、再生時間を短くし、反応時間が20ミリ秒に近づくよう可変再生速度による補正が行われています。 |
FALSE | FALSE= 0 | 可変再生速度により補正が行われた回数をカウントしています。 必ず必要な補正(プレビューの開始直後や途中で設定値が変更された場合)はカウントされません。 また、マイクロフィードバック制御の場合もカウントしません。 例では補正が行われていますが、直前に目標反応時間が30から20に変更された事による補正のためカウントされていません。 |
Pos | Pos=07981185,48040,0 | 再生デバイスのその時点での再生位置です。余り重要ではありません。 48040,0はLatencyの値を計算するのに使う補正値です。余り重要ではありません。 |
最後の# | ######### | 補正の様子を#の個数で表示します。100%の時#を10個表示します。99%の時は9個と1%ごとに#が減ります。 |
3.デバックログの例
OS | Windows7 x64 Professional SP1 | |
CPU | Intel(R) Core(TM) i5-3470S CPU @ 2.90GHz Ivy Bridge | |
MB | ASRock H77 Pro4-M (Intel H77) | |
Memory | DDR3 1600 8GB(4GBx2 Dual Cannel)read=23.7GB/s write=12.2GB/s | |
Software | アマミキ! Ver1.01 AmAudioRenderer Ver2.30 | |
Audio Device | オンボードのLine入力、Line出力 Realtek High Definition Audio | Driver:6.0.1.6482 |
Capture Card | GV-USB2 S端子 | Driver:1.1.0.93.5, 2010.06.28 |
SD-USB2CAP4 S端子 | Driver:5.2009.917.0 | |
SC-500N1/DVI コンポーネント端子 | Driver:1.1.0.108.0, 2011.08.09 |
遅延の実測はステレオ(左右同音)の片チャンネルだけPCのLine入力に接続し、PCのLine出力端子の様子と、PCを通さなかったもう一方のチャンネルの波形を記録します。PCを通さなかった方を基準にしPCを通したチャネルがどれだけ遅れたかを観察します。

3.1.オンボードのオーディオデバイスのLine入力とLine出力
0:04:51.861s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14006198, 47999, 639:########## 0:04:51.892s(31ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14007678, 48000, 9:########## 0:04:51.932s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14009637, 48001, 8:########## 0:04:51.972s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14011559, 48002, 8:########## 0:04:52.013s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14013520, 48003, 7:########## 0:04:52.054s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14015479, 48004, 6:########## 0:04:52.095s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14017436, 48005, 5:########## 0:04:52.135s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14019357, 48006, 5:########## 0:04:52.176s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14021320, 48007, 5:########## 0:04:52.217s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14023280, 48008, 4:########## 0:04:52.257s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14025240, 48009, 3:########## 0:04:52.297s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14027158, 48010, 3:########## 0:04:52.338s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14029119, 48011, 2:########## 0:04:52.379s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14031080, 48012, 1:########## 0:04:52.420s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14033040, 48012, 0:########## 0:04:52.460s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14034958, 48012, 0:########## 0:04:52.501s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14036920, 47999, 639:########## 0:04:52.532s(31ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14038399, 48000, 9:########## 0:04:52.572s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14040358, 48001, 8:########## 0:04:52.612s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14042280, 48002, 8:########## 0:04:52.653s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14044240, 48003, 7:########## 0:04:52.694s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14046199, 48004, 6:########## 0:04:52.735s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14048159, 48005, 5:########## 0:04:52.775s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14050087, 48006, 5:########## 0:04:52.816s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14052046, 48007, 4:########## 0:04:52.857s(41ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=14054007, 48008, 4:########## |
アロケータサイズが40msなので本来ならインターバルタイムは40msなりますが、デバックログを見ると所々31ms間隔になっているのがわかります。
これは、40ms間隔でデータを送るべきところを僅かに遅れ41ms間隔でデータが送られていて、その遅れが徐々に蓄積し10msの遅れに達したとき30ms間隔にすることでバランスをとるよう録音デバイスが動作しているためです。
長い目で見れば遅れた分を取り戻すように動作してるため問題になりませんが、遅延をできるだけ減らそうとした場合は厄介です。 結局この録音デバイスはアロケータサイズによる遅延(40ms)と動作タイミングのばらつきによる遅延(10ms)をあわせた50msの遅延が最低でも生じることになります。
3.2.キャプチャカードSC-500N1/DVI とオンボードLineアウト
0:01:01.171s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=02923357, 48000, 0:########## 0:01:01.211s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=02925278, 48000, 0:########## 0:01:01.251s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=02927197, 48000, 0:########## 0:01:01.291s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=02929117, 48000, 0:########## 0:01:01.331s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=02931037, 48000, 0:########## 0:01:01.371s(40ms):Smp( recv=1920, write=1921(100%+1), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=02932959, 48000, 0:########## 0:01:01.411s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=02934878, 48000, 0:########## 0:01:01.451s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=02936798, 48000, 0:########## 0:01:01.491s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=02938718, 48000, 0:########## 0:01:01.531s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=02940640, 48000, 0:########## 0:01:01.571s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=02942557, 48000, 0:########## 0:01:01.611s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=02944478, 48000, 0:########## 0:01:01.651s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=02946398, 48000, 0:########## 0:01:01.691s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=02948318, 48000, 0:########## 0:01:01.731s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=02950237, 48000, 0:########## 0:01:01.771s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=02952158, 48000, 0:########## 0:01:01.811s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=02954078, 48000, 0:########## 0:01:01.851s(40ms):Smp( recv=1920, write=1920(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=02955999, 48000, 0:########## |
アロケータサイズは40msで固定。
インターバルタイムも40msで安定しているのでまずまずの性能です。最後にまとめますが遅延の実測値は64msです。
一箇所マイクロフィードバック制御が働いています(オレンジ部)が、マイクロフィードバック制御はどのオーディオデバイスでも必ず発生するので問題ありません。
3.3.キャプチャカードGV-USB2とオンボードLineアウト
0:03:58.300s(30ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11425086, 48005, 20:########## 0:03:58.360s(60ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11427963, 48006, 10:########## 0:03:58.420s(60ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11430844, 48006, 0:########## 0:03:58.450s(30ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11432284, 48007, 20:########## 0:03:58.509s(59ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11435117, 48008, 11:########## 0:03:58.570s(61ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11438044, 48008, 0:########## 0:03:58.600s(30ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11439484, 48009, 19:########## 0:03:58.659s(59ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11442318, 48010, 10:########## 0:03:58.720s(61ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11445242, 47999, 0:########## 0:03:58.750s(30ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11446684, 48001, 20:########## 0:03:58.809s(59ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11449518, 48002, 11:########## 0:03:58.870s(61ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11452442, 48002, 0:########## 0:03:58.900s(30ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11453885, 48003, 20:########## 0:03:58.960s(60ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11456762, 48004, 10:########## 0:03:59.020s(60ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11459644, 48004, 0:########## 0:03:59.050s(30ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11461084, 48005, 20:########## 0:03:59.109s(59ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11463961, 48006, 10:########## 0:03:59.169s(60ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11466844, 48006, 0:########## 0:03:59.199s(30ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11468284, 48007, 19:########## 0:03:59.259s(60ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11471160, 48008, 10:########## 0:03:59.319s(60ms):Smp( recv=2400, write=2400(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=11474045, 47999, 0:########## |
アロケータサイズは50msで固定。
インターバルタイムが30msから60msでばらつくため性能は悪いと言えます。
アロケータサイズが大きめなことと、インターバルタイムがばらつく分、遅延の実測値も悪く101msです。
3.4.ビデオキャプチャカードSD-USB2CUP4 とオンボードLineアウト
0:02:00.536s(32ms):Smp( recv=1536, write=1537(100%+1), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=05714798, 48000, 0:########## 0:02:00.568s(32ms):Smp( recv=1536, write=1537(100%+1), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=05716334, 48000, 0:########## 0:02:00.600s(32ms):Smp( recv=1536, write=1537(100%+1), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=05717869, 48000, 0:########## 0:02:00.632s(32ms):Smp( recv=1536, write=1536(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=05719404, 48000, 0:########## 0:02:00.664s(32ms):Smp( recv=1536, write=1536(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=05720940, 48000, 0:########## 0:02:00.696s(32ms):Smp( recv=1536, write=1536(100%+0), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=05722476, 48000, 0:########## 0:02:00.728s(32ms):Smp( recv=1536, write=1536(100%+0), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=05724012, 48000, 0:########## 0:02:00.760s(32ms):Smp( recv=1535, write=1536(100%+1), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=05725550, 48000, 0:########## 0:02:00.792s(32ms):Smp( recv=1535, write=1535(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=05727084, 48000, 0:########## 0:02:00.824s(32ms):Smp( recv=1536, write=1536(100%+0), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=05728620, 48000, 0:########## 0:02:00.856s(32ms):Smp( recv=1536, write=1536(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=05730157, 48000, 0:########## 0:02:00.888s(32ms):Smp( recv=1536, write=1536(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=05731693, 48000, 0:########## 0:02:00.920s(32ms):Smp( recv=1536, write=1536(100%+0), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=05733229, 48000, 0:########## 0:02:00.952s(32ms):Smp( recv=1536, write=1536(100%+0), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=05734764, 48000, 0:########## 0:02:00.984s(32ms):Smp( recv=1536, write=1537(100%+1), 48000Hz), Latency= 9(10)ms, FALSE= 0, Pos=05736302, 48000, 0:########## 0:02:01.016s(32ms):Smp( recv=1536, write=1536(100%+0), 48000Hz), Latency=10(10)ms, FALSE= 0, Pos=05737837, 48000, 0:########## |
アロケータサイズは約32msで固定。
良く見ると受け取るサンプル数(recv)が1536の場合と1535の場合があります。恐らく端数の帳尻を合わせるためと思われますが、これは問題ありません。
インターバルタイムも安定していて、アロケータサイズも小さ目なため遅延の実測値は58msと良好です。
ただ、何で32msなんだろうという疑問はあります。33msなら映像とあわせる為かなと思いますが、小さくできるならもっと小さくてもいいのに・・・
4.まとめ
前回のテストでオンボードのアロケータサイズを20ms以下にしても頭打ちされたと書きましたが、 アマレコ・オーディオ・レンダラーの設定の最小バッファサイズ(iMinimumBuffSizeMS)が20msなので、その部分で頭打ちされていました。
iMinimumBuffSizeMSを0とすることで20ms以下のアロケータサイズのテストができますのでその部分を再テストしました。 その結果も合わせて最後にデータをまとめて記します。
録音デバイス | 設定 | 遅延 実測値 | 補足 | |
アロケータ サイズ | iLatency | |||
Lineイン | 40ms | 40ms | 104ms | |
Lineイン | 40ms | 30ms | 94ms | 初期値 |
Lineイン | 40ms | 20ms | 84ms | |
Lineイン | 40ms | 10ms | 74ms | |
Lineイン | 30ms | 40ms | 88ms | |
Lineイン | 20ms | 40ms | 78ms | |
Lineイン | 10ms | 40ms | 68ms | iMinimumBuffSizeMS=0 |
Lineイン | 20ms | 20ms | 58ms | このあたりが妥当 |
Lineイン | 10ms | 10ms | 44ms | iMinimumBuffSizeMS=0 |
SC-500N1/DVI | 40ms | 10ms | 64ms | アロケータサイズは40msで固定 |
GV-USB2 | 50ms | 10ms | 101ms | アロケータサイズは50msで固定 |
SD-USB2CUP4 | 32ms | 10ms | 58ms | アロケータサイズは32msで固定 |
※ 遅延の実測値には±5ms程度の誤差があります。
オンボードLineインのアロケータ40ms、iLatency10msとキャプチャカードのSC500を比べるとアロケータサイズ、Latencyが同じなので遅延の実測値も近くなるはずですが、10msオンボードのほうが遅れています。これはデバックログのところでお話した録音デバイスのインターバルタイムが不安定なためです。同様にLineインのほかの実測値も10ms余計に多くなっているものと推測できます。もし、インターバルタイムが安定していたらアロケータ10ms、iLatency10msで実測遅延34msとなるのかもしれません。
一方ビデオキャプチャカードの方はアロケータサイズの変更ができないためこれ以上遅延を減らすことができません。もう一歩踏み込んでアロケータサイズの変更に対応してもらえると良いなと思います。
アマレコTV・アマミキ!用 オーディオレンダラーフィルタ Ver2.30a ベータ版
アマレコTVやアマミキ!のプレビュー音の遅延やプチプチノイズを軽減します。
■使い方
アマレコTV Ver2.20cのAmAudioRenderer.axファイルを差し替えてください。
※ 現在はベータ版です多少の問題は自力で対処できる方のみご利用下さい。
Ver2.30a ダウンロード
■更新内容
Ver2.30
(1) 可変再生速度の精度が向上しました。
・処理単位が約20msから約1msになりました。
・1msより小さいマイクロフィードバック制御を追加しました。
・動作タイミングが不安定な(一定のリズムでデータを送ってきてくれない)録音デバイスに対応しました。
(2) 反応速度(Latency)を設定できるようになりました。
(3) Bluetooth上のオーディオデバイスなど利用中にオーディオデバイスが無効になるケースに対応しました。
(4) IOレベルの異常など、明らかに再生レートが合わない状態が続いた場合は再生デバイスをリセットするようにしました。
Ver2.30a
(1) Bluetooth等のオーディオデバイスが利用できなくなった際に、エラーメッセージ「waveOutWrite : MMSYSERR_NODRIVER」が表示されるようになっていたのを修正。
■設定方法
AmAudioRenderer.axを差し替えた後一度アマレコTVまたはアマミキ!を実行してプレビュー(音を出す)するとAmaAudioRenderer.ini という設定ファイルが作成されます。アマレコTVまたはアマミキ!を終了してから設定ファイルをメモ帳で開いて内容を編集してください。
項目名 | 初期値 | 設定範囲 | 内容 |
pcDeviceName | - | - | 音を再生するデバイス名です。 変更する必要はありません。 |
iMinimumBuffSizeMS | 20 | 20 | アロケーターサイズが非常に小さいと困るのでこの値より小さくならないようにします。 変更する必要はありません。 |
iBuffNum | 10 | 10 | 再生バッファの個数を設定します。 多いほどドロップしにくくなりますが、通常変更する必要はありません。 |
iLatency | 30 | 10-100 | 目標反応速度を1000分の1秒単位で設定します。 値を小さくするほど遅延が減り、大きくするほどプチプチしにくくなります。 |
iLatencyBandWidth | 5 | 5-20 | 反応速度の許容範囲を1000分の1秒単位で設定します。 値を小さくすると敏感に制御されます。大きくすると鈍感(余り補正されない、補正されるときは大きく補正されるので目立ちます)になります。 |
iDebugLog | 0 | 0-1 | 1にするとデバック用のログファイルを作成します。 反応速度の様子や補正がどのように行われたか確認できます。 |
iLatencyの値を変更して遅延を減らしたりプチプチ(ノイズ)を軽減するように調整してください。
iLatencyを小さくするほど遅延は減りますが、利用する再生オーディオデバイスにより限界値(それ以上iLatencyを下げても遅延は減らない)が ありますので余り下げすぎないようにしましょう。設定例を後に書きますので参考にして下さい。
逆にiLatencyを大きくするとノイズを軽減できます。ノイズがするな~と思ったらちょっとずつ(10程度ずつ)iLatencyをあげてみてください。
基本的にはスピーカーやヘッドホンで音を聴きながら耳を頼りに調整して下さい。
アマレコTVやアマミキ!の高度な設定にあるアロケーターサイズも影響しますのでアロケータサイズを40ms(初期値)にしてからiLatencyの調整をして下さい。
■設定例と遅延の実測結果
Windows7のPCのオンボードオーディオデバイスを使って、アロケータサイズとiLatencyの設定内容によりLine入力 - Line出力間の遅延がどうなるかテストしました。
テストはステレオ(左右同音)の片チャンネルだけPC2のLine入力に接続し、PC2のLine出力端子の様子と、PC2を通さなかったもう一方のチャンネルの波形を記録します。PC2を通さなかった方を基準にしPC2を通したチャネルがどれだけ遅れたかを観察します。
遅延の実測値には以下の処理遅延が含まれます。
・録音デバイスの処理遅延(基本的にはアロケータサイズ相当)
・アマミキ!、AmAudioRendererの処理遅延(基本的には0)
・再生デバイスの処理遅延(基本的にはiLatency相当)
・OSの処理遅延、カーネルミキサー、リサンプラーなど(不明、20ms程度?)
なおテストするたびに5ms程度のばらつきが生じますので、結果(遅延実測値)には±5ms程度の誤差があるとこをご了承ください。
OS | Windows7 x64 Professional SP1 | |
CPU | Intel(R) Core(TM) i5-3470S CPU @ 2.90GHz Ivy Bridge | |
MB | ASRock H77 Pro4-M (Intel H77) | |
Memory | DDR3 1600 8GB(4GBx2 Dual Cannel)read=23.7GB/s write=12.2GB/s | |
Software | アマミキ! Ver1.01 AmAudioRenderer Ver2.30, AmAudioRenderer Ver1.15 | |
Audio Device | オンボードのLine入力、Line出力 Realtek High Definition Audio | Driver:6.0.1.6482 |
最初にアロケータサイズを40msに固定し徐々にiLatencyを下げていった場合。
次にiLatencyを40msに固定しアロケータサイズを下げていった場合。
最後に両方下げた場合となっています。
設定 | 遅延 実測値 | 補足 | |
アロケータ サイズ | iLatency | ||
40ms | 40ms | 104ms | |
40ms | 30ms | 94ms | 初期値 |
40ms | 20ms | 84ms | |
40ms | 10ms | 74ms | |
30ms | 40ms | 88ms | |
20ms | 40ms | 78ms | |
10ms | 40ms | 78ms | 頭打ちされている |
20ms | 20ms | 58ms | このあたりが妥当 |
10ms | 10ms | 54ms | 頭打ちされている |
※ 遅延の実測値には±5ms程度の誤差があります。
設定 | 遅延 実測値 | 補足 | |
アロケータ サイズ | iLatency | ||
16ms | - | 63ms | これ以上アロケータサイズを下げるとプチプチします。 |
※ 遅延の実測値には±5ms程度の誤差があります。
設定 | 遅延 実測値 | 補足 | |
アロケータ サイズ | iLatency | ||
- | - | 98ms | OSのライン入力のプロパティから「このデバイスを聴く」オプションをON |
※ 遅延の実測値には±5ms程度の誤差があります。
■注意事項
録音デバイスがビデオキャプチャカードの場合、製品の殆どがアロケータサイズの変更に対応していません。
例えばマイコンソフトのSC-500N1/DVIの場合、現状アロケータサイズは40msで固定です。
キャプチャカードによる遅延は映像より音声の方が大きい
1.音声遅延要素
1) ビデオキャプチャカードによるキャプチャ処理(録音)
2) キャプチャソフトによる処理
3) 再生デバイス(サウンドカード)による処理(再生)
1について、例えばIntensity Proでは33ms分の音声データをひと塊として(アマレコTVへ)送ってくるので最低でも33msの遅延が生じます。またSC500の場合は40ms単位なので最低40msの遅延が生じます。
なお、ビデオキャプチャカードの中には500ms単位でデータを送ってくるものがあります。Direct Showの(アロケータの)初期値は500msとなっているのでDirect Showのコンセプトとして500msで動作するビデオキャプチャカードは妥当と言えますが、ゲームなどインタラクティブなシーンでは使い物になりません。
2は遅延0とみなして良いかと思います。再生オーディオデバイスの再生バッファへデータをコピーするだけです。
最後に3ですが、アマレコTVが再生バッファにデータを書き込み、再生命令を発行すると、OS、オーディオドライバ、サウンドカードによりラインアウト等から音声信号が出力されます。
このとき再生サンプリングレートと異なる音はリサンプリングされたり、複数のアプリケーションの音がミキシングされます。
また、プチプチとしたノイズを防ぐために少し多めに再生バッファへデータを蓄える必要があり、その分の遅延が生じます。どの程度バッファリングすれば良いか(ノイズを防げるか)は環境によりマチマチです。アマレコTVでは高度な設定にあるアロケータサイズで調整します。
2.テスト方法

PC1のラインアウトのL(左)・R(右)のうち一方をビデオキャプチャカード→アマレコTV→サウンドカード1と通し最終的にサウンドカード2へ、もう一方はサウンドカード2へ直接接続した状態でサウンドカード2のライン入力を観察します。
OS | WindowsXP Professional SP3Windows7 |
MB | M3N78-EM |
CPU | AMD Phenom(tm) 8750 Triple-Core Processor 2.4GHz |
MEMORY | DDR2-800 2GB(2GB*1) |
HDD | WD10EADS-00M2B0 1TB, 5400rpm |
サウンドカード1 | CMI8738-6CHLP2 |
サウンドカード2 | M3N78-EM Realtek HD Audio Input |
キャプチャカード | SC-500N1/DVI Driver 1.1.0.108.0 |
アマレコTV | Ver2.20b アロケーターサイズ 40ms |
3.結果

PC1の出力を直接つないだ場合(グラフ上側)と比べ、キャプチャカード→アマレコTV→サウンドカード2と経由したもの(グラフ下側)は約102ms遅延しました。
設定(アロケータサイズ)や環境(OS、サウンドカード)によりますがアマレコTV初期値の場合なら50ms~100ms程度の遅延となります。
4.まとめ
映像の遅延はオーバーレイやEVRによる表示にて2~3フレーム(33,33ms~50.00ms)でしたが、音声の遅延は50ms~100ms程度となり、音声は映像より大きく遅延することになります。
ビデオキャプチャカードを使ってPC画面でゲームをプレイしようとしたとき映像の遅延に付いて良く訊かれますが、実際は映像より音の遅延の方が深刻で音ゲーや格ゲーで音に頼ってプレイするのが難しいのはこのためではないでしょうか。逆に音に頼らないスタイルであれば映像の遅延と言うのは世間一般で言われているほど大きくはないので満足にプレイできるケースが多いと思います。
同じキャプチャカード(同じジャンルのゲーム)でも問題なくプレイできる(遅延は感じない)という人と、まともにプレイできないと主張する人に分かれるのは、その人の感覚次第でもありますが音に頼っているかどうかもポイントのように思います。
余談になりますが、アマレコTVと他のビデオキャプチャソフトの大きな違いとして、“累積遅延”と“映像と音声の同期”の2つがあります。累積遅延は30分とか1時間使っているとだんだんと音声がずれてきたり、遅延が大きくなる現象です。アマレコTVでは遅れた分を取り戻す仕組みとして“可変再生速度”と言う機能が働くので累積遅延は一定以上生じません。また、映像と音声の同期については遅れている方に合わせて再生するのが一般的となっています。例えば映像が50msの遅延、音声は100msの遅延であるなら映像もわざと100ms遅延させて映像と音声を同じタイミングで再生します。しかし、アマレコTVでは同期を取らないため、映像は50ms、音声は100msとずれたまま再生するようになっています。ビデオキャプチャカード付属のソフトからアマレコTVに替えると遅延が減るのはこのあたりが関係しています。
5.音声遅延の回避策
最後に音声の再生遅延をゼロにする方法を紹介します。
ビデオキャプチャカードの音声入力を使わずサウンドカードのライン入力を使う事で、ライン入力とライン出力の間を直接接続できるので遅延0で音声を聴くことができます(サウンドカードやOSによりできない場合があるかもしれません)。
1) ゲーム機のライン出力とサウンドカードのライン入力を接続します。ビデオキャプチャカードにはS端子など映像系のみ接続します。
2) サウンドカードの録音プロパティでライン入力のミュートを解除します。この時点でゲーム機の音が再生されます。
3) アマレコTVのオーディオキャプチャデバイスでサウンドカードのライン入力を指定します。
4) アマレコTVのプレビューを開始するとゲーム音が二重に聞こえるのでアマレコTVのツールバーでミュートします。
可変再生速度とミキサー
アマレコTV(アマミキ!)ではミキサー処理、及び、ライブ機能の通信処理にも可変再生速度を採用し、例えばミキサーの場合、異なるオーディオデバイスで録音した音声に僅かなギャップが生じたとき、従来は余ったデータを捨てたり、足りない部分を無音で補ったりしていました。現在はこの部分を可変再生速度で調整するため、ミキシング時の遅延やノイズも軽減されています。
また、遅延が少なくなると複数の音声間で同期が取りやすくなると言う副産物がありますので、もしかしたら”歌ってみた”等へも適正を発揮するかもしれません。
■「歌ってみた」でなるべく同期を取るには
(1) ズレが大きくなる条件
PC内でカラオケを再生してステレオミックスやAmaRec Core Audio Captureで録音した音とUSBマイクの音ではズレが大きくなる。
(2) ズレが小さくなる条件
PC外でカラオケを再生してLine入力を使い録音した音とUSBマイクの音ではズレが小さくなる。
(そもそもLine入力とサウンドカードのマイク入力を使って、ステレオミックスで録音すればズレない気がします)
なので、PC内でカラオケを再生する場合は、Lineアウトに接続したケーブルをアンプか何かで分配した後、Line入力に戻してやり、Line入力とUSBマイクの音を録音すれば同期が取れると思います。
■可変再生速度の適用例
(1) 録音デバイスと再生デバイスが異なり、その間でギャップが生じるケース(例:オーディオレンダラー)
(2) 複数の録音デバイスの音をミキシングする場合にギャップが生じるケース(例:オーディオミキサー)
(3) 通信時に転送元と転送先が異なるタイミングで動作するケース(例:ライブ機能、リモートソフト)