« 『夏野菜カレーラーメン』を食う! | トップページ | マクドナルドの『無料券』ゲット! »

2011年11月19日 (土)

アンドロイドで「MediaPlayer.getCurrentPosition」を使うと悲しい思いをする。

音に合わせてアクションを起こす処理を作成しているのだが…

どうも、おかしい…。

どうも、微妙に一秒ぐらいずれたりする…。

例えば、以下のようにタイムシートを作成して動作させる。

0000:action_00
0100:action_01
0200:action_02
0300:action_03
0400:action_04
0500:action_05
0600:action_06
0700:action_07
0800:action_08
0900:action_09
1000:action_10

こんな感じでメディアプレイヤーから経過時間を得る。

int currentTime    = mp.getCurrentPosition();

で、やってみると…

何か妙にずれる…。

試しに、「System.currentTimeMillis」に切り替えてみたら…

ばっちり動いたぁ!

説明には、「ミリ秒単位の現在位置」とあるのだが…。

しかし、ウインドウズのサウンドとかを考えると
情報をリアルタイムに得られなかったはず。

PCでサウンドのメモリーへのアクセスを行う場合は、
サウンドチップがメモリーをロックしてしまうので
アクセスしていないときに書き込んだ記憶がある。

丁度アンドロイドをUSBで接続しても「マウント」しないと
使えないように確か排他処理をしていたんだと思う。

なので、カウンターもリアルに取れていないのかもしれない…。

と、想像…。

なので結論!

シビアにミリセックを得たいのなら
「System.currentTimeMillis」を使う!

再生開始時に時間を登録し
mMediaPlayer.start();
setupTime    = System.currentTimeMillis();

時間を得るときこんな感じで得る
//※廃止int currTime    mp.getCurrentPosition();
long currTime    = System.currentTimeMillis() - setupTime;

こうすれば、ばっちりだ!

所で、どのぐらいずれるものなのだろう?

何でずれるのだろう?

折角なので、そのあたりも確認してみる。
軽くこんな感じでログを出してみる。

long currTime    = System.currentTimeMillis() - setupTime;
Log.i("####", "time = " + currTime - mp.getCurrentPosition());

約3500個サンプリングしてみて比較すると
-156~780ミリセックで変動している。

1秒以内にずれが収まっている…?

グラフだとこんな感じ。

Photo

680ミリセックあたりにピークがある。

これを見ると「getCurrentPosition」も正しく時間を刻んでいるのは、確認できる。

ただし、リアルな時間と微妙に異なるのが見て取れる。

「getCurrentPosition」で得られる時間は、
これから再生する1秒程先の秒へ移動するようだ。

つまり、分解能力は、1秒って事。

さらに、これから再生する場所の一秒前となっている。

こは、多分バッファリング・カウンタなのでは?

すると、バッファリング容量は、1秒間って事になる。

精度は、「ミリセック単位」…

そして「(バッファリングの)現在位置」と言う事らしい。

それなら納得…。

サウンドプレイヤーの表示なら問題ないだろう。

だが、もう少し誤解をしないように説明して欲しい…。(汗)

2011年11月19日追記--------------
良く考えたら、考え間違えだろう!
って、一人ボケ突っ込み…。
なので修正。(汗)

ちなみにサンプリングタイミングは、
「onDrawFrame」で呼ばれたとき。
ログは、「getCurrentPosition」と
「System.currentTimeMillis」で
得た直後なので、そんなにぶれが起きるとも
思えないのだが。ぶれがあるので
何らかの特定に依存しているタイミングなのだろう。
…それは、なんだろう?(笑)

|

« 『夏野菜カレーラーメン』を食う! | トップページ | マクドナルドの『無料券』ゲット! »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/108365/53277508

この記事へのトラックバック一覧です: アンドロイドで「MediaPlayer.getCurrentPosition」を使うと悲しい思いをする。:

« 『夏野菜カレーラーメン』を食う! | トップページ | マクドナルドの『無料券』ゲット! »