public async Task Play(IMediaFile mediaFile = null) { if (mediaFile != null) { nsUrl = new NSUrl(mediaFile.Url); } if (Status == MediaPlayerStatus.Paused) { Status = MediaPlayerStatus.Playing; //We are simply paused so just start again Player.Play(); return; } try { // Start off with the status LOADING. Status = MediaPlayerStatus.Buffering; var options = MediaFileUrlHelper.GetOptionsWithHeaders(RequestHeaders); var nsAsset = AVUrlAsset.Create(nsUrl, options); var streamingItem = AVPlayerItem.FromAsset(nsAsset); Player.CurrentItem?.RemoveObserver(this, new NSString("status")); Player.ReplaceCurrentItemWithPlayerItem(streamingItem); streamingItem.AddObserver(this, new NSString("status"), NSKeyValueObservingOptions.New, Player.Handle); streamingItem.AddObserver(this, new NSString("loadedTimeRanges"), NSKeyValueObservingOptions.Initial | NSKeyValueObservingOptions.New, Player.Handle); Player.CurrentItem.SeekingWaitsForVideoCompositionRendering = true; Player.CurrentItem.AddObserver(this, (NSString)"status", NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Initial, StatusObservationContext.Handle); NSNotificationCenter.DefaultCenter.AddObserver(AVPlayerItem.DidPlayToEndTimeNotification, notification => MediaFinished?.Invoke(this, new MediaFinishedEventArgs(mediaFile)), Player.CurrentItem); Player.Play(); } catch (Exception ex) { OnMediaFailed(); Status = MediaPlayerStatus.Stopped; //unable to start playback log error Console.WriteLine("Unable to start playback: " + ex); } await Task.CompletedTask; }
private AVPlayerItem GetPlayerItem(NSUrl url) { AVAsset asset; if (RequestHeaders != null && RequestHeaders.Any()) { var options = MediaFileUrlHelper.GetOptionsWithHeaders(RequestHeaders); asset = AVUrlAsset.Create(url, options); } else { asset = AVAsset.FromUrl(url); } var playerItem = AVPlayerItem.FromAsset(asset); return(playerItem); }