android - एंड्रॉइड वीडियो देखें ब्लैक स्क्रीन




flicker android-videoview (14)

TextureView को विस्तारित करके, मुझे शुरुआत या अंत में कोई ब्लैक स्क्रीन नहीं मिलती है। यह है कि आप ZOrderOnTop(true) का उपयोग करने से बचना चाहते हैं।

public class MyVideoView extends TextureView implements TextureView.SurfaceTextureListener {
  private MediaPlayer mMediaPlayer;
  private Uri mSource;
  private MediaPlayer.OnCompletionListener mCompletionListener;
  private boolean isLooping = false;


  public MyVideoView(Context context) {
      this(context, null, 0);
  }

  public MyVideoView(Context context, AttributeSet attrs) {
      this(context, attrs, 0);
  }

  public MyVideoView(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      setSurfaceTextureListener(this);
  }

  public void setSource(Uri source) {
      mSource = source;
  }

  public void setOnCompletionListener(MediaPlayer.OnCompletionListener listener) {
      mCompletionListener = listener;
  }

  public void setLooping(boolean looping) {
     isLooping = looping;
  }

  @Override
  protected void onDetachedFromWindow() {
     // release resources on detach
     if (mMediaPlayer != null) {
         mMediaPlayer.release();
         mMediaPlayer = null;
     }
     super.onDetachedFromWindow();
   }

   /*
    * TextureView.SurfaceTextureListener
    */
    @Override
   public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
     Surface surface = new Surface(surfaceTexture);
     try {
         mMediaPlayer = new MediaPlayer();
         mMediaPlayer.setOnCompletionListener(mCompletionListener);
         mMediaPlayer.setOnBufferingUpdateListener(this);
         mMediaPlayer.setOnErrorListener(this);
         mMediaPlayer.setLooping(isLooping);
         mMediaPlayer.setDataSource(getContext(), mSource);
         mMediaPlayer.setSurface(surface);
         mMediaPlayer.prepare();
         mMediaPlayer.start();
     } catch (IllegalArgumentException e) {
         e.printStackTrace();
     } catch (SecurityException e) {
         e.printStackTrace();
     } catch (IllegalStateException e) {
         e.printStackTrace();
         mMediaPlayer.reset();
     } catch (IOException e) {
         e.printStackTrace();
     }
   }

   @Override
   public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}

  @Override
  public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
     surface.release();
     return true;
  }

  @Override
  public void onSurfaceTextureUpdated(SurfaceTexture surface) {}
}

शुरुआत () विधि चलने से पहले मैं एक वीडियो व्यू पर गंदा काले प्रारंभिक स्क्रीन से छुटकारा पाने के लिए एक रास्ता तलाश रहा हूं।

मैंने विजेट पर पृष्ठभूमि छवि के साथ प्रयास किया है लेकिन यह बिल्कुल अपेक्षित काम नहीं करता है। मैंने वीडियो व्यू के शीर्ष पर वीडियो में पहले फ्रेम की एक छवि डालने और सितारों () विधि के बाद इसे छिपाने का भी प्रयास किया है। वीडियो शुरू करने के लिए एक ऑनपेरर्ड श्रोता जोड़ना और फिर छवि को छुपाएं। यह काम करता है लेकिन संक्रमण में एक भयानक झिलमिलाहट है और मुझे नहीं पता कि इससे कैसे छुटकारा पाना है।

आपके जवाब के लिए धन्यवाद। MediaController को जोड़ने से कोई प्रभाव नहीं पड़ा। समस्या बनी रहती है (मुझे अभी भी ब्लैक फ्लिकर दिखाई देता है) और मैं वीडियो नियंत्रण बिल्कुल दिखाना नहीं चाहता हूं। मेरा कोड इस तरह दिखता है:

    VideoView vSurface= (VideoView) findViewById(R.id.surfaceView1);
    vSurface.setVideoURI(Uri.parse("android.resource://com.mypackage/" + R.raw.video1));
    vSurface.setVisibility(View.VISIBLE);
    vSurface.setOnPreparedListener(this);
    vSurface.setDrawingCacheEnabled(true);
    vSurface.setOnErrorListener(this);

