2013-09-03 2 views
0

Так что в моем приложении Медиаплеер основан на SurfaceView путем расширения как:Как избежать стартового черного экрана MediaPlayer?

public class VideoView extends SurfaceView {} 

теперь он использует MediaPlayer внутри и что я хочу добиться того, чтобы сделать начальный цвет экрана белый вместо черного. VideoView размещается в виде белой картинки. Он белый, но он начинает воспроизводить видео, и VideoView становится черным на секунду. Видео само по себе имеет белый фон, и его первые кадры не черные, поэтому я предполагаю, что это о MediaPlayer. Когда он начинает воспроизводиться, по умолчанию экран становится черным. Я догадался, что могу использовать переход, например:

TransitionDrawable transition = new TransitionDrawable(new Drawable[]{new ColorDrawable(Color.WHITE), new ColorDrawable(Color.TRANSPARENT)}); 

if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) 
    this.setBackgroundDrawable(transition); 
else 
    this.setBackground(transition); 

transition.setCrossFadeEnabled(true); 
transition.startTransition(1000); 

Однако это мало помогает. Так есть способ достичь моей цели?
Забыл отметить, что его местный видеофайл (с SD-карты) воспроизводится. Таким образом, черный экран не связан с длинным установлением HTTP-сеанса или другими вещами, связанными с потоком. И подготовка осуществляется через prepareAsync();

ответ

0

Итак, я нашел неприятное решение. Ну, это лучше, чем ничего:

private TransitionDrawable transition; 
private Animation videoViewFadeInAnimation; 
@SuppressWarnings("deprecation") 
public void start() { 

    if (videoViewFadeInAnimation == null){ 
     videoViewFadeInAnimation = new AlphaAnimation(0, 1); 
     videoViewFadeInAnimation.setDuration(600); 
     videoViewFadeInAnimation.setFillAfter(true); 
     videoViewFadeInAnimation.setAnimationListener(new AnimationListener() { 
      @Override 
      public void onAnimationStart(Animation arg0) {} 
      @Override 
      public void onAnimationRepeat(Animation arg0) {} 

      @Override 
      public void onAnimationEnd(Animation arg0) { 
       if (DeviceInfo.hasAPI11()) 
        setAlpha(1); 
      } 
     }); 

    } 

    if (transition == null){ 
     transition = new TransitionDrawable(new Drawable[]{new ColorDrawable(Color.WHITE), new ColorDrawable(Color.TRANSPARENT)}); 
     transition.setCrossFadeEnabled(true); 

     if(DeviceInfo.hasAPI16()) 
      this.setBackground(transition); 
     else 
      this.setBackgroundDrawable(transition); 
    } 

    if (isInPlaybackState()) { 
     if (mCurrentState!=STATE_PAUSED){ 
      startAnimation(videoViewFadeInAnimation); 
      transition.startTransition(1); 
     } 
     hideVideoControls(); 
     mMediaPlayer.start(); 
     mCurrentState = STATE_PLAYING; 
    } 
    mTargetState = STATE_PLAYING; 
} 

его метод моего видеообзора, который начинает воспроизведение видео. В основном он делает 0 альфа для VideoView и белый bg за 1 мс (не работает без перехода bg), а затем анимирует альфа от 0 до 1 за 600 мс. Если значение использования lt 600, то раздражающий черный экран становится заметным. Однако 600 мс без видимого видео также не самая лучшая вещь, потому что визуально звук начинается раньше. Эти решения не всегда срабатывают и не знают, почему.

Смежные вопросы