Nexus Oneで動画プレイヤーを開発していて、Galaxy S2で試したら音は鳴るけど映像が表示されないという状況がありました。
問題点としては以下の2つ。
- 動画の縦横サイズが取れない
- ホルダーのサイズを固定しても出力されない
どうやらMediaPlayer.createがハマりどころのようです。
以下がNexus Oneで動いていたコードです。
mMediaPlayer = MediaPlayer.create(this, Uri.parse(moviefile));
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setDisplay(holder);
int videoHeight = mMediaPlayer.getVideoHeight();
int videoWidth = mMediaPlayer.getVideoWidth();
これが、Galaxy S2に持ってくると、getVideoWidthとgetVideoHeightが0を返します。
結論としては、以下のように書き換えました。
// mMediaPlayer = MediaPlayer.create(this, Uri.parse(moviefile));
mMediaPlayer = new MediaPlayer();
mMediaPlayer.reset();
mMediaPlayer.setDataSource(this, Uri.parse(moviefile));
// setDisplayをprepareの前に持ってこないといけない
mMediaPlayer.setDisplay(holder);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.prepare();
(中略)
@Override
public void onPrepared(MediaPlayer mp) {
int videoHeight = mp.getVideoHeight();
int videoWidth = mp.getVideoWidth();
prepareメソッドを呼んだ後でも、やっぱりビデオサイズは取れないので、OnPreparedListenerを登録して、そちらで動画サイズを取得する必要があります。
prepareAsyncがあるのだからprepare後は当然mMediaPlayerからサイズ取れると思ったのですが。
prepareの動作が端末(バージョン?)ごとにちょっと違うみたいですね。
それと、以下のエラーが出ますが原因不明です。特に問題は起きていないのですが…
06-04 14:16:56.665: E/Surface(16331): Surface::init token -2 identity 278
06-04 14:16:56.670: E/MediaPlayer-JNI(16331): setDataSource: outside path in JNI is �x@
結局VideoView使うのが一番楽かと。

HOMMA Teppei

