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; } } }
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(); }
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); }
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); } } }
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; } }
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'"); } }
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; }
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; } }
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); }
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; }); }); } }