इस उत्तर के लिए थोड़ा देर हो चुकी है, लेकिन शायद अन्य उपयोगकर्ताओं को एक ही समस्या है और यह प्रश्न ढूंढें ..

मैंने शुरुआत में बैकग्राउंड रिसोर्स सेट करके और फिर, वीडियो शुरू करते समय, मैंने पृष्ठभूमि को अदृश्य रंग में सेट कर दिया है ..

VideoView myView = findViewById(R.id.my_view);
myView.setBackgroundResource(R.drawable.some_resource);
// some stuff

// this is when starting the video
myView.setVideoUri(someUri);
// also set MediaController somewhere...
//...
// now set the backgroundcolor to be not visible (first val of Color.argb(..) is the alpha)
myView.setBackGroundColor(Color.argb(0, 0, 0, 0));
//...
myView.start();

कष्टप्रद FrameVideoView और काले स्क्रीन के मुद्दों से बचने के लिए मैंने FrameVideoView लिखा FrameVideoView

यह TextureView से 'प्लेसहोल्डर समाधान' से लाभ लेता है और (यदि आपका डिवाइस एपीआई स्तर 14 या उच्चतर चल रहा है), जो TextureView से अधिक कुशल है।

मैंने अपने ब्लॉग पर article लिखा है कि यह वास्तव में क्या करता है।

इसका उपयोग करना आसान है:

लेआउट में FrameVideoView जोड़ें:

<mateuszklimek.framevideoview.FrameVideoView
    android:id="@+id/frame_video_view"
    android:layout_width="@dimen/video_width"
    android:layout_height="@dimen/video_height"
  />

Activity में अपना उदाहरण onResume और संबंधित तरीके को onResume और onResume में कॉल करें:

public class SampleActivity extends Activity {

  private FrameVideoView videoView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple);

    String uriString = "android.resource://" + getPackageName() + "/" + R.raw.movie;
    videoView = (FrameVideoView) findViewById(R.id.frame_video_view);
    videoView.setup(Uri.parse(uriString), Color.GREEN);
  }

    @Override
    protected void onResume() {
      super.onResume();
      videoView.onResume();
    }

    @Override
    protected void onPause() {
      videoView.onPause();
      super.onPause();
    }
  }

गैलेक्सी टैब 2, एंड्रॉइड 4.1.1 पर मुझे एक ही समस्या थी।

videoView.setZOrderOnTop(true); और अगला वीडियो देखें। videoView.start()

यह मेरे लिए ठीक काम करता है।


मुझे एक ही समस्या थी और यह मेरे लिए काम किया है ..

जब आप वीडियो दिखाना चाहते हैं, तो VideoView.setZOrderOnTop (झूठी) बनाएं; और जब आप वीडियो छिपाना चाहते हैं, तो बस VideoView.setZOrderOnTop (सत्य) बनाएं;


मुझे एक ही समस्या मिली और मुझे एक समाधान मिला। यह थोड़ा सा हैकी लेकिन यह चाल है। तो मूल रूप से आपको अपने वीडियो व्यू को फ्रेमलेआउट में रखना होगा। Videoview पर आपको अपने वीडियो की पृष्ठभूमि के साथ एक और फ्रेमलाउट जोड़ने की आवश्यकता है और जब आपका वीडियो लोड हो जाता है और प्लेसहोल्डर को छुपाने के लिए तैयार होता है।

<FrameLayout
  android:id="@+id/frameLayout1"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:layout_gravity="center"
  android:layout_marginTop="50dip" >

  <VideoView
    android:id="@+id/geoloc_anim"
    android:layout_width="fill_parent"
    android:layout_height="172dip" android:layout_gravity="top|center" android:visibility="visible"/>

  <FrameLayout
      android:id="@+id/placeholder"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent" android:background="@drawable/fondvert_anim">
  </FrameLayout>

