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 ビデオキャプチャ アマレコ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リンクの表示
管理画面
  • 管理画面