フレームレートの扱いについて(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コーデック



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

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