Пример #1
0
        private void TryDisposePlayer()
        {
            if (_player != null)
            {
                try
                {
                    _videoLayer.RemoveObserver(this, new NSString("videoRect"), _videoLayer.Handle);
                    _videoLayer.RemoveFromSuperLayer();

                    _player.CurrentItem?.RemoveObserver(this, new NSString("loadedTimeRanges"), _player.Handle);
                    _player.CurrentItem?.RemoveObserver(this, new NSString("status"), _player.Handle);
                    _player.CurrentItem?.RemoveObserver(this, new NSString("duration"), _player.Handle);
                    _player.RemoveObserver(this, new NSString("rate"), RateObservationContext.Handle);
                    _player.RemoveTimeObserver(_periodicTimeObserverObject);
                    _player.RemoveAllItems();
                }
                finally
                {
                    _itemFailedToPlayToEndTimeNotification?.Dispose();
                    _playbackStalledNotification?.Dispose();
                    _didPlayToEndTimeNotification?.Dispose();

                    _videoLayer?.Dispose();

                    _player?.CurrentItem?.Dispose();
                    _player?.Dispose();
                    _player = null;
                }
            }
        }
Пример #2
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            _closeButton = new UIBarButtonItem(Translation.general_close, UIBarButtonItemStyle.Plain, null);
            NavigationItem.LeftBarButtonItem = _closeButton;

            _avplayer                  = new AVQueuePlayer();
            _avplayerController        = new AVPlayerViewController();
            _avplayerController.Player = _avplayer;

            AddChildViewController(_avplayerController);
            View.AddSubview(_avplayerController.View);

            _avplayerController.View.Transform = CoreGraphics.CGAffineTransform.MakeRotation((nfloat)1.5708);
            ImageView.Transform = CoreGraphics.CGAffineTransform.MakeRotation((nfloat)1.5708);
            ImageView.Frame     = View.Frame;

            _avplayerController.View.Frame            = View.Frame;
            _avplayerController.ShowsPlaybackControls = false;

            // Bring spinner back to front
            View.BringSubviewToFront(LoadingSpinner);

            var set = this.CreateBindingSet <DisplayView, DisplayViewModel>();

            set.Bind(this).For(v => v.MediaUrl).To(vm => vm.MediaUrl);
            set.Bind(_closeButton).To(vm => vm.CloseCommand);
            set.Apply();
        }
Пример #3
0
        void InitVideoPlayer()
        {
            var path = Path.Combine(NSBundle.MainBundle.BundlePath, Element.Source);

            if (!NSFileManager.DefaultManager.FileExists(path))
            {
                Console.WriteLine("Video not exist");
                _videoPlayer = new AVPlayerViewController();
                _videoPlayer.ShowsPlaybackControls = false;
                _videoPlayer.Player.Volume         = 0;
                _videoPlayer.VideoGravity          = AVLayerVideoGravity.ResizeAspectFill;


                _videoPlayer.View.BackgroundColor = UIColor.Clear;
                SetNativeControl(_videoPlayer.View);
                return;
            }

            _queuePlayer = new AVQueuePlayer();

            // Load the video from the app bundle.
            NSUrl videoUrl = new NSUrl(path, false);


            // Create and configure the movie player.
            _videoPlayer = new AVPlayerViewController
            {
                View =
                {
                    Bounds           = Bounds,
                    AutoresizingMask = AutoresizingMask
                },
                Player = (Element.Loop)?_queuePlayer: new AVPlayer(videoUrl)
            };
            var playerItem = new AVPlayerItem(videoUrl);

            _videoPlayer.ShowsPlaybackControls = false;
            _videoPlayer.Player.Volume         = 0;
            _videoPlayer.VideoGravity          = AVLayerVideoGravity.ResizeAspectFill;
            _looper = new AVPlayerLooper(_queuePlayer, playerItem, CoreMedia.CMTimeRange.InvalidRange);

            _videoPlayer.View.BackgroundColor = UIColor.Clear;
            foreach (UIView subView in _videoPlayer.View.Subviews)
            {
                subView.BackgroundColor = UIColor.Clear;
            }

            if (Element.Loop)
            {
                _queuePlayer.Play();
            }
            else
            {
                _videoPlayer.Player.Play();
            }

            SetNativeControl(_videoPlayer.View);
        }
Пример #4
0
 public void NullAllowedTest()
 {
     using (var player = new AVQueuePlayer()) {
         using (var item = new AVPlayerItem(NSUrl.FromString("http://example.org"))) {
             player.CanInsert(item, null);
             player.InsertItem(item, null);
         }
     }
 }
