public MvxVideoPlayer(IRendererBuilder rendererBuilder) { _rendererBuilder = rendererBuilder; _player = ExoPlayerFactory.NewInstance(RendererCount, 1000, 5000); _player.AddListener(this); _playerControl = new PlayerControl(_player); _mainHandler = new Handler(); _listeners = new List <IListener>(); _lastReportedPlaybackState = StateIdle; _rendererBuildingState = RendererBuildingStateIdle; // Disable text initially. _player.SetSelectedTrack(TypeText, TrackDisabled); }
public MvxVideoPlayer(IRendererBuilder rendererBuilder) { _rendererBuilder = rendererBuilder; _player = ExoPlayerFactory.NewInstance(RendererCount, 1000, 5000); _player.AddListener(this); _playerControl = new PlayerControl(_player); _mainHandler = new Handler(); _listeners = new List<IListener>(); _lastReportedPlaybackState = StateIdle; _rendererBuildingState = RendererBuildingStateIdle; // Disable text initially. _player.SetSelectedTrack(TypeText, TrackDisabled); }
/// <summary> /// Properly cleanup of your player by releasing resources /// </summary> public override void OnDestroy() { var activityManager = (ActivityManager)this.ApplicationContext.GetSystemService(ActivityService); var lastTasks = activityManager.GetRunningTasks(1); if (lastTasks?.FirstOrDefault() != null && lastTasks.FirstOrDefault().TopActivity != null && lastTasks.FirstOrDefault().TopActivity.PackageName != null && lastTasks.FirstOrDefault().TopActivity.PackageName != "net.fildo.app") { Process.KillProcess(Process.MyPid()); } base.OnDestroy(); if (Player != null) { Player.Release(); Player = null; } }
/// <summary> /// For a good user experience we should account for when audio focus has changed. /// There is only one audio output there may be several media services trying to use it so /// we should act correctly based on this. "duck" to be quiet and when we gain go full. /// All applications are encouraged to follow this, but are not enforced. /// </summary> /// <param name="focusChange"></param> public void OnAudioFocusChange(AudioFocus focusChange) { Log.Debug(TAG, "StreamingBackgroundService.OnAudioFocusChange() focusChange = " + focusChange); switch (focusChange) { case AudioFocus.Gain: Log.Debug(TAG, "AudioFocus.Gain"); if (mediaPlayer == null) { mediaPlayer = ExoPlayerFactory.NewInstance(1); } if (!IsPlaying) { Play(source); MessagingCenter.Send<PlayerStartedMessage>(new PlayerStartedMessage(), "PlayerStarted"); } mediaPlayer.SendMessage(audioRenderer, MediaCodecAudioTrackRenderer.MsgSetVolume, 1.0f); break; case AudioFocus.Loss: Log.Debug(TAG, "AudioFocus.Loss"); Stop(); MessagingCenter.Send<PlayerStoppedMessage>(new PlayerStoppedMessage(), "PlayerStopped"); break; case AudioFocus.LossTransient: Log.Debug(TAG, "AudioFocus.LossTransient"); // We have lost focus for a short time, but likely to resume Stop(); MessagingCenter.Send<PlayerStoppedMessage>(new PlayerStoppedMessage(), "PlayerStopped"); break; case AudioFocus.LossTransientCanDuck: // We have lost focus but should till play at a muted 10% volume Log.Debug(TAG, "AudioFocus.LossTransientCanDuck"); if (IsPlaying) { mediaPlayer.SendMessage(audioRenderer, MediaCodecAudioTrackRenderer.MsgSetVolume, 0.1f); } break; } }
private async void Play() { try { if ((CurrentTrack == null) && (CurrentTrackId == null)) { if (Queue.Count > 0) { Song firstOrDefault = Queue.FirstOrDefault(); if (firstOrDefault != null) { CurrentTrack = firstOrDefault.Url; CurrentTrackId = firstOrDefault.Id; } else { CurrentTrack = null; CurrentTrackId = null; } } else { return; } } Song currentSong = Queue.FirstOrDefault(p => p.Url == CurrentTrack); if (currentSong == null || CurrentTrack == null) { currentSong = Queue.FirstOrDefault(p => p.Id == CurrentTrackId); } Player?.Stop(); Player = null; if (this.paused && Player != null) { this.paused = false; //We are simply paused so just start again Player.PlayWhenReady = true; if (currentSong != null) { if (!string.IsNullOrEmpty(currentSong.Artist) && !string.IsNullOrEmpty(currentSong.Title)) { this.StartForeground(currentSong.Artist + " - " + currentSong.Title); } else if (!string.IsNullOrEmpty(currentSong.Artist)) { this.StartForeground(currentSong.Artist); } else if (!string.IsNullOrEmpty(currentSong.Title)) { this.StartForeground(currentSong.Title); } } this.RegisterRemoteClient(); this.remoteControlClient.SetPlaybackState(RemoteControlPlayState.Playing); this.UpdateMetadata(); return; } if (Player == null) { this.IntializePlayer(); } if (Player.PlayWhenReady) { this.Stop(); } else { //Player.Reset(); this.paused = false; this.StopForeground(true); this.ReleaseWifiLock(); } this.starting = true; var netEase = Mvx.Resolve <INetEase>(); var newSong = new SongNetease { Artist = currentSong.Artist, Title = currentSong.Title, Url = CurrentTrack, Id = currentSong.Id }; if (string.IsNullOrEmpty(newSong.Url)) { var tempsong = await netEase.GetSong(newSong.Id); if (tempsong != null) { tempsong.Id = newSong.Id; tempsong.Title = newSong.Title; tempsong.Artist = newSong.Artist; newSong = tempsong; } } var currenTrackToPlay = (await netEase.FixUrl(newSong, true)).Url; Dictionary <string, string> headers = new Dictionary <string, string>(); if (currenTrackToPlay.StartsWith("http://221.228.64.228/")) { headers.Add("Host", "m1.music.126.net"); } headers.Add( "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"); var trackUrl = Uri.Parse(currenTrackToPlay); FrameworkSampleSource sampleSource = new FrameworkSampleSource(Main, trackUrl, headers); TrackRenderer aRenderer = new MediaCodecAudioTrackRenderer(sampleSource, MediaCodecSelector.Default); if (QueueChanged != null) { QueueChanged(this, new EventArgs()); } var focusResult = this.audioManager.RequestAudioFocus(this, Stream.Music, AudioFocus.Gain); if (focusResult != AudioFocusRequest.Granted) { //could not get audio focus Console.WriteLine("Could not get audio focus"); } Player.Prepare(aRenderer); Player.PlayWhenReady = true; this.AquireWifiLock(); if (currentSong != null) { if (!string.IsNullOrEmpty(currentSong.Artist) && !string.IsNullOrEmpty(currentSong.Title)) { this.StartForeground(currentSong.Artist + " - " + currentSong.Title); } else if (!string.IsNullOrEmpty(currentSong.Artist)) { this.StartForeground(currentSong.Artist); } else if (!string.IsNullOrEmpty(currentSong.Title)) { this.StartForeground(currentSong.Title); } } this.RegisterRemoteClient(); this.remoteControlClient.SetPlaybackState(RemoteControlPlayState.Buffering); this.UpdateMetadata(); } catch { // ignored } }
private void IntializePlayer() { Player = ExoPlayerFactory.NewInstance(1); //Tell our player to sream music //ExoPlayer.SetAudioStreamType(Stream.Music); //Wake mode will be partial to keep the CPU still running under lock screen //ExoPlayer.SetWakeMode(ApplicationContext, WakeLockFlags.Partial); //When we have prepared the song start playback /*ExoPlayer.Prepared += (sender, args) => { * if (remoteControlClient != null) * { * remoteControlClient.SetPlaybackState(RemoteControlPlayState.Playing); * } * if (prepared != null) * { * prepared(this, 0); * } * UpdateMetadata(); * starting = false; * Player.Start(); * };*/ //TODO EXOPLAYER Task.Run( async() => { while (true) { try { if ((posChanged != null) && (Player != null)) { if (Player.CurrentPosition > 0 && Player.Duration > 0) { posChanged(this, Player.CurrentPosition); } } if ((percentChanged != null) && (Player != null)) { if (Player.CurrentPosition > 0 && Player.Duration > 0) { int percent = (int)(Player.CurrentPosition * 100 / Player.Duration); percentChanged(this, percent); } } await Task.Delay(100); } catch { // ignored } } }); Player.AddListener(this); //When we have reached the end of the song stop ourselves, however you could signal next track here. /* * Player.Error += async (sender, args) => * { * Player.Reset(); * await Task.Delay(500); * if (Player.IsPlaying) * { * return; * } * if (errorCounter <3) * { * errorCounter++; * this.Play(); * } * else * { * errorCounter = 0; * if (remoteControlClient != null) * remoteControlClient.SetPlaybackState(RemoteControlPlayState.Error); * //playback error * Console.WriteLine("Error in playback resetting: " + args.What); * Stop();//this will clean up and reset properly. * Next(); * } * }; */ }
public MediaSessionConnectorPlaybackPreparer(IExoPlayer player, ConcatenatingMediaSource mediaSource) { _player = player; _mediaSource = mediaSource; }
private void Play(string source) { Log.Debug(TAG, "StreamingBackgroundService.Play()"); var focusResult = audioManager.RequestAudioFocus(this, Stream.Music, AudioFocus.Gain); Log.Debug(TAG, "StreamingBackgroundService.Play() RequestAudioFocus result: " + focusResult); if (focusResult == AudioFocusRequest.Granted) { if (mediaPlayer == null) { mediaPlayer = ExoPlayerFactory.NewInstance(1); } RegisterReceiver(headphonesUnpluggedReceiver, new IntentFilter(AudioManager.ActionAudioBecomingNoisy)); Log.Debug(TAG, "RegisterReceiver for headphones unplugged"); String userAgent = ExoPlayerUtil.GetUserAgent (this, "ExoPlayerDemo"); Android.Net.Uri soundString = Android.Net.Uri.Parse(source); var allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE); var dataSource = new DefaultUriDataSource(this, userAgent); ExtractorSampleSource sampleSource = new ExtractorSampleSource(soundString, dataSource, allocator, BUFFER_SEGMENT_COUNT * BUFFER_SEGMENT_SIZE); audioRenderer = new MediaCodecAudioTrackRenderer (sampleSource, MediaCodecSelector.Default); mediaPlayer.Prepare(audioRenderer); mediaPlayer.PlayWhenReady = true; IsPlaying = true; AquireWifiLock(); StartForeground(); } }