コード例 #1
0
 public async Task Pause()
 {
     lastPosition = VideoViewCanvas.CurrentPosition;
     VideoViewCanvas.Pause();
     Status = MediaPlayerStatus.Paused;
     await Task.CompletedTask;
 }
        public void UpdateNotifications(IMediaFile mediaFile, MediaPlayerStatus status)
        {
            try
            {
                var isPlaying    = status == MediaPlayerStatus.Playing || status == MediaPlayerStatus.Buffering;
                var isPersistent = status == MediaPlayerStatus.Playing || status == MediaPlayerStatus.Buffering || status == MediaPlayerStatus.Paused;
                var nm           = NotificationManagerCompat.From(_applicationContext);
                if (nm != null && _builder != null)
                {
                    SetMetadata(mediaFile);
                    AddActionButtons(isPlaying);
                    _builder.SetOngoing(isPersistent);

                    var notification = _builder.Build();
                    CheckSmallIconInMIUI(notification);

                    nm.Notify(_notificationId, notification);
                }
                else
                {
                    StartNotification(mediaFile, isPlaying, false);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                StopNotifications();
            }
        }
 public void UpdateNotifications(IMediaFile mediaFile, MediaPlayerStatus status)
 {
     try
     {
         var isPlaying = status == MediaPlayerStatus.Playing || status == MediaPlayerStatus.Buffering;
         var nm = NotificationManagerCompat.From(_appliactionContext);
         if (nm != null && _builder != null)
         {
             SetMetadata(mediaFile);
             AddActionButtons(isPlaying);
             _builder.SetOngoing(isPlaying);
             nm.Notify(MediaServiceBase.NotificationId, _builder.Build());
         }
         else
         {
             StartNotification(mediaFile, isPlaying, false);
         }
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.Message);
         StopNotifications();
     }
    
 }
コード例 #4
0
 public bool OnError(MediaPlayer mp, MediaError what, int extra)
 {
     Stop().Wait();
     Status = MediaPlayerStatus.Failed;
     OnMediaFailed(new MediaFailedEventArgs(what.ToString(), new System.Exception()));
     return(true);
 }
コード例 #5
0
        private int GetCompatValueByStatus(MediaPlayerStatus state)
        {
            switch (state)
            {
            case MediaPlayerStatus.Buffering:
                return(PlaybackStateCompat.StateBuffering);

            case MediaPlayerStatus.Failed:
                return(PlaybackStateCompat.StateError);

            case MediaPlayerStatus.Loading:
                return(PlaybackStateCompat.StateSkippingToQueueItem);

            case MediaPlayerStatus.Paused:
                return(PlaybackStateCompat.StatePaused);

            case MediaPlayerStatus.Playing:
                return(PlaybackStateCompat.StatePlaying);

            case MediaPlayerStatus.Stopped:
                return(PlaybackStateCompat.StateStopped);

            default:
                return(PlaybackStateCompat.StateNone);
            }
        }
コード例 #6
0
        public void OnPrepared(MediaPlayer mp)
        {
            if (Status == MediaPlayerStatus.Buffering)
            {
                VideoViewCanvas.Start();
            }

            Status = MediaPlayerStatus.Playing;
        }
コード例 #7
0
        private void ObserveRate()
        {
            var stoppedPlaying = Rate == 0.0;

            if (stoppedPlaying && Status == MediaPlayerStatus.Playing)
            {
                //Update the status becuase the system changed the rate.
                Status = MediaPlayerStatus.Paused;
            }
        }
