Android KindleFireHD:电影比JPG更明亮

Android KindleFireHD:电影比JPG更明亮,android,media-player,android-mediaplayer,kindle-fire,brightness,Android,Media Player,Android Mediaplayer,Kindle Fire,Brightness,我一直在开发一个应用程序,用户通过触摸屏幕开始一部电影。屏幕图像是电影的第一帧。一旦触摸发生,电影就会播放。我把第一帧的jpg放在电影前面,然后在我认为电影正在播放时移除jpg。(不可能知道何时会发生这种情况,但这是另一个问题。在较旧的设备上,如果过早删除图像,则会变黑。) 在六种不同的设备上进行了测试。今天第七集:KindleFireHD。在这个设备上,电影都比相应的JPG更亮。在所有其他设备上,它们完全匹配。有什么想法可以导致这种情况或如何修复 (高清的另一个问题是,电影需要很长时间才能开始

我一直在开发一个应用程序,用户通过触摸屏幕开始一部电影。屏幕图像是电影的第一帧。一旦触摸发生,电影就会播放。我把第一帧的jpg放在电影前面,然后在我认为电影正在播放时移除jpg。(不可能知道何时会发生这种情况,但这是另一个问题。在较旧的设备上,如果过早删除图像,则会变黑。)

在六种不同的设备上进行了测试。今天第七集:KindleFireHD。在这个设备上,电影都比相应的JPG更亮。在所有其他设备上,它们完全匹配。有什么想法可以导致这种情况或如何修复

(高清的另一个问题是,电影需要很长时间才能开始播放。但这是另一个问题。)

编辑:这是my 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>
我将ImageView更改为没有图像,只有纯色背景。您需要的唯一数据文件是mp4电影。当您触摸屏幕时,隐藏在ImageView后面的电影将播放。当我触摸屏幕时,屏幕立即变亮(发生mp.start()),然后电影开始播放,逐渐变暗,然后再次变亮,最后在电影结束时稳定下来

我尝试了硬件加速,但没有硬件加速;没有区别。我试着插入KindleFireHD,但没有插入;没有区别


我会发布我正在使用的2秒mp4文件,但不知道如何发布。

看起来它是经过设计的,根据本论坛的帖子-

你有没有可以分享的示例来展示这一点?我没有看到过使用带有海报的嵌入式html5视频来伪造相同内容的问题,但我没有尝试使用视频视图和覆盖图像。想知道是不是覆盖层造成了伪影。。你有没有试过在一半的视频上叠加图像(看看它在哪里和没有在哪里有区别)?@OffBeatEmulator-只是尝试了一下,没有。整个屏幕在mp.start()被调用后立即变亮,在电影结束时变暗。即使你看不到电影(因为它被jpg隐藏),屏幕也会变亮。所以看起来屏幕亮度参数正在调整,但我一直将亮度调高,但这种情况仍然存在。非常令人费解;我们将继续试验。是的,如果我能把我的行为集中起来,示例代码会很好。这可能与硬件加速有关吗?试图验证这一假设,但不知道如何验证。这就好像启动电影播放器会改变屏幕的渲染方式(包括屏幕上与电影播放器无关的部分)。(需要明确的是:我用jpg将视图设置为屏幕的一半,用电影将surfaceview设置为屏幕的一半,等等;每次执行mp.start()都会使整个屏幕变亮。)我刚刚发布了一个代码,以防图像一直出现在电影前面。这部电影的另一个特点是,当电影结束时,我可以看到一个重画发生了,出于某种原因,它包括一条模糊的暗线,沿着屏幕的中心,只是一瞬间。
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 );
}}