如何避免MediaPlayer启动黑屏?

时间:2013-09-03 13:55:43

标签: android media-player

所以在我的应用程序中,MediaPlayer基于SurfaceView,扩展如下:

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();

完成

1 个答案:

答案 0 :(得分: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;
}

它是我的VideoView方法,可以开始播放视频。基本上它为VideoView制作0 alpha,白色bg为1ms(没有bg过渡时不起作用)然后将alpha从0到1动画为600ms。如果使用值<600,则恼人的黑屏变得明显。然而600毫米没有视频可见也不是最好的东西因为视觉音频开始较早。这个解决方案并不总是有用,也不知道为什么。