VideoView black flash before and after playing

前端 未结 14 2179
谎友^
谎友^ 2020-12-09 04:04

I have a VideoView which I want to use to play a movieclip. I use it like this to play it and it works.

VideoView vv = new VideoView(this);
vv.setVideoURI(Ur         


        
相关标签:
14条回答
  • 2020-12-09 04:20

    My workaround for this diabolical bug utilised a blank View with the background colour of choice over the top of the VideoView.

    <View
            android:id="@+id/blankView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@color/white" />
    

    then in my code I did this:

            video = (VideoView) findViewById(R.id.video);
            // set the video URI, passing the vSourse as a URI
            video.setVideoURI(Uri.parse(vSource));
            video.setZOrderOnTop(false);
    
            SurfaceHolder sh = video.getHolder();
            sh.setFormat(PixelFormat.TRANSPARENT);
    
            ctlr = new BCDMediaController(this);
            ctlr.setMediaPlayer(video);
            video.setMediaController(ctlr);
            video.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {              
                @Override
                public void onCompletion(MediaPlayer mp) {
                    closeActivity();
                }
            });
    
            blankView = findViewById(R.id.blankView);
    
            video.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {    
                    blankView.postDelayed(new Runnable() {
                            public void run()
                            {
                                blankView.setVisibility(View.GONE);
                            }
                        }, 500);                    
                }
            });
    
            video.start();
            video.requestFocus();
    

    That got rid of the beginning black flash for me. Then for the end black flash, I did this:

    private void closeActivity() {  
    blankView.setVisibility(View.VISIBLE);        
        blankView.postDelayed(new Runnable() {
            public void run()
            {
                video.setOnCompletionListener(null);
                video.stopPlayback();
                video.suspend();
                VideoPlayerViewController.this.finish();
            }
        }, 1);    
    }
    
    0 讨论(0)
  • 2020-12-09 04:24

    Why not using Styling and Themes

    Can you try this ? This might help

    colors.xml

    <drawable name="transparent">#00000000</drawable>
    

    styles.xml

    <style name="Transparent">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">
    @android:style/Animation.Translucent
    </item>
    <item name="android:windowBackground">@drawable/transparent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:colorForeground">#fff</item>
    </style>
    

    To set a theme for all the activities of your application, open the AndroidManifest.xml file and edit the tag to include the android:theme attribute with the style name.

    <application android:theme="@style/Transparent">
    
    0 讨论(0)
  • 2020-12-09 04:26

    There is one alternative that you are use media controller for this. Here is sample code

    videoView = (VideoView) this.findViewById(R.id.videoView);
    MediaController mc = new MediaController(this);
    videoView.setMediaController(mc);
    videoView.setVideoURI(Uri.parse("http://c421470.r70.cf2.rackcdn.com/video_5983079.m4v"));
    videoView.start();
    videoView.requestFocus(); 
    

    Try this.

    0 讨论(0)
  • 2020-12-09 04:29

    I had same problem this has worked for me ..

    When you want to show video make videoView.setZOrderOnTop(false); and when you want to hide video view just make videoView.setZOrderOnTop(true);

    0 讨论(0)
  • 2020-12-09 04:30

    Today I had the same problem and found a very bad and hacky workaround for this nasty problem: I realized that one can set a background color / drawable onto the VideoView which blends over the video surface and makes it completely hidden. This only works though while the underlying video is still playing, not when it is stopped (neither when it ended normally nor when stopPlayback() was called), otherwise you'd again see a black flicker. The background must also not be set in the beginning, otherwise the video would be completely hidden right from the start.

    So the only logical step for me was to post a delayed event just before I start the video - and since I know the video length, I let this event happen just a few milliseconds before it ends normally. I took a screenshot of the last frame in VLC and then blended it like this:

    private void startVideo()
    {
        introVideo.setBackgroundDrawable(null);
        introVideo.postDelayed(new Runnable() {
            public void run()
            {
                if (!introVideo.isPlaying())
                    return;
    
                introVideo.setBackgroundResource(R.drawable.video_still_image);
                // other stuff here, for example a custom transition to
                // another activity
            }
        }, 7500); // the video is roughly 8000ms long
        introVideo.start();
    }
    

    This however was not enough, because when the video actually ended, I still got a short black screen flicker, so I also had to set the still image as background of the container that contained the video (in my case it was the layout of the activity):

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@drawable/video_still_image">
    
        <VideoView android:id="@+id/introVideo"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:layout_alignParentRight="true"
                  android:layout_alignParentLeft="true"
                  android:layout_alignParentTop="true"
                  android:layout_alignParentBottom="true"
                  android:layout_marginTop="-10dip" />
    
    </RelativeLayout>
    

    This activity is rendered in fullscreen and the video is (mostly) scaled to the total screen size (screen 1024x600, video 960x640). I say mostly, because for some unknown reason the layout's background image blends through for about 10px on top. This was the last hack I had to apply to make it work - move the video container -10dip into the void on top.

    This now looks awesome on my Galaxy Tab, I don't dare to test it on the SGS2 phone, though...

    0 讨论(0)
  • 2020-12-09 04:30

    Where are you changing the contentView (in which method did you write the four lines of code above)?

    You should only set the contentView in the onCreate() method of an Activity. If you are doing it somewhere else (for exemple in a button’s callback), you should start a new activity instead.

    0 讨论(0)
提交回复
热议问题