Xamarin表单:iOS如何编写简单的视频渲染器
我已经为android编写了一个简单的视频视图渲染器,尽管视频没有正确调整大小,但显示了视频和声音 我尝试了一个简单的iOS视频视图渲染器。当我用AVPlayer调用play时,屏幕上没有显示错误或视频Xamarin表单:iOS如何编写简单的视频渲染器,ios,video,xamarin,xamarin.forms,renderer,Ios,Video,Xamarin,Xamarin.forms,Renderer,我已经为android编写了一个简单的视频视图渲染器,尽管视频没有正确调整大小,但显示了视频和声音 我尝试了一个简单的iOS视频视图渲染器。当我用AVPlayer调用play时,屏幕上没有显示错误或视频 [assembly:ExportRenderer(typeof(VideoPlayer.VideoView), typeof(VideoViewRenderer))] 命名空间VideoPlayer.iOS { 公共类VideoViewRenderer:ViewRenderer { 公共视频视
[assembly:ExportRenderer(typeof(VideoPlayer.VideoView), typeof(VideoViewRenderer))]
命名空间VideoPlayer.iOS
{
公共类VideoViewRenderer:ViewRenderer
{
公共视频视图渲染器()
{
}
protected override void OnElementChanged(ElementChangedEventArgs<VideoView> e)
{
base.OnElementChanged(e);
if (Control == null)
{
var player = new AVPlayer();
var playerLayer = AVPlayerLayer.FromPlayer(player);
playerLayer.BackgroundColor = new CoreGraphics.CGColor(1.0f, 1.0f, 1.0f);
playerLayer.Frame = new CoreGraphics.CGRect(0, 0, 300, 300);
NativeView.Layer.AddSublayer(playerLayer);
}
if (e.OldElement != null)
{
// Unsubscribe from event handlers and cleanup any resources
e.OldElement.StartHandler -= Start;
e.OldElement.StopHandler -= Stop;
}
if (e.NewElement != null)
{
e.NewElement.StartHandler += Start;
e.NewElement.StopHandler += Stop;
}
}
void Start(object sender, EventArgs e)
{
string file = Path.Combine(NSBundle.MainBundle.BundlePath, "demo.mp4");
//var url = new NSUrl("http://www.androidbegin.com/tutorial/AndroidCommercial.3gp");
var asset = AVAsset.FromUrl(new NSUrl(file));
var playerItem = new AVPlayerItem(asset);
var playerLayer = ((AVPlayerLayer)Layer.Sublayers[0]);
var player = playerLayer.Player;
player.ReplaceCurrentItemWithPlayerItem(playerItem);
//if (player.Rate > 0.0f)
// player.Rate = 0.0f;
player.Play();
}
void Stop(object sender, EventArgs e)
{
var player = ((AVPlayerLayer)NativeView.Layer.Sublayers[0]).Player;
player.Rate = 0.0f;
}
public override void LayoutSubviews()
{
base.LayoutSubviews();
}
}
protected override void OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(Control==null)
{
var player=新的AVPlayer();
var playerLayer=AVPlayerLayer.FromPlayer(玩家);
playerLayer.BackgroundColor=新的CoreGraphics.CGColor(1.0f,1.0f,1.0f);
playerLayer.Frame=newcoregraphics.CGRect(0,0300300);
NativeView.Layer.AddSublayer(playerLayer);
}
if(e.OldElement!=null)
{
//取消订阅事件处理程序并清理任何资源
e、 OldElement.StartHandler-=开始;
e、 OldElement.StopHandler-=停止;
}
if(例如NewElement!=null)
{
e、 NewElement.StartHandler+=开始;
e、 NewElement.StopHandler+=停止;
}
}
无效开始(对象发送方,事件参数e)
{
字符串文件=Path.Combine(NSBundle.MainBundle.BundlePath,“demo.mp4”);
//var url=新的NSUrl(“http://www.androidbegin.com/tutorial/AndroidCommercial.3gp");
var asset=AVAsset.FromUrl(新的NSUrl(文件));
var playerItem=新的AVPlayerItem(资产);
var playerLayer=((AVPlayerLayer)Layer.Sublayers[0]);
var player=playerLayer.player;
player.replacementCurrentItemwithPlayerItem(playerItem);
//如果(玩家速率>0.0f)
//玩家速率=0.0f;
player.Play();
}
无效停止(对象发送方,事件参数e)
{
var player=((AVPlayerLayer)NativeView.Layer.Sublayers[0]).player;
玩家速率=0.0f;
}
公共覆盖无效布局子视图()
{
base.LayoutSubviews();
}
}
}
protected override void OnElementChanged(ElementChangedEventArgs<VideoView> e)
{
base.OnElementChanged(e);
if (Control == null)
{
var player = new AVPlayer();
var playerLayer = AVPlayerLayer.FromPlayer(player);
playerLayer.BackgroundColor = new CoreGraphics.CGColor(1.0f, 1.0f, 1.0f);
playerLayer.Frame = new CoreGraphics.CGRect(0, 0, 300, 300);
NativeView.Layer.AddSublayer(playerLayer);
}
if (e.OldElement != null)
{
// Unsubscribe from event handlers and cleanup any resources
e.OldElement.StartHandler -= Start;
e.OldElement.StopHandler -= Stop;
}
if (e.NewElement != null)
{
e.NewElement.StartHandler += Start;
e.NewElement.StopHandler += Stop;
}
}
void Start(object sender, EventArgs e)
{
string file = Path.Combine(NSBundle.MainBundle.BundlePath, "demo.mp4");
//var url = new NSUrl("http://www.androidbegin.com/tutorial/AndroidCommercial.3gp");
var asset = AVAsset.FromUrl(new NSUrl(file));
var playerItem = new AVPlayerItem(asset);
var playerLayer = ((AVPlayerLayer)Layer.Sublayers[0]);
var player = playerLayer.Player;
player.ReplaceCurrentItemWithPlayerItem(playerItem);
//if (player.Rate > 0.0f)
// player.Rate = 0.0f;
player.Play();
}
void Stop(object sender, EventArgs e)
{
var player = ((AVPlayerLayer)NativeView.Layer.Sublayers[0]).Player;
player.Rate = 0.0f;
}
public override void LayoutSubviews()
{
base.LayoutSubviews();
}
}
我是否错过了项目中的一些权限或设置。我知道我晚了一年左右,但我刚刚遇到了这个问题,并使其正常工作,希望这能帮助其他遇到这个问题的人 关键是要使用AVPlayerViewController。另外,确保你的URL也能正常工作。我有一段时间的网址不好,结果什么也没显示,当我意识到这就是问题所在时,我觉得自己像个白痴
if(Control == null)
{
AVPlayerViewController avpvc;
AVPlayer avp;
var url = NSUrl.FromString("SOME URL HERE"); //or NSUrl.FromFile
avp = new AVPlayer(url);
avpvc = new AVPlayerViewController();
avpvc.Player = avp;
avpvc.ShowsPlaybackControls = true;
avp.Play();
this.SetNativeControl(avpvc.View);
}
你开始演奏后有声音吗?没有。没有声音也没有视频…我只有声音。视频仍然没有显示。我没有设置NativeControl来显示视频。我添加了AVPlayerController。查看控件您可以将解决方案作为答案发布并接受它。请这样做,以便搜索未回答问题的人不再发现此问题。谢谢