Пример #5
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            if (string.IsNullOrEmpty(FilePath) || !File.Exists(FilePath))
            {
                NavigationController.PopViewController(true);
            }

            string taskType = Task.TaskType.IdName;

            if (taskType == "LISTEN_AUDIO" || taskType == "REC_AUDIO" || taskType == "TAKE_VIDEO")
            {
                // Load video, play and loop
                playerItem   = AVPlayerItem.FromUrl(NSUrl.FromFilename(FilePath));
                player       = AVQueuePlayer.FromItems(new AVPlayerItem[] { playerItem });
                playerLayer  = AVPlayerLayer.FromPlayer(player);
                playerLooper = AVPlayerLooper.FromPlayer(player, playerItem);

                if (taskType == "TAKE_VIDEO")
                {
                    playerLayer.Frame = View.Frame;
                    View.Layer.AddSublayer(playerLayer);
                }
                else
                {
                    ImageView.Hidden = true;
                    AudioIcon.Hidden = false;
                    DescLabel.Text   = Task.Description;
                }

                player.Play();
            }
            else
            {
                // Load image
                ImageService.Instance.LoadFile(FilePath).Error((e) =>
                {
                    Console.WriteLine("ERROR LOADING IMAGE: " + e.Message);
                    NavigationController.PopViewController(true);
                }).Into(ImageView);
            }

            if (DeleteResult != null)
            {
                UIBarButtonItem customButton = new UIBarButtonItem(
                    UIImage.FromFile("ic_delete"),
                    UIBarButtonItemStyle.Plain,
                    (s, e) =>
                {
                    ConfirmDelete();
                }
                    );

                NavigationItem.RightBarButtonItem = customButton;
            }
        }
Пример #6
0
        public void TestLoopingEnabled()
        {
            string file = Path.Combine(NSBundle.MainBundle.ResourcePath, "Hand.wav");

            Assert.True(File.Exists(file), file);
            using (var url = new NSUrl(file))
                using (var playerItem = AVPlayerItem.FromUrl(url))
                    using (AVQueuePlayer player = AVQueuePlayer.FromItems(new[] { playerItem }))
                        using (var playerLooper = AVPlayerLooper.FromPlayer(player, playerItem)) {
                            Assert.True(playerLooper.LoopingEnabled, "The default value should be true.");
                            playerLooper.DisableLooping();
                            Assert.False(playerLooper.LoopingEnabled, "Looping enabled should return false after 'DisableLooping'");
                        }
        }
Пример #7
0
        private void Play()
        {
            if (string.IsNullOrEmpty(MediaUrl))
            {
                LoadingSpinner.Hidden = true;
                return;
            }

            //f4v is not supported on iOS (thanks Apple)
            if (MediaUrl.EndsWith(".f4v", StringComparison.CurrentCultureIgnoreCase))
            {
                //Show alert
                LoadingSpinner.Hidden = true;
                _dialog.Show(Translation.alert_display_failed_title,
                             Translation.alert_display_failed_body,
                             Translation.general_close,
                             async() => { await ViewModel?.CloseCommand?.ExecuteAsync(); });
                return;
            }

            if (MediaUrl.EndsWith(".mp4", StringComparison.CurrentCultureIgnoreCase) ||
                MediaUrl.EndsWith(".m4v", StringComparison.CurrentCultureIgnoreCase))
            {
                ImageView.Hidden = true;

                NSUrl        url  = NSUrl.CreateFileUrl(MediaUrl, null);
                AVPlayerItem item = new AVPlayerItem(url);

                _avLooper = new AVPlayerLooper(_avplayer, item, CoreMedia.CMTimeRange.InvalidRange);
                _avplayer.ReplaceCurrentItemWithPlayerItem(item);
                _avplayer.Play();
            }
            else if (MediaUrl.EndsWith(".png", StringComparison.CurrentCultureIgnoreCase))
            {
                _avplayer.Dispose();
                _avplayer = null;

                _avplayerController.RemoveFromParentViewController();
                _avplayerController.View.RemoveFromSuperview();
                _avplayerController.Dispose();
                _avplayerController = null;

                UIImage image = UIImage.FromFile(MediaUrl);
                ImageView.Image = image;
            }


            LoadingSpinner.Hidden = true;
        }
Пример #8
0
        public override void ViewDidDisappear(bool animated)
        {
            base.ViewDidDisappear(animated);

            // Kill media and tidy up
            if (_avplayer != null)
            {
                _avplayer.Pause();
                _avplayer.Dispose();
                _avplayer = null;
            }

            if (_avplayerController != null)
            {
                _avplayerController.RemoveFromParentViewController();
                _avplayerController.View.RemoveFromSuperview();
                _avplayerController.Dispose();
                _avplayerController = null;
            }
        }