आपकी गतिविधि में आपको OnPreparedListener लागू करने और इसे जोड़ने की आवश्यकता है

//Called when the video is ready to play
public void onPrepared(MediaPlayer mp) {

    View placeholder = (View) findViewById(R.id.placeholder);

    placeholder.setVisibility(View.GONE);
}

तो जब वीडियो तैयार हो जाता है तो हम अपने प्लेसहोल्डर को छुपाते हैं और वह चाल काला झिलमिलाहट स्क्रीन से बचती है।

उम्मीद है कि यह किसी की मदद करेगा।


मेरी भी यही समस्या थी। मैंने पाया कि इसका मुख्य कारण FrameLayout लेआउट का उपयोग मूल लेआउट के रूप में किया गया था। VideoView के पैरेंट लेआउट के रूप में RelativeLayout उपयोग करें


मैं इस समाधान को पसंद करूंगा: https://.com/a/11016465/2267723

इसकी सतह के बारे में एक डमी @ खंड लेआउट बनाएं और आप फिर से यह काला फ्लैश नहीं देखेंगे ..


यह गतिविधि और टुकड़े दोनों पर मेरे लिए काम करता है।

VideoView mVideo = (VideoView) findViewById(R.id.yourViewViewId);
          mVideo.setVideoURI(mUri);
          mVideo.setZOrderOnTop(false);

SurfaceHolder surfaceholder = mVideo.getHolder();
surfaceholder.setFormat(PixelFormat.TRANSPARENT);

यह देखो

VideoView videoView = (VideoView) findViewById(R.id.VideoView);
        MediaController mediaController = new MediaController(this);
        mediaController.setAnchorView(videoView);
        Uri video = Uri.parse("android.resource://your_package_name/"+R.raw.monkeysonthebed_video);

        videoView.setMediaController(mediaController);
        videoView.setVideoURI(video);
        videoView.start();

यह मेरे लिए काम करता है:

एक्सएमएल में: वीडियोव्यू सफेद पृष्ठभूमि के साथ एक सापेक्ष लेआउट के पीछे छुपाएं

    <VideoView
      android:id="@+id/myVideo"
      android:layout_below="@+id/logo_top"
      android:layout_width="200dp"
      android:layout_height="200dp"
      android:layout_centerHorizontal="true" 
    />
    <RelativeLayout
      android:id="@+id/mask"
      android:background="#FFFFFF"
      android:layout_below="@+id/logo_top"
      android:layout_centerHorizontal="true"
      android:layout_width="200dp"  android:layout_height="200dp"
    >
    </RelativeLayout>

और गतिविधि में: ऑनक्रेट

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.acceuil);
    myVideo = (VideoView)  findViewById(R.id.myVideo);
    mask = (RelativeLayout)  findViewById(R.id.mask);
    String path = "android.resource://" 
      + getPackageName() + "/" + R.raw.anim_normal;
    myVideo.setVideoURI(Uri.parse(path));
    myVideo.start();
}

ऑनस्टार्ट:

 public void onStart() { 
    final long time = System.currentTimeMillis();
    super.onStart();
    new CountDownTimer(5000, 100) { 
    @Override
        public void onTick(long l) {

            long time2 = System.currentTimeMillis();
            if((time2 - time) > 500) {
                mask.setVisibility(View.GONE);
            }
        }

}.start();

उम्मीद है की यह मदद करेगा।


यह मेरे लिए काम किया:

videoView.setBackgroundColor(Color.WHITE); // Your color.
videoView.start();
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        videoView.setBackgroundColor(Color.TRANSPARENT);
    }
});

कम से कम दो साल बाद, लेकिन मुझे उम्मीद है कि यह सहायक था।


वीडियो के पूर्वावलोकन के रूप में बस एक फ्रेम दिखाएं।

vSurface.SeekTo(100);

SvVideoView.seekTo (स्थिति) का प्रयोग करें।

5 (एमएस) के भीतर स्थिति दें।

onPause():
position=svVideoView.getCurrentPosition()

onResume():
svVideoView.seekTo(position);






android-videoview