Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin表单:iOS如何编写简单的视频渲染器_Ios_Video_Xamarin_Xamarin.forms_Renderer - Fatal编程技术网

Xamarin表单:iOS如何编写简单的视频渲染器

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 { 公共视频视

我已经为android编写了一个简单的视频视图渲染器,尽管视频没有正确调整大小,但显示了视频和声音

我尝试了一个简单的iOS视频视图渲染器。当我用AVPlayer调用play时,屏幕上没有显示错误或视频

[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。查看控件您可以将解决方案作为答案发布并接受它。请这样做,以便搜索未回答问题的人不再发现此问题。谢谢