コード例 #8
0
        public async Task Play(IMediaFile mediaFile = null)
        {
            var sameMediaFile = mediaFile == null || mediaFile.Equals(_currentMediaFile);

            if (Status == MediaPlayerStatus.Paused && sameMediaFile)
            {
                Status = MediaPlayerStatus.Playing;
                //We are simply paused so just start again
                Player.Play();
                return;
            }

            if (mediaFile != null)
            {
                nsUrl             = MediaFileUrlHelper.GetUrlFor(mediaFile);
                _currentMediaFile = mediaFile;
            }

            try
            {
                InitializePlayer();

                Status = MediaPlayerStatus.Buffering;

                var playerItem = GetPlayerItem(nsUrl);

                CurrentItem?.RemoveObserver(this, new NSString("status"));

                Player.ReplaceCurrentItemWithPlayerItem(playerItem);
                CurrentItem.AddObserver(this, new NSString("loadedTimeRanges"),
                                        NSKeyValueObservingOptions.Initial | NSKeyValueObservingOptions.New,
                                        LoadedTimeRangesObservationContext.Handle);

                CurrentItem.SeekingWaitsForVideoCompositionRendering = true;
                CurrentItem.AddObserver(this, (NSString)"status", NSKeyValueObservingOptions.New |
                                        NSKeyValueObservingOptions.Initial,
                                        StatusObservationContext.Handle);


                NSNotificationCenter.DefaultCenter.AddObserver(AVPlayerItem.DidPlayToEndTimeNotification,
                                                               notification => MediaFinished?.Invoke(this, new MediaFinishedEventArgs(mediaFile)), 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;
        }
コード例 #9
0
        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;
        }
コード例 #10
0
        public void OnPrepared(MediaPlayer mp)
        {
            Console.WriteLine($"OnPrepared: {Status}");

            _mediaPlayer = mp;

            if (Status == MediaPlayerStatus.Buffering)
            {
                VideoViewCanvas.Start();
            }

            Status = MediaPlayerStatus.Playing;
        }
コード例 #11
0
        private void UpdateStatus(MediaPlayerStatus status)
        {
            var item = new TutorialStatus()
            {
                Id            = string.Empty,
                LastAction    = Enum.GetName(typeof(MediaPlayerStatus), status),
                TutorialName  = "big buck bunny",
                LastPayedTime = FixTimeSpan(CrossMediaManager.Current.VideoPlayer.Position).ToString(@"hh\:mm\:ss")
            };
            var service = Locator.Instance.Resolve <ITutorialsService>();

            service.SaveVideoStatus(item);
        }
コード例 #12
0
        public VideoPlayerImplementation()
        {
            _status = MediaPlayerStatus.Stopped;

            // Watch the buffering status. If it changes, we may have to resume because the playing stopped because of bad network-conditions.
            BufferingChanged += (sender, e) =>
            {
                // If the player is ready to play, it's paused and the status is still on PLAYING, go on!
                if ((Player.Status == AVPlayerStatus.ReadyToPlay) && (Rate == 0.0f) &&
                    (Status == MediaPlayerStatus.Playing))
                    Player.Play();
            };
        }
コード例 #13
0
 private void ObserveStatus()
 {
     Console.WriteLine("Status Observed Method {0}", Player.Status);
     if ((Player.Status == AVPlayerStatus.ReadyToPlay) && (Status == MediaPlayerStatus.Buffering))
     {
         Status = MediaPlayerStatus.Playing;
         Player.Play();
     }
     else if (Player.Status == AVPlayerStatus.Failed)
     {
         OnMediaFailed();
         Status = MediaPlayerStatus.Stopped;
     }
 }
コード例 #14
0
        public async Task Play(IMediaFile mediaFile = null)
        {
            if (!IsReadyRendering)
            {
                //Android ViewRenderer might not initialize Control yet
                return;
            }

            if (isPlayerReady == false)
            {
                //await Task.Delay(100);
                Init();
                isPlayerReady = true;
            }

            if (mediaFile == null || (mediaFile != null && string.IsNullOrEmpty(mediaFile.Url)))
            {
                return;
            }

            if (mediaFile != null && CurrentFile != mediaFile)
            {
                CurrentFile = mediaFile;
                currentUri  = Android.Net.Uri.Parse(mediaFile.Url);
                VideoViewCanvas.StopPlayback();
                //VideoViewCanvas.Suspend();
                Status = MediaPlayerStatus.Stopped;
            }

            if (Status == MediaPlayerStatus.Paused)
            {
                //We are simply paused so just continue
                VideoViewCanvas.SeekTo(lastPosition);
                VideoViewCanvas.Start();

                Status = MediaPlayerStatus.Playing;
                return;
            }

            try
            {
                Status = MediaPlayerStatus.Buffering;
                VideoViewCanvas.SetVideoURI(currentUri, RequestHeaders);
            }
            catch (System.Exception ex)
            {
                OnMediaFailed(new MediaFailedEventArgs(ex.Message, ex));
                Status = MediaPlayerStatus.Stopped;
            }
        }
コード例 #15
0
        public AudioPlayerImplementation()
        {
            _status = MediaPlayerStatus.Stopped;

            // Watch the buffering status. If it changes, we may have to resume because the playing stopped because of bad network-conditions.
            BufferingChanged += (sender, e) =>
            {
                // If the player is ready to play, it's paused and the status is still on PLAYING, go on!
                if ((Player.Status == AVPlayerStatus.ReadyToPlay) && (Rate == 0.0f) &&
                    (Status == MediaPlayerStatus.Playing))
                {
                    Player.Play();
                }
            };
        }
コード例 #16
0
        public async Task PlayPause_NotPlaying_Pauses(MediaPlayerStatus notPlayingStatus)
        {
            _mediaManagerMock
            .Setup(mediaManager => mediaManager.Play((IMediaFile)null))
            .Returns(Task.FromResult(0));

            MediaManagerStatus = notPlayingStatus;

            var playbackController = new PlaybackController(MediaManager);

            await playbackController.PlayPause();

            _mediaManagerMock
            .Verify(mediaManager => mediaManager.Play((IMediaFile)null), Times.Once);
        }
コード例 #17
0
        public void Init()
        {
            Status = MediaPlayerStatus.Loading;

            if (UseNativeControls)
            {
                var mediaController = new MediaController(((VideoView)RenderSurface).Context);
                mediaController.SetAnchorView(VideoViewCanvas);
                VideoViewCanvas.SetMediaController(mediaController);
            }

            VideoViewCanvas.SetOnCompletionListener(this);
            VideoViewCanvas.SetOnErrorListener(this);
            VideoViewCanvas.SetOnPreparedListener(this);
            VideoViewCanvas.SetOnInfoListener(this);
        }
コード例 #18
0
        private void ObserveStatus()
        {
            Console.WriteLine("Status Observed Method {0}", CurrentItem.Status);

            var isBuffering = Status == MediaPlayerStatus.Buffering;

            if (CurrentItem.Status == AVPlayerItemStatus.ReadyToPlay && isBuffering)
            {
                Status = MediaPlayerStatus.Playing;
                Player.Play();
            }
            else if (CurrentItem.Status == AVPlayerItemStatus.Failed)
            {
                OnMediaFailed();
                Status = MediaPlayerStatus.Stopped;
            }
        }
コード例 #19
0
        public AudioPlayerImplementation(IVolumeManager volumeManager)
        {
            _volumeManager = volumeManager;
            _status = MediaPlayerStatus.Stopped;

            // Watch the buffering status. If it changes, we may have to resume because the playing stopped because of bad network-conditions.
            BufferingChanged += (sender, e) =>
            {
                // If the player is ready to play, it's paused and the status is still on PLAYING, go on!
                if ((Player.Status == AVPlayerStatus.ReadyToPlay) && (Rate == 0.0f) &&
                    (Status == MediaPlayerStatus.Playing))
                    Player.Play();
            };
            _volumeManager.Mute = _player.Muted;
            _volumeManager.CurrentVolume = _player.Volume;
            _volumeManager.MaxVolume = 1;
            _volumeManager.VolumeChanged += VolumeManagerOnVolumeChanged;
        }
コード例 #20
0
        void SendStatus()
        {
            if (hub == null || hub.State != HubConnectionState.Connected)
            {
                return;
            }

            MediaPlayerStatus status = new MediaPlayerStatus()
            {
                Hostname      = Environment.MachineName,
                LocalDateTime = DateTime.Now,
                MediaFiles    = mediaPlayer.GetPlayingMediaStatus()
            };

            var json = JsonConvert.SerializeObject(status);

            hub.InvokeAsync("StatusUpdate", json);
        }
コード例 #21
0
        public AudioPlayerImplementation(IVolumeManager volumeManager)
        {
            _volumeManager = volumeManager;
            _versionHelper = new VersionHelper();

            _status = MediaPlayerStatus.Stopped;

            InitializePlayer();

            // Watch the buffering status. If it changes, we may have to resume because the playing stopped because of bad network-conditions.
            BufferingChanged += (sender, e) =>
            {
                // If the player is ready to play, it's paused and the status is still on PLAYING, go on!
                var isPlaying = Status == MediaPlayerStatus.Playing;
                if (CurrentItem.Status == AVPlayerItemStatus.ReadyToPlay && Rate == 0.0f && isPlaying)
                {
                    Player.Play();
                }
            };
        }
コード例 #22
0
        public VideoPlayerImplementation(IVolumeManager volumeManager)
        {
            _volumeManager = volumeManager;
            _status        = MediaPlayerStatus.Stopped;

            // Watch the buffering status. If it changes, we may have to resume because the playing stopped because of bad network-conditions.
            BufferingChanged += (sender, e) =>
            {
                // If the player is ready to play, it's paused and the status is still on PLAYING, go on!
                if ((Player.Status == AVPlayerStatus.ReadyToPlay) && (Rate == 0.0f) &&
                    (Status == MediaPlayerStatus.Playing))
                {
                    Player.Play();
                }
            };
            _volumeManager.Mute           = Player.Muted;
            _volumeManager.CurrentVolume  = Player.Volume;
            _volumeManager.MaxVolume      = 1;
            _volumeManager.VolumeChanged += VolumeManagerOnVolumeChanged;
        }
コード例 #23
0
 public void UpdateNotifications(IMediaFile mediaFile, MediaPlayerStatus status)
 {
     try
     {
         var isPlaying = status == MediaPlayerStatus.Playing || status == MediaPlayerStatus.Buffering;
         var nm        = NotificationManagerCompat.From(_appliactionContext);
         if (nm != null && _builder != null)
         {
             SetMetadata(mediaFile);
             AddActionButtons(isPlaying);
             nm.Notify(MediaServiceBase.NotificationId, _builder.Build());
         }
         else
         {
             StartNotification(mediaFile, isPlaying, false);
         }
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.Message);
         StopNotifications();
     }
 }