Пример #9
0
        private void InitializePlayer()
        {
            _player                  = new AVQueuePlayer();
            _videoLayer              = AVPlayerLayer.FromPlayer(_player);
            _videoLayer.Frame        = ((VideoSurface)RenderSurface).Frame;
            _videoLayer.VideoGravity = AVLayerVideoGravity.ResizeAspect;
            ((VideoSurface)RenderSurface).Layer.AddSublayer(_videoLayer);

            var avSession = AVAudioSession.SharedInstance();

            avSession.SetCategory(AVAudioSessionCategory.Playback);

            NSError activationError = null;

            avSession.SetActive(true, out activationError);
            if (activationError != null)
            {
                this.Log().WarnIfEnabled(() => $"Could not activate audio session: {activationError.LocalizedDescription}");
            }

            _videoLayer.AddObserver(this, new NSString("videoRect"), NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Initial, _videoLayer.Handle);
            _player.AddObserver(this, new NSString("rate"), NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Initial, RateObservationContext.Handle);

            _itemFailedToPlayToEndTimeNotification = AVPlayerItem.Notifications.ObserveItemFailedToPlayToEndTime((sender, args) => OnMediaFailed(new Exception(args.Error.LocalizedDescription)));
            _playbackStalledNotification           = AVPlayerItem.Notifications.ObservePlaybackStalled((sender, args) => OnMediaFailed());
            _didPlayToEndTimeNotification          = AVPlayerItem.Notifications.ObserveDidPlayToEndTime((sender, args) => OnMediaEnded(sender, args));

            _periodicTimeObserverObject = _player.AddPeriodicTimeObserver(new CMTime(1, 4), DispatchQueue.MainQueue, delegate
            {
                if (_player?.CurrentItem == null)
                {
                    return;
                }

                if (PlaybackSession.PlaybackState == MediaPlaybackState.Playing)
                {
                    PlaybackSession.PositionFromPlayer = Position;
                }
            });
        }
        private void InitPlayer()
        {
            if (Control != null)
            {
                return;
            }

            _player = new AVQueuePlayer
            {
                Muted           = true,
                ActionAtItemEnd = AVPlayerActionAtItemEnd.None
            };

            _playerViewController = new AVPlayerViewController
            {
                Player                = _player,
                VideoGravity          = AVLayerVideoGravity.ResizeAspectFill,
                ShowsPlaybackControls = false
            };

            SetNativeControl(_playerViewController.View);
        }
Пример #11
0
        partial void Play(NSObject sender)
        {
            // An AVPlayerLayer has already been created for this asset; just play it.
            if (playerLayer != null)
            {
                playerLayer.Player.Play();
            }
            else
            {
                var options = new PHVideoRequestOptions
                {
                    NetworkAccessAllowed = true,
                    DeliveryMode         = PHVideoRequestOptionsDeliveryMode.Automatic,
                    ProgressHandler      = (double progress, NSError error, out bool stop, NSDictionary info) =>
                    {
                        stop = false;

                        // Handler might not be called on the main queue, so re-dispatch for UI work.
                        DispatchQueue.MainQueue.DispatchSync(() =>
                        {
                            ProgressView.Progress = (float)progress;
                        });
                    }
                };

                // Request an AVAsset for the displayed PHAsset and set up a layer for playing it.
                PHImageManager.DefaultManager.RequestPlayerItem(Asset, options, (playerItem, info) =>
                {
                    DispatchQueue.MainQueue.DispatchSync(() =>
                    {
                        if (this.playerLayer != null || playerItem == null)
                        {
                            return;
                        }

                        // Create an AVPlayer and AVPlayerLayer with the AVPlayerItem.
                        AVPlayer player;

                        if (Asset.PlaybackStyle == PHAssetPlaybackStyle.VideoLooping)
                        {
                            var queuePlayer = AVQueuePlayer.FromItems(new[] { playerItem });
                            playerLooper    = AVPlayerLooper.FromPlayer(queuePlayer, playerItem);
                            player          = queuePlayer;
                        }
                        else
                        {
                            player = AVPlayer.FromPlayerItem(playerItem);
                        }

                        var playerLayer = AVPlayerLayer.FromPlayer(player);

                        // Configure the AVPlayerLayer and add it to the view.
                        playerLayer.VideoGravity = AVLayerVideoGravity.ResizeAspect;
                        playerLayer.Frame        = View.Layer.Bounds;
                        View.Layer.AddSublayer(playerLayer);

                        player.Play();

                        // Refer to the player layer so we can remove it later.
                        this.playerLayer = playerLayer;
                    });
                });
            }
        }