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 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; }
private void PlayVideo() { var videoUrl = GetVideoUrl(Element.Source); if (videoUrl == null) { Console.WriteLine($"Video {Element.Source} not found"); return; } var itemToPlay = new AVPlayerItem(AVAsset.FromUrl(videoUrl)); _playerLooper = AVPlayerLooper.FromPlayer(_player, itemToPlay, CMTimeRange.InvalidRange); if (itemToPlay != null) { _player.Play(); } }
public void PhotoLibraryDidChange(PHChange changeInstance) { // Call might come on any background queue. Re-dispatch to the main queue to handle it. DispatchQueue.MainQueue.DispatchAsync(() => { // Check if there are changes to the asset we're displaying. PHObjectChangeDetails changeDetails = changeInstance.GetObjectChangeDetails(Asset); if (changeDetails == null) { return; } // Get the updated asset. var assetAfterChanges = changeDetails.ObjectAfterChanges as PHAsset; if (assetAfterChanges == null) { return; } Asset = (PHAsset)assetAfterChanges; if (Asset != null) { FavoriteButton.Title = Asset.Favorite ? "♥︎" : "♡"; } // If the asset's content changed, update the image and stop any video playback. if (changeDetails.AssetContentChanged) { UpdateContent(); playerLayer?.RemoveFromSuperLayer(); playerLayer = null; playerLooper = null; } }); }
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; }); }); } }