コード例 #24
0
        public async Task Play(IMediaFile mediaFile = null)
        {
            if (VideoViewCanvas == null)
            {
                await Task.Delay(100);

                Init();
            }

            if (mediaFile != null)
            {
                CurrentFile = mediaFile;
                currentUri  = Android.Net.Uri.Parse(mediaFile.Url);
            }

            if (Status == MediaPlayerStatus.Paused)
            {
                Status = MediaPlayerStatus.Playing;
                //We are simply paused so just continue
                VideoViewCanvas.Resume();
                return;
            }

            try
            {
                Status = MediaPlayerStatus.Buffering;

                VideoViewCanvas.SetVideoURI(currentUri);
                VideoViewCanvas.Start();
                Status = MediaPlayerStatus.Playing;
            }
            catch (Exception ex)
            {
                MediaFailed?.Invoke(this, new MediaFailedEventArgs(ex.Message, ex));
                Status = MediaPlayerStatus.Stopped;
            }
        }
 public void UpdateNotifications(IMediaFile mediaFile, MediaPlayerStatus status)
 {
 }
コード例 #26
0
        public async Task Pause()
        {
			lastPosition = VideoViewCanvas.CurrentPosition;
            VideoViewCanvas.Pause();
            Status = MediaPlayerStatus.Paused;
            await Task.CompletedTask;
        }
