画像のフレーム・レート
作成者の意図通りの再生をするための要素には、縦横比のほかに、フレーム・レートとビット・レートがあります。
映画のフィルムの1コマは1/24秒で、24fps と言うことのようです。旧来のテレビは、29.97fps と表記されます。
数値が大きくなって、速くなる分には、見た目は変わらないので問題がありません。
作成時より小さい値になると、どこかで表示されないコマが発生することになります。
人の視認能力もあるので、60 fps 超での再生を意図して、作品が作られることはないと思います。60 fps は、おそらく現在の再生装置の最大値です。120 fps という表記を見ますが、残像を消すために黒(または白)のフレームを交互に挿入しての数字で、実効は 60fps のようです。
旧来のテレビも、60(59.94)fps と言うことがあり、これは垂直帰線回数で、水平方向の2回の描画で1フレームを描く(インターレス)ことによります。
1.ffmpeg でどう指定するか
ffmpeg で、具体的には、どう指定するかを考えます。
結論を言うと、入力と同じ値にすると言うことです。実際には、フレームレートオプションを指定しません。ただし、能力の低い機器を考えて、12.5fps などの設定は可能にします。
- ffmpeg で設定できるフレームレートは、再生機器のフレームレートとは無関係。
デコーダーは、1フレーム分の画像を、フレームレートの示す時間で用意する。
再生機器は、この画像を自身の周期でスキャンして再生する。
- ただし、これはデコーダに十分な能力がある場合で、エンコード時のフレームレートでデコードできない場合は、正常に再生できない。
- 大抵のコーデックは、時間軸方向にも圧縮しているので、フレームレートの増減は、データ量に大きく影響しない。ただし、フレーム数分のパケットが必要なことが多いので、その分の増減はある。DVコーデックや未圧縮の画像の場合は、データ量はフレーム数に比例する。
2.フレーム・レートを変えると言うこと
これには2つの異なった意図が考えられます。
- 再生速度を変える
フレーム・レートは、各フレームの画像を再現するのに必要な情報ではない。
フレームレートを、1フレームの表示時間に使っているのは、プレーヤー。
フレームレートの数値だけを変えて、再生させると再生速度がかわる。
音声との同期のために変更したいと言うことが考えられる。
これは、「情報書き換え」ソフトの仕事で、おそらく ffmpeg には、この機能はない。
プレーヤーは、外部へは 29.97fps でも、これとは無関係にデコードを行ってる。おおむね、フレーム分のバッファを持っているのだと思う。
- ffmpeg のようなエンコーダは、デコーダ処理部がデコーダ処理部のタイミングで再現したフレームの画像を、エンコーダ処理部への入力にする。エンコーダ処理部は、エンコーダ処理部のタイミングで画像を参照するので、再生速度は変わらない。
携帯端末など非力な再生環境のために、フレームレートを低くする場合には有効。
3.フレーム・レートの値
フレーム・レートの値は、再生機器で差障らない限り、変える必要のない数字です。作成時の値のままにして置くのが良いと考えますが、何かの都合で設定する場合には一般的な値を付けたいと思います。
3.1.作成時のフレーム・レート
どんなフレーム・レートでも作れるわけですが、映像を作成する側は広く視聴されることを意図します。また、使用する機材にも同じ目的で基準があります。
| ソース |
fps |
| 映画(24fps) |
23.976
24
|
| PAL |
25 |
| NTSC |
29.97
30 |
| HD |
60
120 |
3.2.携帯端末のフレーム・レート
フレーム・レートは入力以上にする理由はありません。再生機器の能力で、デコードが追いつかない場合には、フレームレートを小さい値にすることが考えられます。この場合、再生できる値にすると言うこと以外には基準がないと思います。フレームレートは、単に画像を切り替えるタイミングの算出に使われるだけなので、数値には特別な制限はないと思います。
5.994, 6.25, 7.5, 10, 11.988, 12.5, 14.985, 15, 23.976, 25 fps
を、設定時の選択肢にしておきます。
4.フレーム・レートと容量
非圧縮の場合は、当然フレーム・レートに比例してデータ量が増減します。可逆圧縮も準じます。
また、DVの圧縮は、時間軸方向には行わない(各フレームを独立に圧縮)とのことなので、これもフレーム・レートに比例してデータ量が増減します。
一般的な、コーデックの圧縮は、時間軸方向にも行われるので、フレーム・レートの値とデータ量の間の関係は、疎になります。
元のフレーム数を超えたフレームレートを指定しても、同じ画像を繰り返すだけで、データ量は増えないとと言うことです。
ただし、通常フレーム数分のパケットが作られるので、そのオーバーヘッド分はフレーム・レートに比例します。
DVD 規格のデータを使って、確認してみます。
ffmpeg を使って、映像ストリームだけをAVIにコピーしてみます。60秒と1000秒を指定して、コピーしたところ、AVIのストリームヘッダの情報は以下のようになりました。
| |
映像の長さの指定 |
| 項目 |
60秒 |
1000秒 |
| dwScale |
1001 |
1001 |
| dwRate |
30000 |
30000 |
| dwLength |
2248 |
37463 |
| |
|
|
dwLengthを
長さ(秒)で割った値 |
37.47 |
37.46 |
dwRate/dwScale=30000/1001=29.97 が、フレームレートを示します。dwLength は、AVIでのブロック数を示します。フレーム数より多いのは、MPEG-2 の仕様なのか、AVIにするときに分割されているのかはわかりません。おそらく、コピーを指定すると、内容を見ないので、後者だと思います。
次に、同じ60秒分を、5,10,15,20,25,30,60 fps を指定して、mpeg4 にエンコードしてみます。mpeg4 を選んだのは、任意の fps を指定できるからです。mpeg2video は、5fps などは受け付けません。
|
フレームレートの設定値(fps) |
| 5 |
10 |
15 |
20 |
25 |
30 |
50 |
60 |
| ファイルサイズ(MB) |
1.659 |
2.111 |
2.604 |
3.106 |
3.506 |
3.493 |
3.480 |
3.489 |
| dwLength |
300 |
600 |
901 |
1201 |
1502 |
1802 |
3002 |
3606 |

DVD規格のソース(29.97fps)を、mpeg4 コーデックで60秒分エンコードしてみました。
出力のフレームレートを変えて、AVIファイルを作ります。左図は、ファイルのサイズと、パケット数をプロットしたものです。
mpeg4もフレームレートに応じたパケットを作ることがわかります。ここでパケットは1フレーム時間に相当するデータのブロックのことで、デコードの単位です。
ソースの 29.97fps 以上には、入力となるデータが増えないので、単位時間あたりのフレーム数が増加してもそれ以上にはファイルが大ききなっていません。
また、mpeg4には、フレーム数の増加にともなう、オーバヘッドと言うのもないようです。
5.フレーム・レートと画質
動画ファイルを変換する話なので、元の画像のフレームレートが基準になります。
元のフレームレートより大きな値にしても、同じコマが増えるだけなので、見た目には何の影響のないことになります。
ただし、フレームレートを上げると容量が増えるケースでは、同じビットレートなら画質が落ちることになります。
25fps 以下は、動きのある個所は、コマが足りないのが感じられます。
|