第11回 曲名/アーティスト名を表示する

今回はmp3/m4aファイルに含まれる曲名とアーティスト名を取得/表示します。

タグ情報の取得にはTagLib# PortableThe MIT License)を利用しました。
このライブラリはメモリーストリームなどからもタグ情報を読み取れるようで、かなり使い勝手がよさそうです。

「プロジェクト」メニューにある「NuGetパッケージの管理」を開き、「オンライン」で「taglib」を検索します。
そしてヒットした中から「TagLib# Portable」をインストールします。

		/// <summary>
		/// 曲を再生する
		/// </summary>
		void Play(bool bPlayNext = true)
		{
			if (_liststrFiles.Count == 0)
				return;

			if (bPlayNext || _listPlayHistory.Count == 0)
			{
				//次の曲を再生する
				if (_nCurrentIndex >= 0)
				{
					_listPlayHistory.Add(_nCurrentIndex);					//今の曲を履歴として保存
					if (_listPlayHistory.Count > 100)						//履歴の最大保存数は100
						_listPlayHistory.RemoveAt(0);
				}

				_nCurrentIndex = GetNextIndex();
			}
			else
			{
				//前の曲を再生する
				if (_nCurrentIndex >= 0)
					_listPlayNext.Insert(0, _nCurrentIndex);					//今の曲を次の曲として保存
				_nCurrentIndex = _listPlayHistory[_listPlayHistory.Count - 1];	//一番最新の履歴曲を今の曲とする
				_listPlayHistory.RemoveAt(_listPlayHistory.Count - 1);			//一番最新の履歴曲を削除
			}

			_mediaPlayer.URL = _liststrFiles[_nCurrentIndex];			//最初の再生曲をセット
			_mediaPlayer.controls.play();

			//追加
			//曲名/タイトルの表示
			{
				string strTitle;
				string strArtist;
				string strAlbum;

				GetMp3Info(_liststrFiles[_nCurrentIndex], out strTitle, out strArtist, out strAlbum);

				labelTitle.Text = strTitle;
				labelArtist.Text = strArtist;
			}
		}



		/// <summary>
		/// 次の再生曲インデックスを決める
		/// </summary>
		int GetNextIndex()
		{
			if (_liststrFiles.Count == 0)
				return -1;

			int nIndex;
			Random rnd = new Random(Environment.TickCount);

			while (true)
			{
				if (_listPlayNext.Count == 0)
				{
					//未来の曲リストが空ならランダムで曲を決定
					nIndex = rnd.Next(0, _liststrFiles.Count);
				}
				else
				{
					//未来の曲リストから次の曲を決定
					nIndex = _listPlayNext[0];
					_listPlayNext.RemoveAt(0);
				}

				//同じ曲は連続で演奏しない
				if (nIndex == _nCurrentIndex)
					continue;

				break;
			}

			return nIndex;
		}



		/// <summary>
		/// フォルダ内のファイルを一覧して返す
		/// </summary>
		List<string> EnumFiles(string strFolder)
		{
			List<string> ret = new List<string>();

			//指定フォルダ以下の全子フォルダから全ファイルを抜き出す
			IEnumerable<string> listFiles = Directory.EnumerateFiles(strFolder, "*.*", SearchOption.AllDirectories);

			foreach (string strFile in listFiles)
			{
				//見つかったファイルの拡張子を取り出し
				string strExt = Path.GetExtension(strFile).ToLower();
				if (strExt == "")
					continue;

				//mp3/m4a以外なら無視
				if (strExt != ".mp3" && strExt != ".m4a")
					continue;

				ret.Add(strFile);
			}

			return ret;
		}



		private void buttonPlay_Click(object sender, EventArgs e)
		{
			if (_mediaPlayer.playState == WMPPlayState.wmppsPlaying)
				_mediaPlayer.controls.pause();
			else if (_nCurrentIndex >= 0)
				_mediaPlayer.controls.play();
		}

		private void buttonStop_Click(object sender, EventArgs e)
		{
			if (_mediaPlayer.playState == WMPPlayState.wmppsPlaying || _mediaPlayer.playState == WMPPlayState.wmppsPaused)
			{
				_bStopButtonPushed = true;
				_mediaPlayer.controls.stop();
			}
		}

		private void buttonNext_Click(object sender, EventArgs e)
		{
			Play();
		}

		private void buttonBack_Click(object sender, EventArgs e)
		{
			Play(false);		//前の曲を再生
		}





		//追加
		/// <summary>
		/// MP3ファイルからの曲名情報取得
		/// 
		/// TagLib# Portable利用
		/// https://github.com/timheuer/taglib-sharp-portable
		/// </summary>
		public static bool GetMp3Info(string strFile, out string strTitle, out string strArtist, out string strAlbum)
		{
			strArtist = "";
			strTitle = "";
			strAlbum = "";
			try
			{
				using (FileStream fs = new FileStream(strFile, FileMode.Open, FileAccess.Read))
				{
					AudioFileAbstraction abstraction = new AudioFileAbstraction(strFile, fs);

					using (TagLib.File file = TagLib.File.Create(abstraction))
					{
						strTitle = file.Tag.Title;
						strAlbum = file.Tag.Album;
						strArtist = file.Tag.FirstPerformer;

						if (strArtist == null || strArtist == "")
						{
							if (file.Tag.AlbumArtists.Length > 0)
								strArtist = file.Tag.AlbumArtists[0];
						}

						if (strArtist == null || strArtist == "")
							strArtist = file.Tag.FirstArtist;		//古いのも使う
						if (strArtist == null || strArtist == "")
							strArtist = file.Tag.FirstComposer;
						if (strArtist == null || strArtist == "")
							strArtist = file.Tag.JoinedAlbumArtists;

						file.Dispose();
					}
				}

				if (strArtist == null)
					strArtist = "";
				if (strTitle == null)
					strTitle = "";
				if (strAlbum == null)
					strAlbum = "";

				return true;
			}
			catch (Exception)
			{
			}
			strArtist = "";
			strTitle = "";
			strAlbum = "";
			return false;
		}


		//追加
		/// <summary>
		/// TagLibからの情報取得用
		/// </summary>
		class AudioFileAbstraction : TagLib.File.IFileAbstraction
		{
			string _strName = "";
			Stream _stream = null;

			public AudioFileAbstraction(string Name, Stream Stream)
			{
				_strName = Name;
				_stream = Stream;
			}

			void TagLib.File.IFileAbstraction.CloseStream(Stream stream)
			{
				stream.Close();
			}

			string TagLib.File.IFileAbstraction.Name
			{
				get { return _strName; }
			}

			Stream TagLib.File.IFileAbstraction.ReadStream
			{
				get { return _stream; }
			}

			Stream TagLib.File.IFileAbstraction.WriteStream
			{
				get { return _stream; }
			}
		}

プロジェクトファイルをダウンロード


カテゴリー「MP3プレーヤーを作る(C#)」 のエントリー