コード例 #27
0
 private int GetCompatValueByStatus(MediaPlayerStatus state)
 {
     switch (state)
     {
         case MediaPlayerStatus.Buffering:
             return PlaybackStateCompat.StateBuffering;
         case MediaPlayerStatus.Failed:
             return PlaybackStateCompat.StateError;
         case MediaPlayerStatus.Loading:
             return PlaybackStateCompat.StateSkippingToQueueItem;
         case MediaPlayerStatus.Paused:
             return PlaybackStateCompat.StatePaused;
         case MediaPlayerStatus.Playing:
             return PlaybackStateCompat.StatePlaying;
         case MediaPlayerStatus.Stopped:
             return PlaybackStateCompat.StateStopped;
         default:
             return PlaybackStateCompat.StateNone;
     }
 }
コード例 #28
0
        public void Init()
        {
			Status = MediaPlayerStatus.Loading;

            if (UseNativeControls)
            {
                var mediaController = new MediaController(((VideoView)RenderSurface).Context);
                mediaController.SetAnchorView(VideoViewCanvas);
                VideoViewCanvas.SetMediaController(mediaController);
            }

            VideoViewCanvas.SetOnCompletionListener(this);
            VideoViewCanvas.SetOnErrorListener(this);
            VideoViewCanvas.SetOnPreparedListener(this);
            VideoViewCanvas.SetOnInfoListener(this);
        }
