fc2ブログ
 

アマレコTV Ver3.00a 不具合修正版と再生音の話

 録画停止処理に不具合が見つかったのでその修正版です。

■アマレコTV Ver3.00a
【更新内容】
(1) タイマー録画時に時間になっても録画が停止しない。再生できないビデオファイルが出来上がるのを修正。
(2) HDDの残り容量が少なくなっても録画が停止しない。再生できないビデオファイルが出来上がるのを修正。
(3) ステータスバーに表示するHDDの空き容量の小数点以下が表示されないのを修正。
(4) ステータスモニターに録音デバイスの実際のアロケーターサイズの表示を追加。


ダウンロード
(Ver3.00に対する差分のみです、Ver3.00に上書きして使ってください。)


■アマレコTV、アマミキ!の再生音について
 アマレコTVとアマミキ!では再生音が遅延しないように極めて少ない再生バッファで音を再生するようになっています。そのため、一般的なアプリケーションより再生音がプチプチしたり、ゆがんだりと不安定になる場合があります。

 以前のバージョンでは遅延が増えてきたときに急激な補正をかけて短い時間で遅延から回復するように制御(もしくはデータを捨てる)していましたが、それだと、”音がゆがむ”(データを捨てる場合はプチプチする)のが目立つため、Ver3.00では急激な補正を辞め、長い時間をかけて少しずつ遅延から回復するように変えました。そのため、音のゆがみはほぼ知覚できないと思います。その代わり、遅延から復帰するのに数十秒かかる感じです(以前は数秒で遅延から回復)。

■反応時間と補正状況の表示
アマレコTVの場合はステータスモニター画面で確認できます。
913amarectv_monitor.png


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



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


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




 Lが反応時間、カッコ内は目標反応時間の設定値でそれぞれの単位はミリ秒です。反応時間は再生デバイスのバッファに溜まっているデータ量を示していて、40なら1000分の40秒ぶんの音データが再生デバイスのバッファに溜まっていることを表します。これは、向こう40ミリ秒は安定した再生ができるけど、40ミリ秒以内に次のデータをバッファにセットできないと音が途切れる(プチプチする)ことを意味しています。

 MFはマイクロフィードバックの略で、補正状況を表しています。0なら現在補正を行っていません。
マイナスの場合は遅延が許容量を超えたため再生速度をほんのわずかに速めて遅延を減らします(Lが少しづつ減るように制御)。
プラスの場合はバッファの溜まりが少なく音が途切れる可能性があるため、ほんのわずかに再生速度を遅くします(Lがすこしづつ増えるように制御)。
これらにより、反応時間が目標値に近づくように制御します。


■反応時間の設定
 アマレコTVの高度な設定にある「再生プロパティ」。アマミキ!の場合は、再生デバイスにある「レンダラープロパティ」を押すとオーディオレンダラーの設定画面が表示されます。
なお、ライブ機能がインストールされていないとこの設定画面は表示されないので先にライブ機能をインストールして下さい。

915audio_rend_prop.png



「目標反応時間」と「反応時間許容範囲」の2つをスライダーを動かして設定します。
初期値は目標反応時間40ms、反応時間許容範囲10msとなっています。

■設定例
目標反応時間:40ms
反応時間許容範囲:10ms
の場合は次のように動作します。
反応時間が30msから50msの間(許容範囲内=目標値の±10ms)にある場合はマイクロフィードバック制御をおこないません。
反応時間が30ms未満、または、50msを超える(間許容範囲を外れる)場合は反応時間が40ms(目標値)になるようにマイクロフィードバック制御を行います。


■実際の音遅延は?
今回は再生デバイスにおける遅延なので、実際はこれに録音デバイスの遅延とプラスαが加わります。録音デバイスの遅延は一概には言えませんが大抵アロケータサイズで決まります、また、プラスαは大体20ms位なので、
アロケーターサイズ:40ms
目標反応時間:40ms
プラスα:20ms
の場合、音の遅延は約100msとなります。
ちなみに、HDMIなどを使ってテレビやPCモニターのスピーカーから音を出すとテレビ、モニターによる遅延がさらに加わります。

