コード例 #1
0
    private async Task PrepareAndPlayMediaPlayerAsync()
    {
        try
        {
            if (NativeVersion.IsAtLeast(21))
            {
                MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();

                await mediaPlayer.SetDataSourceAsync(ApplicationContext, AndroidNet.Uri.Parse(AudioUrl));

                await metaRetriever.SetDataSourceAsync(AudioUrl, new Dictionary <string, string>());

                var focusResult = audioManager.RequestAudioFocus(new AudioFocusRequestClass
                                                                 .Builder(AudioFocus.Gain)
                                                                 .SetOnAudioFocusChangeListener(this)
                                                                 .Build());

                if (focusResult != AudioFocusRequest.Granted)
                {
                    // Could not get audio focus
                    Console.WriteLine("Could not get audio focus");
                }

                UpdatePlaybackState(PlaybackStateCode.Buffering);
                mediaPlayer.PrepareAsync();

                AquireWifiLock();
                UpdateMediaMetadataCompat(metaRetriever);
                StartNotification();

                byte[] imageByteArray = metaRetriever.GetEmbeddedPicture();
                if (imageByteArray == null)
                {
                    Cover = await BitmapFactory.DecodeResourceAsync(Resources, Resource.Drawable.player_play);
                }
                else
                {
                    Cover = await BitmapFactory.DecodeByteArrayAsync(imageByteArray, 0, imageByteArray.Length);
                }
            }
        }
        catch (Exception ex)
        {
            UpdatePlaybackState(PlaybackStateCode.Stopped);

            mediaPlayer.Reset();
            mediaPlayer.Release();
            mediaPlayer = null;

            // Unable to start playback log error
            Console.WriteLine(ex);
        }
    }
コード例 #2
0
ファイル: SongMetadata.cs プロジェクト: ofirelarat/TubeLoad
        public static Drawable GetSongPicture(string id)
        {
            MediaMetadataRetriever metadata = GetMetadata(id);

            byte[] pictureByteArray = metadata.GetEmbeddedPicture();

            if (pictureByteArray != null)
            {
                return(new BitmapDrawable(Application.Context.Resources, BitmapFactory.DecodeByteArray(pictureByteArray, 0, pictureByteArray.Length)));
            }

            return(null);
        }
コード例 #3
0
        public void GetMetadata(string filepath)
        {
            MediaMetadataRetriever artistInfo = new MediaMetadataRetriever();

            artistInfo.SetDataSource(filepath);
            Album    = artistInfo.ExtractMetadata(MetadataKey.Album);
            Artist   = artistInfo.ExtractMetadata(MetadataKey.Artist);
            Genre    = artistInfo.ExtractMetadata(MetadataKey.Genre);
            Duration = artistInfo.ExtractMetadata(MetadataKey.Duration);
            try
            {
                byte[] art = artistInfo.GetEmbeddedPicture();
                Image = BitmapFactory.DecodeByteArray(art, 0, art.Length);
            }
            catch (Exception e)
            {
                Image = null;
            }
        }