コード例 #29
0
        public AudioPlayerImplementation()
        {
            _player            = new MediaPlayer();
            _playProgressTimer = new Timer(state =>
            {
                if (_player.PlaybackSession.PlaybackState == MediaPlaybackState.Playing)
                {
                    var progress = _player.PlaybackSession.Position.TotalSeconds /
                                   _player.PlaybackSession.NaturalDuration.TotalSeconds;
                    if (double.IsNaN(progress))
                    {
                        progress = 0;
                    }
                    PlayingChanged?.Invoke(this, new PlayingChangedEventArgs(progress, _player.PlaybackSession.Position, _player.PlaybackSession.NaturalDuration));
                }
            }, null, 0, int.MaxValue);

            _player.MediaFailed += (sender, args) =>
            {
                _status = MediaPlayerStatus.Failed;
                _playProgressTimer.Change(0, int.MaxValue);
                MediaFailed?.Invoke(this, new MediaFailedEventArgs(args.ErrorMessage, args.ExtendedErrorCode));
            };

            _player.PlaybackSession.PlaybackStateChanged += (sender, args) =>
            {
                switch (sender.PlaybackState)
                {
                case MediaPlaybackState.None:
                    _playProgressTimer.Change(0, int.MaxValue);
                    break;

                case MediaPlaybackState.Opening:
                    Status = MediaPlayerStatus.Loading;
                    _playProgressTimer.Change(0, int.MaxValue);
                    break;

                case MediaPlaybackState.Buffering:
                    Status = MediaPlayerStatus.Buffering;
                    _playProgressTimer.Change(0, int.MaxValue);
                    break;

                case MediaPlaybackState.Playing:
                    if (sender.PlaybackRate <= 0 && sender.Position == TimeSpan.Zero)
                    {
                        Status = MediaPlayerStatus.Stopped;
                    }
                    else
                    {
                        Status = MediaPlayerStatus.Playing;
                        _playProgressTimer.Change(0, 50);
                    }
                    break;

                case MediaPlaybackState.Paused:
                    Status = MediaPlayerStatus.Paused;
                    _playProgressTimer.Change(0, int.MaxValue);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            };

            _player.MediaEnded += (sender, args) => { MediaFinished?.Invoke(this, new MediaFinishedEventArgs(_currentMediaFile)); };
            _player.PlaybackSession.BufferingProgressChanged += (sender, args) =>
            {
                var bufferedTime =
                    TimeSpan.FromSeconds(_player.PlaybackSession.BufferingProgress *
                                         _player.PlaybackSession.NaturalDuration.TotalSeconds);
                BufferingChanged?.Invoke(this,
                                         new BufferingChangedEventArgs(_player.PlaybackSession.BufferingProgress, bufferedTime));
            };

            _player.PlaybackSession.SeekCompleted += (sender, args) => { };
        }
コード例 #30
0
 public async Task Pause()
 {
     VideoViewCanvas.Pause();
     Status = MediaPlayerStatus.Paused;
     await Task.CompletedTask;
 }
コード例 #31
0
        public async Task Play(IMediaFile mediaFile = null)
        {
            if (VideoViewCanvas == null)
            {
                await Task.Delay(100);
                Init();
            }

            if (mediaFile != null)
            {
                CurrentFile = mediaFile;
                currentUri = Android.Net.Uri.Parse(mediaFile.Url);
            }

            if (Status == MediaPlayerStatus.Paused)
            {
                Status = MediaPlayerStatus.Playing;
                //We are simply paused so just continue
                VideoViewCanvas.Resume();
                return;
            }

            try
            {
                Status = MediaPlayerStatus.Buffering;

                VideoViewCanvas.SetVideoURI(currentUri);
                VideoViewCanvas.Start();
                Status = MediaPlayerStatus.Playing;
            }
            catch(Exception ex)
            {
                MediaFailed?.Invoke(this, new MediaFailedEventArgs(ex.Message, ex));
                Status = MediaPlayerStatus.Stopped;
            }
        }
 public void UpdateNotifications(IMediaFile mediaFile, MediaPlayerStatus status)
 {
 }
コード例 #33
0
 public async Task Stop()
 {
     VideoViewCanvas.StopPlayback();
     Status = MediaPlayerStatus.Stopped;
     await Task.CompletedTask;
 }
コード例 #34
0
        public bool OnError(MediaPlayer mp, MediaError what, int extra)
        {
			Stop().Wait();
            Status = MediaPlayerStatus.Failed;
			OnMediaFailed(new MediaFailedEventArgs(what.ToString(), new System.Exception()));
            return true;
        }
コード例 #35
0
        public void OnPrepared(MediaPlayer mp)
        {
			if(Status == MediaPlayerStatus.Buffering)
				VideoViewCanvas.Start();

            Status = MediaPlayerStatus.Playing;
        }
 public void UpdateNotifications(IMediaFile mediaFile, MediaPlayerStatus status)
 {
     UpdateInfoFromMediaFile(mediaFile);
 }
コード例 #37
0
 public StatusChangedEventArgs(MediaPlayerStatus status)
 {
     Status = status;
 }
コード例 #38
0
 public async Task Stop()
 {
     VideoViewCanvas.StopPlayback();
     Status = MediaPlayerStatus.Stopped;
     await Task.CompletedTask;
 }
コード例 #39
0
 public StatusChangedEventArgs(MediaPlayerStatus status)
 {
     Status = status;
 }
コード例 #40
0
        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 nsAsset = AVAsset.FromUrl(nsUrl);
                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);
            }
        }
        public override void UpdateNotifications(IMediaFile mediaFile, MediaPlayerStatus status)
        {
            TrySetNowPlayingInfo(mediaFile);

            base.UpdateNotifications(mediaFile, status);
        }