実際の音遅延に関しては過去の記事を見てください。
アマレコTV・アマミキ!用 オーディオレンダラーフィルタ Ver2.30a ベータ版
アマレコ・オーディオ・レンダラー デバックログとビデオキャプチャ編


フィードバック制御の仕方が変更になっていますが、目標反応時間が同じなら実際の遅延も同じ結果となります。




アマレコ・オーディオ・レンダラー デバックログとビデオキャプチャ編

アマレコ・オーディオ・レンダラーやPCのオーディオデバイスに付いてもう少し詳しくお話します。
またビデオキャプチャカードに搭載されているオーディオデバイスについてもふれます。

アマレコ・オーディオ・レンダラーのデバックログを見ると録音デバイス、再生デバイスの挙動がある程度見えてきます。主に次のことがわかります。
・録音デバイスが何ミリ秒単位で録音処理しているか(実際のアロケータサイズ)
・録音デバイスが何ミリ秒間隔でデータを送ってくるか(インターバルタイム)
・再生デバイスの実再生レート(再生サンプリングレート)
・そのとき再生デバイスにバッファリングされているデータ量(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ミリ秒間隔でデータを受け取っています。
SmpSmp( recv=1920, write=1901( 99%+0), 48000Hz)recvは録音デバイスから受け取ったデータのサンプル数(=アロケータサイズ)。例では1920サンプル(約40ミリ秒分の音声)のデータを受け取りました。
writeは再生デバイスの再生バッファへ書き出したデータのサンプル数。例では1901サンプル(約39.6ミリ秒分の音声)のデータを書き出しています。

カッコ内は可変再生速度による補正がどのように行われたかを記録しています。
100%なら補正を行っていません。99%なら1%再生時間が短くなるよう補正しています。
101%なら1%再生時間が長くなるよう補正しています。
パーセントの後の+0はさらに細かい制御(マイクロフィードバック制御)情報です。+1か-1になることがあります。
それぞれ1サンプル分再生時間を長く(短く)なるよう補正したことを表します。
最後に再生デバイスの再生レート(サンプリングレート)の実測値を10秒間の平均値で記録しています。

LatencyLatency=29(20)msその時点での反応時間です。再生バッファに溜まっているデータ量を1ミリ秒単位で記録しています。
カッコ内は設定値の目標反応時間です。この値に近づくよう可変再生速度が働きます。
例では目標が20ミリ秒に対し現在の反応速度が29ミリ秒と遅れているため、再生時間を短くし、反応時間が20ミリ秒に近づくよう可変再生速度による補正が行われています。
FALSEFALSE= 0可変再生速度により補正が行われた回数をカウントしています。
必ず必要な補正(プレビューの開始直後や途中で設定値が変更された場合)はカウントされません。
また、マイクロフィードバック制御の場合もカウントしません。
例では補正が行われていますが、直前に目標反応時間が30から20に変更された事による補正のためカウントされていません。
PosPos=07981185,48040,0再生デバイスのその時点での再生位置です。余り重要ではありません。
48040,0はLatencyの値を計算するのに使う補正値です。余り重要ではありません。
最後の##########補正の様子を#の個数で表示します。100%の時#を10個表示します。99%の時は9個と1%ごとに#が減ります。

 
3.デバックログの例

テスト環境
OSWindows7 x64 Professional SP1
CPUIntel(R) Core(TM) i5-3470S CPU @ 2.90GHz Ivy Bridge
MBASRock H77 Pro4-M (Intel H77)
MemoryDDR3 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 CardGV-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を通したチャネルがどれだけ遅れたかを観察します。

音遅延テスト図.PNG 




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以下のアロケータサイズのテストができますのでその部分を再テストしました。 その結果も合わせて最後にデータをまとめて記します。


AmAudioRenderer Ver2.30 遅延テスト
録音デバイス設定遅延
実測値
補足
アロケータ
サイズ
iLatency
Lineイン40ms40ms104ms 
Lineイン40ms30ms 94ms初期値
Lineイン40ms20ms84ms 
Lineイン40ms10ms74ms 
     
Lineイン30ms40ms88ms 
Lineイン20ms40ms78ms 
Lineイン10ms40ms78ms頭打ちされている
Lineイン 10ms40ms 68ms iMinimumBuffSizeMS=0 
     
Lineイン20ms20ms58msこのあたりが妥当
Lineイン10ms10ms54ms頭打ちされている 
Lineイン10ms10ms44msiMinimumBuffSizeMS=0
     
SC-500N1/DVI40ms10ms64msアロケータサイズは40msで固定
GV-USB250ms10ms101msアロケータサイズは50msで固定
SD-USB2CUP432ms10ms58msアロケータサイズは32msで固定

※ 遅延の実測値には±5ms程度の誤差があります。



オンボードLineインのアロケータ40ms、iLatency10msとキャプチャカードのSC500を比べるとアロケータサイズ、Latencyが同じなので遅延の実測値も近くなるはずですが、10msオンボードのほうが遅れています。これはデバックログのところでお話した録音デバイスのインターバルタイムが不安定なためです。同様にLineインのほかの実測値も10ms余計に多くなっているものと推測できます。もし、インターバルタイムが安定していたらアロケータ10ms、iLatency10msで実測遅延34msとなるのかもしれません。

一方ビデオキャプチャカードの方はアロケータサイズの変更ができないためこれ以上遅延を減らすことができません。もう一歩踏み込んでアロケータサイズの変更に対応してもらえると良いなと思います。



アマレコTV・アマミキ!用 オーディオレンダラーフィルタ Ver2.30a ベータ版

アマレコTV Ver2.20cとアマミキ! Ver1.01用のオーディオレンダラーフィルターです。
アマレコTVやアマミキ!のプレビュー音の遅延やプチプチノイズを軽減します。

■使い方
アマレコTV Ver2.20cのAmAudioRenderer.axファイルを差し替えてください。
※ 現在はベータ版です多少の問題は自力で対処できる方のみご利用下さい。

Ver2.30 ダウンロード
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--音を再生するデバイス名です。
変更する必要はありません。
iMinimumBuffSizeMS2020アロケーターサイズが非常に小さいと困るのでこの値より小さくならないようにします。
変更する必要はありません。
iBuffNum1010再生バッファの個数を設定します。
多いほどドロップしにくくなりますが、通常変更する必要はありません。
iLatency3010-100目標反応速度を1000分の1秒単位で設定します。
値を小さくするほど遅延が減り、大きくするほどプチプチしにくくなります。
iLatencyBandWidth55-20反応速度の許容範囲を1000分の1秒単位で設定します。
値を小さくすると敏感に制御されます。大きくすると鈍感(余り補正されない、補正されるときは大きく補正されるので目立ちます)になります。
iDebugLog00-11にするとデバック用のログファイルを作成します。
反応速度の様子や補正がどのように行われたか確認できます。


iLatencyの値を変更して遅延を減らしたりプチプチ(ノイズ)を軽減するように調整してください。
iLatencyを小さくするほど遅延は減りますが、利用する再生オーディオデバイスにより限界値(それ以上iLatencyを下げても遅延は減らない)が ありますので余り下げすぎないようにしましょう。設定例を後に書きますので参考にして下さい。
逆にiLatencyを大きくするとノイズを軽減できます。ノイズがするな~と思ったらちょっとずつ(10程度ずつ)iLatencyをあげてみてください。
基本的にはスピーカーやヘッドホンで音を聴きながら耳を頼りに調整して下さい。
アマレコTVやアマミキ!の高度な設定にあるアロケーターサイズも影響しますのでアロケータサイズを40ms(初期値)にしてからiLatencyの調整をして下さい。


■設定例と遅延の実測結果
Windows7のPCのオンボードオーディオデバイスを使って、アロケータサイズとiLatencyの設定内容によりLine入力 - Line出力間の遅延がどうなるかテストしました。

テストはステレオ(左右同音)の片チャンネルだけPC2のLine入力に接続し、PC2のLine出力端子の様子と、PC2を通さなかったもう一方のチャンネルの波形を記録します。PC2を通さなかった方を基準にしPC2を通したチャネルがどれだけ遅れたかを観察します。
音遅延テスト図.PNG


遅延の実測値には以下の処理遅延が含まれます。
・録音デバイスの処理遅延(基本的にはアロケータサイズ相当)
・アマミキ!、AmAudioRendererの処理遅延(基本的には0)
・再生デバイスの処理遅延(基本的にはiLatency相当)
・OSの処理遅延、カーネルミキサー、リサンプラーなど(不明、20ms程度?)


なおテストするたびに5ms程度のばらつきが生じますので、結果(遅延実測値)には±5ms程度の誤差があるとこをご了承ください。


テスト環境
OSWindows7 x64 Professional SP1
CPUIntel(R) Core(TM) i5-3470S CPU @ 2.90GHz Ivy Bridge
MBASRock H77 Pro4-M (Intel H77)
MemoryDDR3 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に固定しアロケータサイズを下げていった場合。
最後に両方下げた場合となっています。

AmAudioRenderer Ver2.30
設定遅延
実測値
補足
アロケータ
サイズ
iLatency
40ms40ms104ms 
40ms30ms 94ms初期値
40ms20ms84ms 
40ms10ms74ms 
    
30ms40ms88ms 
20ms40ms78ms 
10ms40ms78ms頭打ちされている
    
20ms20ms58msこのあたりが妥当
10ms10ms54ms頭打ちされている 

※ 遅延の実測値には±5ms程度の誤差があります。


AmAudioRenderer Ver1.15
設定遅延
実測値
補足
アロケータ
サイズ
iLatency
16ms-63msこれ以上アロケータサイズを下げるとプチプチします。

※ 遅延の実測値には±5ms程度の誤差があります。



Windows7の「聴く」機能
設定遅延
実測値
補足
アロケータ
サイズ
iLatency
--98msOSのライン入力のプロパティから「このデバイスを聴く」オプションを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.テスト方法
音声遅延テスト.PNG

PC1のラインアウトのL(左)・R(右)のうち一方をビデオキャプチャカード→アマレコTV→サウンドカード1と通し最終的にサウンドカード2へ、もう一方はサウンドカード2へ直接接続した状態でサウンドカード2のライン入力を観察します。 

テスト環境 (PC2:キャプチャ側PC)
OS WindowsXP Professional SP3Windows7
MB M3N78-EM
CPUAMD Phenom(tm) 8750 Triple-Core Processor 2.4GHz
MEMORYDDR2-800 2GB(2GB*1)
HDDWD10EADS-00M2B0 1TB, 5400rpm
サウンドカード1CMI8738-6CHLP2
サウンドカード2M3N78-EM Realtek HD Audio Input
キャプチャカードSC-500N1/DVI  Driver 1.1.0.108.0
アマレコTVVer2.20b
アロケーターサイズ 40ms



3.結果
音声遅延結果.PNG

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のツールバーでミュートします。


テーマ : PC周辺機器     ジャンル : コンピュータ

可変再生速度とミキサー

アマレコ・オーディオレンダラーに採用した可変再生速度は概ね上手く機能している様ですが、可変再生速度はレンダラー(再生)だけでなく様々な処理に応用する事が出来ます。

アマレコTV(アマミキ!)ではミキサー処理、及び、ライブ機能の通信処理にも可変再生速度を採用し、例えばミキサーの場合、異なるオーディオデバイスで録音した音声に僅かなギャップが生じたとき、従来は余ったデータを捨てたり、足りない部分を無音で補ったりしていました。現在はこの部分を可変再生速度で調整するため、ミキシング時の遅延やノイズも軽減されています。
また、遅延が少なくなると複数の音声間で同期が取りやすくなると言う副産物がありますので、もしかしたら”歌ってみた”等へも適正を発揮するかもしれません。


■「歌ってみた」でなるべく同期を取るには
(1) ズレが大きくなる条件
PC内でカラオケを再生してステレオミックスやAmaRec Core Audio Captureで録音した音とUSBマイクの音ではズレが大きくなる。

(2) ズレが小さくなる条件
PC外でカラオケを再生してLine入力を使い録音した音とUSBマイクの音ではズレが小さくなる。
(そもそもLine入力とサウンドカードのマイク入力を使って、ステレオミックスで録音すればズレない気がします)

なので、PC内でカラオケを再生する場合は、Lineアウトに接続したケーブルをアンプか何かで分配した後、Line入力に戻してやり、Line入力とUSBマイクの音を録音すれば同期が取れると思います。


■可変再生速度の適用例
(1) 録音デバイスと再生デバイスが異なり、その間でギャップが生じるケース(例:オーディオレンダラー)
(2) 複数の録音デバイスの音をミキシングする場合にギャップが生じるケース(例:オーディオミキサー)
(3) 通信時に転送元と転送先が異なるタイミングで動作するケース(例:ライブ機能、リモートソフト)


 
 
あまラボへようこそ
このブログでは自作ソフトの最新情報やtips、PC動画に関する話題を掲載していきます。各記事へは下にあるカテゴリからアクセスして下さい。

ファイルのダウンロードはホームページの方でお願い致します。

質問・要望・不具合報告はこちら
アマレコTV
アマミキ!
アマレココ
アマレコ・ライト
ファンタジーリモート
AMVコーデック



ホームページ
カテゴリ
最新コメント
カレンダー
04 | 2023/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
最新記事
最新トラックバック
ブログ内タグ

アマレコTV ビデオキャプチャ アマレコVR AMVコーデック Oculus Quest アマレココ アマミキ! コーデック gQuest SC500 動画配信 Pico GO ファンタジーリモート 4K アマレコライト プラグイン G2 AMV4 oculus Unity SC512 ライブ機能 パススルー機能 デスクトップキャプチャ AVX2 Passthrough FAQ リモートソフト 質問コーナー ニコニコ動画 HDキャプチャ DirectShow 120Hz 背景透過 遅延 可変再生速度 レゴ 解説動画 Meta 組み換え VR LEGO XL2420T GV-USB2 2 アセット機能 液晶モニター 倍速液晶 デインターレース PS4 ベンチマーク アマステ AMV2MT Asset Intensity Pico4 MetaQuest Pro VRonVR MonsterX3A designs VideoKeeper2 AVX Alternate XCAPTURE-1 SD-USB2CAP4 GV-USB インストール RDT233WX-Z 32ZP2 31006 ffmpeg WindowsMR Rift 画像処理 31024 T2 60fps RGBキャプチャ UtVideo Shadow Play RYZEN 電源オプション HDCP Haswell HDMI 音遅延 QSV MonsterXU3.0R LameACM MP3 31021 フィギュア 音ズレ 録画 ゲームスムーズモード HT OBS MPC ハイパースレッディングテクノロジー NVEnc 液晶テレビ DirectShowFilter プレビュー 擬似NTSCキャプチャ SD-USB2CUP4 Livetube AtomでHDキャプチャ キャプチャーツール シンクライアント イベント IntensityPro DC-HD1 額縁遅延 REGZA ZP3 32ZP32 オーバーレイ リプレイ機能 モノステ 倍速駆動 倍速補完処理 キャプチャカード Robust Video Matting API APIパススルー機能 60Hz 検証 passthrough python pytorch ハンドジェスチャー パカラーススルー機能 AssetBundle 2.0 Tracking ファイルマネージャプラス SkyBox Hand AMPlayer 新プレイヤー機能 GPU使用率 LAVFilters Preferred 可逆圧縮 GV-USB3 Kabelake SSE SKnet Filter Tweaker Windows 90Hz 新アマレコVR MR VRコントローラー SteamVR VR動画 フレーム間圧縮 XCapture-1 

ブログ内検索
月別アーカイブ
アマレココに関するリンク
お世話になっているソフトのリンク
RSSリンクの表示
管理画面
  • 管理画面