ユーザーが画面に触れて映画を開始するアプリに取り組んでいます。画面イメージはムービーの最初のフレームです。タッチが発生すると、ムービーが再生されます。これを行うには、最初のフレームの jpg をムービーの前に置き、ムービーが再生されたと思ったら jpg を削除します。(それがいつ起こるかを把握することは不可能ですが、それは別の問題です。また、古いデバイスでは、画像をすぐに削除すると黒くなります。)
おそらく6つの異なるデバイスでこれをテストしました。本日7回目:Kindle Fire HD。このデバイスでは、ムービーはすべて、対応する jpg よりも明るいです。他のすべてのデバイスでは、完全に一致します。これを引き起こす可能性のあるもの、または修正方法はありますか?
(HD のもう 1 つの問題は、映画の再生が始まるまでに非常に長い時間がかかることです。しかし、それは別の問題です。)
編集: ここに私の main.xml があります:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<VideoView
android:id="@+id/vv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</FrameLayout>
コードは次のとおりです。
public class VideoTestActivity extends Activity implements SurfaceHolder.Callback, OnPreparedListener, OnCompletionListener {
private VideoView vv;
private ImageView iv;
private Bitmap b;
private MediaPlayer mp = new MediaPlayer();
private static final String TAG = VideoTestActivity.class.getSimpleName();
private volatile boolean prepared = false;
private volatile boolean readytoplay = false;
private volatile boolean playing = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
iv = (ImageView)findViewById(R.id.iv);
iv.bringToFront();
vv = (VideoView)findViewById(R.id.vv);
b = BitmapFactory.decodeResource(getResources(), R.drawable.babyblack);
iv.setBackgroundColor( 0xFFDFA679 );
vv.getHolder().addCallback(this);
mp.setOnPreparedListener( this );
mp.setOnCompletionListener( this );
try {
mp.setDataSource( this, Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.ape) );
} catch (IllegalArgumentException e) {
Log.d(TAG,"illegal argument exception on set data source");
e.printStackTrace();
} catch (SecurityException e) {
Log.d(TAG,"security exception on set data source");
e.printStackTrace();
} catch (IllegalStateException e) {
Log.d(TAG,"illegal state exception on set data source");
e.printStackTrace();
} catch (IOException e) {
Log.d(TAG,"IO exception on set data source");
e.printStackTrace();
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float dx, dy;
Log.d(TAG,"touch event");
if ( !playing && event.getAction() == MotionEvent.ACTION_UP ) {
Log.d(TAG,"action up");
if ( prepared ) {
playing = true;
Log.d(TAG,"hardware accelerated: iv="+iv.isHardwareAccelerated()+", vv="+vv.isHardwareAccelerated());
mp.start();
Log.d(TAG, "playing video in onTouch callback");
Log.d(TAG,"hardware accelerated: iv="+iv.isHardwareAccelerated()+", vv="+vv.isHardwareAccelerated());
} else
readytoplay = true;
}
return true;
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
Log.d(TAG,"surface is created");
mp.setDisplay( vv.getHolder() );
try {
mp.prepareAsync();
} catch (IllegalArgumentException e) {
Log.d(TAG,"illegal argument exception on prepare");
e.printStackTrace();
} catch (SecurityException e) {
Log.d(TAG,"security exception on prepare");
e.printStackTrace();
} catch (IllegalStateException e) {
Log.d(TAG,"illegal state exception on prepare");
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void onPrepared(MediaPlayer mp) {
Log.d(TAG,"video is prepared");
prepared = true;
if ( readytoplay ) {
playing = true;
mp.start();
iv.setVisibility( View.GONE );
Log.d(TAG,"playing video from prepared callback");
}
}
@Override
public void onCompletion(MediaPlayer arg0) {
Log.d(TAG,"video is done");
playing = false;
iv.setVisibility( View.VISIBLE );
}}
ImageView を変更して、画像を持たないようにしましたが、単色の背景だけにしました。必要なデータ ファイルは mp4 ムービーだけです。画面に触れると、ImageView の背後に隠れてムービーが再生されます。タッチするとすぐに画面が明るくなり (mp.start() が発生)、ムービーの再生が開始され、徐々に暗くなり、再び明るくなり、ムービーが終了すると安定します。
ハードウェア アクセラレーションを試しましたが、ハードウェア アクセラレーションはありませんでした。変わりはない。Kindle Fire HD を接続してみましたが、接続しませんでした。変わりはない。
私が使用している 2 秒の mp4 ファイルを投稿しますが、方法がわかりません。