コード例 #42
0
 private void ObserveStatus()
 {
     Console.WriteLine("Status Observed Method {0}", Player.Status);
     if ((Player.Status == AVPlayerStatus.ReadyToPlay) && (Status == MediaPlayerStatus.Buffering))
     {
         Status = MediaPlayerStatus.Playing;
         Player.Play();
     }
     else if (Player.Status == AVPlayerStatus.Failed)
     {
         OnMediaFailed();
         Status = MediaPlayerStatus.Stopped;
     }
 }
コード例 #43
0
 public async Task Pause()
 {
     VideoViewCanvas.Pause();
     Status = MediaPlayerStatus.Paused;
     await Task.CompletedTask;
 }
コード例 #44
0
        public async Task Play(IMediaFile mediaFile = null)
        {
			if (VideoViewCanvas == null)
				throw new System.Exception("No canvas set for video to play in");

			if (isPlayerReady == false)
            {
                //await Task.Delay(100);
                Init();
				isPlayerReady = true;
            }

			if (mediaFile == null || (mediaFile != null && string.IsNullOrEmpty(mediaFile.Url)))
			{
				return;
			}

            if (mediaFile != null && CurrentFile != mediaFile)
            {
                CurrentFile = mediaFile;
                currentUri = Android.Net.Uri.Parse(mediaFile.Url);
				VideoViewCanvas.StopPlayback();
				//VideoViewCanvas.Suspend();
				Status = MediaPlayerStatus.Stopped;
            }

            if (Status == MediaPlayerStatus.Paused)
            {
				//We are simply paused so just continue
				VideoViewCanvas.SeekTo(lastPosition);
				VideoViewCanvas.Start();
				Status = MediaPlayerStatus.Playing;
                return;
            }

            try
            {
                Status = MediaPlayerStatus.Buffering;
				VideoViewCanvas.SetVideoURI(currentUri, RequestHeaders);
            }
            catch(System.Exception ex)
            {
				OnMediaFailed(new MediaFailedEventArgs(ex.Message, ex));
                Status = MediaPlayerStatus.Stopped;
            }
        }
 public void UpdateNotifications(IMediaFile mediaFile, MediaPlayerStatus status)
 {
     UpdateInfoFromMediaFile(mediaFile);
 }
