2

我一直工作在用戶觸摸屏幕開始電影中的應用更亮。屏幕圖像是電影的第一幀。一旦觸摸發生,電影就會播放。我通過在電影前面放置第一幀jpg,然後在我認爲電影正在播放時刪除jpg。 (搞清楚當發生這種情況是不可能的,但這是另一個問題,而舊設備上,如果你刪除圖像太早,你黑)的Kindle Fire HD:電影比JPG格式

這個測試可能上六個不同的設備。今天的第七場:Kindle Fire HD。在這個設備上,電影比相應的jpg更亮。在所有其他設備上,它們完美匹配。任何想法可能會導致這種情況或如何解決?

(與HD另一個問題是,電影需要很長的時間來開始播放但這是另外一個問題。)

編輯:這裏是我的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文件。

+1

你有樣品,你可以共享顯示這個?我還沒有看到這個問題,使用嵌入HTML5視頻與海報來僞造相同,但我沒有嘗試過使用videoView和疊加圖像。想知道如果這是覆蓋,這是造成神器..你有沒有嘗試覆蓋只有一半的視頻圖像(看看它之間有什麼區別和它不是)之間的區別? – Offbeatmammal

+0

@Offbeatmammal - 試過了,沒有。一旦mp.start()被調用,整個屏幕變亮並在電影完成時變暗。即使你看不到電影(因爲它被jpg隱藏),屏幕也會變亮。因此,它看起來像屏幕亮度參數正在調整,但我把亮度一直向上,它仍然發生。非常令人費解;將繼續嘗試。是的,如果我可以一起採取行動,示例代碼將會很好。 – SeaRisk

+0

這可能與硬件加速有關嗎?試圖測試這個假設,但不知道如何。就好像啓動電影播放器​​改變了屏幕的渲染方式(包括與電影播放器​​無關的屏幕部分)。 – SeaRisk

回答