1

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

public class VideoView extends SurfaceView  {}

现在,它在内部使用 MediaPlayer,我想要实现的是使屏幕的起始颜色为白色而不是黑色。VideoView 本身放置在白色背景布局中。它是白色的,但 atm 它开始播放视频,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();

4

1 回答 1

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 和 1ms 的白色背景(没有背景转换不起作用),然后在 600ms 内将 alpha 从 0 设置为 1。如果使用值 lt 600,那么恼人的黑屏就会变得明显。然而,600 毫秒的视频不可见也不是最好的事情,因为视觉上的音频开始得更早。这种解决方案并不总是有效,也不知道为什么。

于 2013-09-05T12:59:29.133 回答