コード例 #4
0
        public async Task <IMediaFile> ExtractMediaInfo(IMediaFile mediaFile)
        {
            if (mediaFile.MetadataExtracted)
            {
                return(mediaFile);
            }
            MediaMetadataRetriever metaRetriever = await GetMetadataRetriever(mediaFile);

            SetMetadata(mediaFile, metaRetriever);
            byte[] imageByteArray = null;
            try
            {
                imageByteArray = metaRetriever.GetEmbeddedPicture();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            if (imageByteArray == null)
            {
                mediaFile.Metadata.AlbumArt = GetTrackCover(mediaFile);
            }
            else
            {
                try
                {
                    mediaFile.Metadata.AlbumArt = await BitmapFactory.DecodeByteArrayAsync(imageByteArray, 0, imageByteArray.Length);
                }
                catch (Java.Lang.OutOfMemoryError)
                {
                    mediaFile.Metadata.AlbumArt = null;
                    throw;
                }
            }
            mediaFile.MetadataExtracted = true;
            return(mediaFile);
        }
コード例 #5
0
        private Bitmap GetCoverFromRetriever(MediaMetadataRetriever retriever)
        {
            var bytes = retriever.GetEmbeddedPicture();

            return(bytes == null ? null : BitmapFactory.DecodeByteArray(bytes, 0, bytes.Length));
        }
コード例 #6
0
        /// <summary>
        /// Intializes the player.
        /// </summary>
        public async Task Play()
        {
            if (mediaPlayer != null && MediaPlayerState == PlaybackStateCompat.StatePaused)
            {
                //We are simply paused so just start again
                mediaPlayer.Start();
                UpdatePlaybackState(PlaybackStateCompat.StatePlaying);
                StartNotification();

                //Update the metadata now that we are playing
                UpdateMediaMetadataCompat();
                return;
            }

            if (mediaPlayer == null)
            {
                InitializePlayer();
            }

            if (mediaSessionCompat == null)
            {
                InitMediaSession();
            }

            if (mediaPlayer.IsPlaying)
            {
                UpdatePlaybackState(PlaybackStateCompat.StatePlaying);
                return;
            }

            try {
                MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();

                await mediaPlayer.SetDataSourceAsync(ApplicationContext, Android.Net.Uri.Parse(audioUrl));

                await metaRetriever.SetDataSourceAsync(audioUrl, new Dictionary <string, string>());

                var focusResult = audioManager.RequestAudioFocus(this, Stream.Music, AudioFocus.Gain);
                if (focusResult != AudioFocusRequest.Granted)
                {
                    //could not get audio focus
                    Console.WriteLine("Could not get audio focus");
                }

                UpdatePlaybackState(PlaybackStateCompat.StateBuffering);
                mediaPlayer.PrepareAsync();

                AquireWifiLock();
                UpdateMediaMetadataCompat(metaRetriever);
                StartNotification();

                byte[] imageByteArray = metaRetriever.GetEmbeddedPicture();
                if (imageByteArray == null)
                {
                    Cover = await BitmapFactory.DecodeResourceAsync(Resources, Resource.Drawable.album_art);
                }
                else
                {
                    Cover = await BitmapFactory.DecodeByteArrayAsync(imageByteArray, 0, imageByteArray.Length);
                }
            } catch (Exception ex) {
                UpdatePlaybackState(PlaybackStateCompat.StateStopped);

                mediaPlayer.Reset();
                mediaPlayer.Release();
                mediaPlayer = null;

                //unable to start playback log error
                Console.WriteLine(ex);
            }
        }
コード例 #7
0
        protected async Task <IMediaItem> ExtractMediaInfo(MediaMetadataRetriever mediaMetadataRetriever, IMediaItem mediaItem)
        {
            if (string.IsNullOrEmpty(mediaItem.Album))
            {
                mediaItem.Album = mediaMetadataRetriever.ExtractMetadata(MetadataKey.Album);
            }

            if (string.IsNullOrEmpty(mediaItem.AlbumArtist))
            {
                mediaItem.AlbumArtist = mediaMetadataRetriever.ExtractMetadata(MetadataKey.Albumartist);
            }

            if (string.IsNullOrEmpty(mediaItem.Artist))
            {
                mediaItem.Artist = mediaMetadataRetriever.ExtractMetadata(MetadataKey.Artist);
            }

            if (string.IsNullOrEmpty(mediaItem.Author))
            {
                mediaItem.Author = mediaMetadataRetriever.ExtractMetadata(MetadataKey.Author);
            }

            var trackNumber = mediaMetadataRetriever.ExtractMetadata(MetadataKey.CdTrackNumber);

            if (!string.IsNullOrEmpty(trackNumber) && int.TryParse(trackNumber, out int trackNumberResult))
            {
                mediaItem.TrackNumber = trackNumberResult;
            }

            if (string.IsNullOrEmpty(mediaItem.Compilation))
            {
                mediaItem.Compilation = mediaMetadataRetriever.ExtractMetadata(MetadataKey.Compilation);
            }

            if (string.IsNullOrEmpty(mediaItem.Composer))
            {
                mediaItem.Composer = mediaMetadataRetriever.ExtractMetadata(MetadataKey.Composer);
            }

            if (string.IsNullOrEmpty(mediaItem.Date))
            {
                mediaItem.Date = mediaMetadataRetriever.ExtractMetadata(MetadataKey.Date);
            }

            var discNumber = mediaMetadataRetriever.ExtractMetadata(MetadataKey.DiscNumber);

            if (!string.IsNullOrEmpty(discNumber) && int.TryParse(discNumber, out int discNumberResult))
            {
                mediaItem.DiscNumber = discNumberResult;
            }

            var duration = mediaMetadataRetriever.ExtractMetadata(MetadataKey.Duration);

            if (!string.IsNullOrEmpty(duration) && int.TryParse(duration, out int durationResult))
            {
                mediaItem.Duration = TimeSpan.FromMilliseconds(durationResult);
            }

            if (string.IsNullOrEmpty(mediaItem.Genre))
            {
                mediaItem.Genre = mediaMetadataRetriever.ExtractMetadata(MetadataKey.Genre);
            }

            var numTracks = mediaMetadataRetriever.ExtractMetadata(MetadataKey.NumTracks);

            if (!string.IsNullOrEmpty(numTracks) && int.TryParse(numTracks, out int numTracksResult))
            {
                mediaItem.NumTracks = numTracksResult;
            }

            if (string.IsNullOrEmpty(mediaItem.Title))
            {
                mediaItem.Title = mediaMetadataRetriever.ExtractMetadata(MetadataKey.Title);
            }

            if (string.IsNullOrEmpty(mediaItem.Writer))
            {
                mediaItem.Writer = mediaMetadataRetriever.ExtractMetadata(MetadataKey.Writer);
            }

            var year = mediaMetadataRetriever.ExtractMetadata(MetadataKey.Year);

            if (!string.IsNullOrEmpty(year) && int.TryParse(year, out int yearResult))
            {
                mediaItem.Year = yearResult;
            }

            byte[] imageByteArray = null;
            try
            {
                imageByteArray = mediaMetadataRetriever.GetEmbeddedPicture();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            if (imageByteArray == null)
            {
                mediaItem.AlbumArt = GetTrackCover(mediaItem);
            }
            else
            {
                try
                {
                    mediaItem.AlbumArt = await BitmapFactory.DecodeByteArrayAsync(imageByteArray, 0, imageByteArray.Length);
                }
                catch (Java.Lang.OutOfMemoryError)
                {
                    mediaItem.AlbumArt = null;
                }
            }

            mediaItem.IsMetadataExtracted = true;
            return(mediaItem);
        }