2006年05月31日

mp4box がfps指定値を地味に守らない件 -- その3

【概要】一応、解決かもしんない。
【タグ】[mp4box][fps]
【関連記事】mp4boxがfps指定値を地味に守らない件mp4boxがfps指定値を地味に守らない件 -- その2
mencoder user mailing listで見つけた「-fps 23.976025」。
mp4box \
-fps 23.976025 \
-add VIS24a_YumeTukai07.264 \
-add VIS24a_YumeTukai07.aac.mp4 \
-new VIS24a_YumeTukai07.mp4
これで以下のように映像のTimescaleが「24000」となる。
mp4box -info VIS24a_YumeTukai07.mp4
* Movie Info *
Timescale 600 - Duration 00:24:29.175
Fragmented File no - 2 track(s)
File Brand isom - version 1

File has root IOD
Scene PL 0xff - Graphics PL 0xff - OD PL 0xff
Visual PL: AVC/H264 Profile (0x15)
Audio PL: AAC Profile @ Level 2 (0x29)
No streams included in root OD

Track # 1 Info - TrackID 1 - TimeScale 24000 - Duration 00:24:29.176
Media Info: Language "und" - Type "vide" - Sub Type "avc1" - 35225 samples
MPEG-4 Config: Visual Stream - ObjectTypeIndication 0x21
AVC/H264 Video - Visual Size 640 x 352
Self-synchronized

Track # 2 Info - TrackID 2 - TimeScale 48000 - Duration 00:24:28.949
Media Info: Language "und" - Type "soun" - Sub Type "mp4a" - 68857 samples
MPEG-4 Config: Audio Stream - ObjectTypeIndication 0x40
MPEG-4 Audio AAC LC - 2 Channel(s) - SampleRate 48000
Synchronized on stream 1
「-fps 23.976」ではここの表示は「23975」だったので地味にキモチわるかったが、24000なら23.976より小刻みなTimescaleを使って いる事になる。
再生ソフトで見ると概ねいい感じ。
、、、一応、QTとVLCが小数点以下4桁まで揃っている。
VLC 23.976024
QuickTime Player Pro(コマンド+J) 23.97601318359375
QuickTime Player Pro(コマンド+I) 23.98
MPlayer OSX 24.0
MPlayer dev-CVS-060418-00:29-4.0.1 23.976
特にVLCはかなり電卓の値に近い。TVキャプチャではとりあえずこれで良いような希ガス。

