Xamarin Forms Android 视频 (VideoView) 页面加载或返回键 + 循环时出现黑色闪烁

Xamarin Forms Android video (VideoView) black flash on page load or back key + looping

我按照这个 guide/copied 此处的示例以 Xamarin 形式为 iOS 和 Android 实现视频播放器:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/custom-renderer/video-player/

视频播放器工作正常,但在页面加载时它会很快闪烁黑色。同样,当返回时,它会很快在上一页前面闪烁视频播放器。

你可以试试: videoView.setZOrderOnTop(true); 但这给我带来了其他页面的问题,即使视频不在 xaml 中,视频仍然存在。

编辑:您可以执行以下所有操作或使用新的 Xamarin.Forms MediaElement 开箱即用。请记住,MediaElement 尚不能与 StackLayout 一起使用。

Mediaelement does not work within a stacklayout #2780

[Bug] MediaElement doesn't like being inside a StackLayout (particularly on Android)

为了解决这个问题并在 Xamarin Forms 中集成循环(假设您遵循了原始 post 中的指南):

将下面的代码添加到 OnElementChanged() 函数的末尾

videoView.SetOnPreparedListener(new VideoLoop(videoView));

创建视频循环class(我也想循环)



using Android.Graphics;
using Android.Media;
using Android.Views;
using Android.Widget;
using YOURPROJECTHERE.Droid.FormsVideoLibrary;
using Java.Lang;
using System.Threading.Tasks;

namespace FormsVideoLibrary.Droid
{
    public class VideoLoop : Java.Lang.Object, Android.Media.MediaPlayer.IOnPreparedListener
    {
        VideoView Video;
        public VideoLoop(VideoView video)
        {
            Video = video;
            Video.SetBackgroundColor(Android.Graphics.Color.White);
        }

        public void OnPrepared(MediaPlayer mp)
        {
            mp.SetOnInfoListener(new OnInfo(Video));

            //Remove or comment the line below if you don't want to loop
            mp.Looping = true;
            mp.Start();
        }
    }
}

现在我们在推送第一帧时使背景颜色透明(不是在 OnPrepared 时,因为此时它仍在缓冲):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.Media;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

namespace YOURPOJECTNAMESPACE.Droid.FormsVideoLibrary
{
    class OnInfo : Java.Lang.Object, Android.Media.MediaPlayer.IOnInfoListener
    {
        VideoView Video;
        public OnInfo(VideoView video)
        {
            Video = video;
        }
        
        bool MediaPlayer.IOnInfoListener.OnInfo(MediaPlayer mp, MediaInfo what, int extra)
        {

            if (what == MediaInfo.VideoRenderingStart)
            {
                // video started; hide the placeholder.
                Video.SetBackgroundColor(Android.Graphics.Color.Transparent);
                return true;
            }
            return false;
        }
    }
}

我还在 VideoRenderer 的 OnStopRequested 函数中添加了以下内容 class。

        void OnStopRequested(object sender, EventArgs args)
        {
            videoView.StopPlayback();
            videoView.SetBackgroundColor(Android.Graphics.Color.White);
        }

然后最后回到表单公共项目xaml.cs在每个页面上添加下面的视频:

 protected override void OnAppearing()
        {
            xNAMEOFYOURVIDEO.Play();           
            xNAMEOFYOURVIDEO.Source = new ResourceVideoSource
                {
                    Path = "yourfile.mp4"
                };
        }

  protected override void OnDisappearing()
        {
            xNAMEOFYOURVIDEO.Stop();
        }