FC2ブログ
 

フレームレートの扱いについて(ffmpeg、DirectShow、ビデオキャプチャ)

画質厨の配信設定研究」のこの記事を見ながらアマレコTVとffmpegを連携させた使い方を試していますがその中のフレームレートについてのお話しです。

アマレコTVのライブ機能をffmpegを使うとフレームレートが「29.97」と表示される場合と「29.9701」と表示されることがあり「おや?」と思う場面が出てきます。
結論から言うと先のサイトに書かれている通りどちらも正解(正常)で小数点以下の扱い(非常に細かい単位)を切り捨てるか、繰り上げるかの違いです。


詳しく説明すると、フレームレートは各ソフトウエアの内部で29.97のような値ではなく、

 REFERENCE_TIME AvgTimePerFrame; // Average time per frame (100ns units)

と言うデータで管理されています(Direct Showの仕様です)。
AvgTimePerFrameは100ナノ秒(10,000,000分の1秒)単位で1フレームあたりの(平均)持続時間を管理します。
29.97fpsの場合のAvgTimePerFrameは333666または333667という値になりますが、この値(333666や333667)をそのまま表示したのでは解りにくいので、1秒間に何フレーム扱うかというfpsの形に各々のソフトウエアが計算し29.97のように表示しています。

10,000,000ns(1秒)をAvgTimePerFrameで割るとfpsになるので、それぞれ計算すると

 AvgTimePerFrame=333666の場合:fps = 10,000,000 ÷ 333666 = 29.970089・・・
 AvgTimePerFrame=333667の場合:fps = 10,000,000 ÷ 333667 = 29.970000・・・

となります。
大抵のソフトウエアはfpsの小数点以下2位または3位までしか表示しないため両者の違いが表面化することはありませんが、ffmpegは小数点以下4位まで表示(小数点以下5位を四捨五入)するため「29.9701」と「29.97」といった違いが表面化します。
しかし、その違いは一千万秒に対し1秒の誤差(115日間ぶっ続けで配信して1秒ズレる)なので通常問題になることはないでしょう。
その違いは一千万フレームに対し1秒の差(29.97fpsの場合なら92時間ぶっ続けで配信して1秒差が出る)なので通常問題になることはないでしょう。

そしてAvgTimePerFrameを決めるのは基本的にキャプチャカードです。
大抵のキャプチャカードはAvgTimePerFrame=333667なので表示上は29.97となることが多いと思います。
(現在手元にあるGV-USB2、SD-USB2CUP4、SC512、IntensityProはAvgTimePerFrame=333667)

もう一つのケースとして59.94fps(AvgTimePerFrame=166833)でキャプチャしたものをアマレコTVのライブ機能で29.97fpsにしている場合は計算精度の関係でAvgTimePerFrame=333666となります。この場合、表示は29.9701となってしまいます。

フレームレートをこちらswk's log - NTSC のフレームレートはなぜ 29.97fps なのか 」を参考に計算すると

 fps = 4.5MHz ÷ 286 ÷ 525 = 29.9700299700299700299700299700・・・

となるので、
29.97fpsにおけるAvgTimePerFrameのより正確な値は

 AvgTimePerFrame=333666.6666666666666666666666666・・・

と小数点以下に6が沢山続きます。なので333666(29.9701)よりは333667(29.97)の方が誤差が少ないと言えます。


■まとめ
・「29.9701」と「29.97」はどちらも正常。
・どちらになるかは使っているキャプチャカードのAvgTimePerFrameにより決まる。
・多くのキャプチャカードで「29.97」となる。
・59.94fpsでキャプチャしたものをライブ機能で29.97fpsにしている場合は「29.9701」となる。
・どちらかというと「29.97」の方がビデオ信号の規格との誤差が少ない


■ffmpegの"-r"オプションについて
アマレコTV Live Ver2.30からffmpegの"-r"オプションでライブ機能のフレームレートを指定できるようになりましたが、特に問題がない場合はffmpeg側からフレームレートを指定しない方が望ましいです。

-rオプションでフレームレートを指定するとキャプチャカードのフレームレートとは違うレートでffmpegが動作するため
キャプチャカードとffmpegの間でギャップが生じやすくなります。ギャップが生じるとアマレコTVのライブ機能により
意図的にフレームをドロップさせたり、同じフレームを水増しすることで調整されます(カクカクになる可能性が高まる)。

-rオプションを指定しない場合はキャプチャカードのフレームレートに合わせてffmpegが動作しますのでギャップが生じにくくなります。


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

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

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



ホームページ
カテゴリ
最新コメント
カレンダー
12 | 2013/01 | 02
- - 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 ビデオキャプチャ AMVコーデック アマレココ アマミキ! コーデック SC500 アマレコVR 動画配信 Oculus ファンタジーリモート Quest アマレコライト gQuest GO 4K プラグイン AMV4 G2 Pico ライブ機能 SC512 Unity AVX2 デスクトップキャプチャ oculus 質問コーナー リモートソフト FAQ HDキャプチャ DirectShow ニコニコ動画 LEGO 可変再生速度 組み換え レゴ 遅延 解説動画 GV-USB2 XL2420T AMV2MT PS4 アマステ 液晶モニター 120Hz 倍速液晶 デインターレース Pro Intensity MonsterX3A ベンチマーク VideoKeeper2 WindowsMR UtVideo 32ZP2 31006 Alternate RDT233WX-Z ffmpeg SD-USB2CAP4 RYZEN Play XCAPTURE-1 Shadow RGBキャプチャ designs AVX Rift GV-USB 31024 2 T2 シンクライアント MR Livetube AtomでHDキャプチャ IntensityPro イベント Filter キャプチャーツール Preferred 擬似NTSCキャプチャ LAVFilters SteamVR Tweaker フレーム間圧縮 VRコントローラー プレビュー DirectShowFilter VR動画 DC-HD1 SD-USB2CUP4 REGZA ハイパースレッディングテクノロジー HT 31021 MPC インストール QSV NVEnc OBS フィギュア 音ズレ SSE SKnet GV-USB3 Kabelake XCapture-1 録画 オーバーレイ HDMI HDCP 額縁遅延 キャプチャカード ZP3 32ZP32 液晶テレビ モノステ GPU使用率 倍速駆動 倍速補完処理 ゲームスムーズモード 可逆圧縮 Haswell 電源オプション MP3 LameACM MonsterXU3.0R 音遅延 リプレイ機能 

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