/*/

釈然としないのは、電卓だと24000/1001=23.97602397602 なので丸めかたが良く解らない事。
いや実用上これまでも問題を感じた事は無いし、字幕作成やSoftsubやるわけじゃないんで、あんまこだわるとこじゃないんだけど、地味になんつうかこ の、、、。
10進法がどうしたとか、なんかそうゆうメモが妖精現実さんとこにあったような、、、う、コピペしときゃよかった。
なんだっけ、「第三の24fps」みたいなタイトル、、、記事化されてたっけな。うげげ、第四ですってよひろみ<誰
http://www.faireal.net/articles/9/17/
あれ?23.976025なんて無いぞ?なにこれ?mp4boxの小数点記法、ナゾすぎる。

追記060602

Lunatilia(Sylphide 氏)のエントリ、「float型」にてナゾが解けていた。カギは小数点以下の計算方式にあるら しい。
Sylphide氏はあくまで推測としているが、まとめるとこうなる。
24000/1001
float型(浮動小数点) 23.9760246277
(23.976025)
小数精度6 桁の演算ができる。
小数点6位以下は精度がヘン。
double型(倍精度浮動小数点) 23.9760239760
(23.976024)
小数精度 10桁の演算ができる。
詳細はLunatilia(Sylphide 氏)のエントリ、「float型」にて是非。
比較計算してみるためのC言語のソースも記載されている。感謝感謝。

実はソレ以前の段階で、浮動小数点というのがよくわからないのだが、思うに、
コンピュータは0と1しか扱えないと聞く。
ならば、素のままでは0と1の間の数、小数点というものも扱えないはずだ。
だから、計算式にでてくる数字を全部1000倍とかして小数点の位置をズラして整数の計算にしてしまへというものだろう。
小数点をどれくらいずらすかで計算精度(と、CPU負荷)が変わって来る。と。
CPU負荷はどんだけかかってもいいからすげぇ精度が欲しい!という場合はdoubleの上とかもあるのだろう。

ってことは、fps指定するのに分数記法(24000/1001など)を使うツールでも内部的にはfloatかdoubleかのどっちか、ものによっては もっと精度の良いナニカ(トリプル?)を使っているわけで、、、
mencoderとmp4boxのように出自の違うツールを組み合わせて使う場合はそのへんも意識したほうが良いケースもあり得る。

気になるのはQuick"Time"系。 そもそもの構想段階からa/v syncが大問題になる事を見越して作られたプロツールの土台なわけで、.mp4作成時にはムービー全体のTimeScaleは90000(90000分 の1秒)という余裕ありまくりなものになる。毎秒60フィールドだとしても大きい。ここに24fpsの映像や48000Hzの音声を貼付けていく事になる ので、各ストリームのTimeScaleがdoubleだろうがfloatだろうがきっちりsyncできるようになっているんじゃまいか。

ま、大半はfloat型だろうし(x264cliの--fps<float | rational>)、字幕の色を変えるタイミングや、a/v desyncをミリセカンド単位でコントロールしたいとか、24時間TVを完璧なリップシンクでエンコードしたいとかで無い限り、fps 23.976025とfps 23.976024の違いはそうそう問題にはならないとおもうのだけど。
 フレッド・アステアとかみると「これちゃんとa/v syncできるんだろうなぁ」と地味に燃えるのであった。
posted by ばる at 00:00| Comment(5) | TrackBack(1) | その他 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
23.976025という数字ですが、おそらくfloatでの計算値だと思います。
double(倍精度浮動小数)型で24000/1001を小数点10桁まで計算させると
23.9760239760
となり、VLCの結果のように23.976024と丸めることができます。
一方float(浮動小数)型では
23.9760246277
という値となり、23.976025となります。
これは、float型が小数精度6桁となっているからで、言い換えれば小数点以下6桁以降の精度は補償されていないということです。

あくまで推測にすぎませんが、「-fps 23.976025」にはfloat型の計算方法が関わっていると思いますよ。
Posted by Sylphide at 2006年06月02日 01:42
ありがとうございます。
トラバが弄れないので本文中にリンクとあわせて追記させていただきました。
Posted by ばる at 2006年06月02日 23:37
引用までしていただいて恐縮です。

ソースなのですが実は結果出力のところ

printf("%.10f / %.10f = %.10f\n",a,b,ans);

を以下のように

printf("%.6f / %.6f = %.6f\n",a,b,ans);

としたほうが判りやすかったかもと書いた後で思ったのですが、そのまま放置してしまいました。
%.6fとすることによって小数第6位まで表示できますので簡単に比較できたりします。

また、float型・double型共に精度問題を解決する方法として対数表現を用いていたりします。
float型は小数精度6桁なので、それ以下は精度不足になりますが、対数表現を用いることにより10進浮動小数表現より精度を高くすることができます。
例えば0.000000001は1.0e-09とかいう風に。
出力部分を次のように

printf("%g / %g = %g\n",a,b,ans);

とすると、下のような結果になります。
=========================================
$ ./float
1st Number: 1.0e-9
2nd Number: 1.3804e-23
1e-009 / 1.3804e-023 = 7.24428e+013
=========================================
Posted by Sylphide at 2006年06月03日 00:31
>気になるのはQuick"Time"系。そもそもの構想段階からa/v syncが大問題になる事を見越して作られたプロツールの土台なわけで、.mp4作成時にはムービー全体のTimeScaleは90000(90000分の1秒)という余裕ありまくりなものになる

90KHzは単にMP4boxのデフォルトで、MPEG-1 SystemのSTCと同じですね。MPEG-2 SystemのSTCは27MHzで、MPEG-4は仕組みがちと違うんですが、最大で32ビットって事でいいはずです。

まあ、通常の用途なら90KHzでも十分なはずですし、下手に大きくすると計算が面倒になったり、桁あふれが心配になったり、保持するタイムスタンプの情報量が増えたり、etc...という理由もあるんじゃないかとw

mp4boxのコンパイルについてですが、mp4boxコマンド「だけ」でよければ外部のライブラリはほとんど必要なかったはずです。
ffmpegやその他諸々が必要になるのは、GPACに含まれるサンプルプレイヤーの為であって、mp4box自体はそれらを必要としません。

私はG4でTigerな環境は持ってないですが、エラーが出て失敗するようならログをどっかにUpして頂ければ確認してみます。
Posted by 通りすがり at 2006年06月03日 03:01
◆Sylphide様

有り難うございます。
あのソースコード、放置気味だったCの本ひっぱりだして動かしてみようと思います。感謝感謝。


◆通りすがり様

ちょっとmp4boxのビルドに手を出してみましたが、なかなか自分のレベルでは厳しそうな印象を受けました。
ゆっくりやっていきますので宜しければご覧下さい。
http://htffmpegx.seesaa.net/article/18801023.html
Posted by ばる at 2006年06月03日 23:45
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス: [必須入力]

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/18629184
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック


Excerpt: float型
Weblog: lunatilia
Tracked: 2006-06-02 04:28
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。