コード例 #46
0
ファイル: FModMediaPlayer.cs プロジェクト: djeebus/MusicHub
 private void OnStatusChanged(MediaPlayerStatus status)
 {
     var handler = this.StatusChanged;
     if (handler != null)
         handler(this, new StatusEventArgs(status));
 }
コード例 #47
0
        public VideoPlayerImplementation(IVolumeManager volumeManager)
        {
            _volumeManager = volumeManager;
            _player = new MediaPlayer();

            _playProgressTimer = new Timer(state =>
            {
                if (_player.PlaybackSession.PlaybackState == MediaPlaybackState.Playing)
                {
                    var progress = _player.PlaybackSession.Position.TotalSeconds/
                                   _player.PlaybackSession.NaturalDuration.TotalSeconds;
                    if (double.IsNaN(progress))
                        progress = 0;
                    PlayingChanged?.Invoke(this, new PlayingChangedEventArgs(progress, _player.PlaybackSession.Position, _player.PlaybackSession.NaturalDuration));
                }
            }, null, 0, int.MaxValue);

            _player.MediaFailed += (sender, args) =>
            {
                _status = MediaPlayerStatus.Failed;
                _playProgressTimer.Change(0, int.MaxValue);
                MediaFailed?.Invoke(this, new MediaFailedEventArgs(args.ErrorMessage, args.ExtendedErrorCode));
            };

            _player.PlaybackSession.PlaybackStateChanged += (sender, args) =>
            {
                switch (sender.PlaybackState)
                {
                    case MediaPlaybackState.None:
                        _playProgressTimer.Change(0, int.MaxValue);
                        break;
                    case MediaPlaybackState.Opening:
                        Status = MediaPlayerStatus.Loading;
                        _playProgressTimer.Change(0, int.MaxValue);
                        break;
                    case MediaPlaybackState.Buffering:
                        Status = MediaPlayerStatus.Buffering;
                        _playProgressTimer.Change(0, int.MaxValue);
                        break;
                    case MediaPlaybackState.Playing:
                        if ((sender.PlaybackRate <= 0) && (sender.Position == TimeSpan.Zero))
                        {
                            Status = MediaPlayerStatus.Stopped;
                        }
                        else
                        {
                            Status = MediaPlayerStatus.Playing;
                            _playProgressTimer.Change(0, 50);
                        }
                        break;
                    case MediaPlaybackState.Paused:
                        Status = MediaPlayerStatus.Paused;
                        _playProgressTimer.Change(0, int.MaxValue);
                        break;
                    default:
                        throw new ArgumentOutOfRangeException();
                }
            };

            _player.MediaEnded += (sender, args) => { MediaFinished?.Invoke(this, new MediaFinishedEventArgs(_currentMediaFile)); };
            _player.PlaybackSession.BufferingProgressChanged += (sender, args) =>
            {
                var bufferedTime =
                    TimeSpan.FromSeconds(_player.PlaybackSession.BufferingProgress*
                                         _player.PlaybackSession.NaturalDuration.TotalSeconds);
                BufferingChanged?.Invoke(this,
                    new BufferingChangedEventArgs(_player.PlaybackSession.BufferingProgress, bufferedTime));
            };

            _player.PlaybackSession.SeekCompleted += (sender, args) => { };
            _player.MediaOpened += (sender, args) => { _loadMediaTaskCompletionSource.SetResult(true); };
            _volumeManager.CurrentVolume = (float)_player.Volume;
            _volumeManager.Mute = _player.IsMuted;
            _volumeManager.VolumeChanged += VolumeManagerOnVolumeChanged;
        }
