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();
}
我按照这个 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();
}