コード例 #48
0
        public VideoPlayerImplementation(IVolumeManager volumeManager)
        {
            _volumeManager = volumeManager;
            _player        = new MediaPlayer();

            _playProgressTimer = new Timer(state =>
            {
                if (_player.PlaybackSession.PlaybackState == MediaPlaybackState.Playing)
                {
                    var progress = _player.PlaybackSession.Position.TotalSeconds /
                                   _player.PlaybackSession.NaturalDuration.TotalSeconds;
                    if (double.IsInfinity(progress))
                    {
                        progress = 0;
                    }
                    PlayingChanged?.Invoke(this, new PlayingChangedEventArgs(progress, _player.PlaybackSession.Position, _player.PlaybackSession.NaturalDuration));
                }
            }, null, 0, int.MaxValue);

            _player.MediaFailed += (sender, args) =>
            {
                _status = MediaPlayerStatus.Failed;
                _playProgressTimer.Change(0, int.MaxValue);
                MediaFailed?.Invoke(this, new MediaFailedEventArgs(args.ErrorMessage, args.ExtendedErrorCode));
            };

            _player.PlaybackSession.PlaybackStateChanged += (sender, args) =>
            {
                switch (sender.PlaybackState)
                {
                case MediaPlaybackState.None:
                    _playProgressTimer.Change(0, int.MaxValue);
                    break;

                case MediaPlaybackState.Opening:
                    Status = MediaPlayerStatus.Loading;
                    _playProgressTimer.Change(0, int.MaxValue);
                    break;

                case MediaPlaybackState.Buffering:
                    Status = MediaPlayerStatus.Buffering;
                    _playProgressTimer.Change(0, int.MaxValue);
                    break;

                case MediaPlaybackState.Playing:
                    if ((sender.PlaybackRate <= 0) && (sender.Position == TimeSpan.Zero))
                    {
                        Status = MediaPlayerStatus.Stopped;
                    }
                    else
                    {
                        Status = MediaPlayerStatus.Playing;
                        _playProgressTimer.Change(0, 50);
                    }
                    break;

                case MediaPlaybackState.Paused:
                    Status = MediaPlayerStatus.Paused;
                    _playProgressTimer.Change(0, int.MaxValue);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            };

            _player.MediaEnded += (sender, args) => { MediaFinished?.Invoke(this, new MediaFinishedEventArgs(_currentMediaFile)); };
            _player.PlaybackSession.BufferingProgressChanged += (sender, args) =>
            {
                var bufferedTime =
                    TimeSpan.FromSeconds(_player.PlaybackSession.BufferingProgress *
                                         _player.PlaybackSession.NaturalDuration.TotalSeconds);
                BufferingChanged?.Invoke(this,
                                         new BufferingChangedEventArgs(_player.PlaybackSession.BufferingProgress, bufferedTime));
            };

            _player.PlaybackSession.SeekCompleted += (sender, args) => { };
            _player.MediaOpened          += (sender, args) => { _loadMediaTaskCompletionSource.SetResult(true); };
            _volumeManager.CurrentVolume  = (float)_player.Volume;
            _volumeManager.Mute           = _player.IsMuted;
            _volumeManager.VolumeChanged += VolumeManagerOnVolumeChanged;
        }