65.9K
CodeProject 正在变化。 阅读更多。
Home

适用于 Opel Ampera 和 Chevy Volt 的 MP3 播放列表创建器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (8投票s)

2014 年 1 月 18 日

CPOL

3分钟阅读

viewsIcon

25072

downloadIcon

876

解释了Ampera和Volt中mp3播放器的问题,以及播放列表创建器如何解决这些问题。

背景

欧宝Ampera和雪佛兰Volt的多媒体娱乐系统在播放来自USB存储器和内置硬盘的MP3音轨时有一些特殊之处,例如它不识别Windows文件夹结构。当包含不同流派和专辑的mp3文件的文件夹被复制到Ampera的硬盘时;会显示一个平面的mp3和文件夹名称列表,但没有原始流派和专辑结构的迹象。例如,当我像下图一样整理音乐时,它将在Ampera的mp3播放器中被安排为文件夹和mp3名称的平面列表。

直接从USB存储器播放时,文件夹结构会被识别,但仍然留下一些奇怪之处。当播放列表文件与复制过程一起添加时,播放器会将其弄得一团糟。它不知道选择文件夹结构还是播放列表文件来显示mp3文件。当仅使用没有播放列表文件的文件夹结构时,再次会发生奇怪的事情,特别是当层级很深且文件夹数量大于大约50个时。例如,它会丢失mp3位置的跟踪,并且跳过一个mp3音轨可能会产生令人惊讶的效果,例如突然跳转到另一个专辑或跳回到同一张甚至另一张专辑的第一个mp3音轨。

在阅读了一些论坛后,我发现处理Ampera的mp3播放器的最佳方法是仅使用播放列表文件,并将所有mp3文件与播放列表一起复制到USB存储器的根目录。因为这是一个非常重复的过程,所以我制作了一个小程序来以更轻松的方式完成此操作。

应用程序

该应用程序的工作方式如下:选择一个mp3文件以文件夹层级样式排列的文件夹,例如Rock\British\Rolling Stones。选择一个目标文件夹,例如映射到USB存储器的驱动器,然后就可以开始了。该应用程序将创建所有播放列表文件,并将所有mp3音轨及其对应的播放列表文件复制到USB存储器,以便欧宝Ampera和雪佛兰Volt能够(显)示mp3音轨。

该应用程序使用UltraID3Lib来处理mp3音轨。一个非常简单且令人愉悦的库,用于读取和写入MP3文件中的ID3元数据。查看:UltraID3Lib

播放列表创建器的代码也非常简单,它以迭代方式读取所有文件夹并收集所有mp3数据。播放列表根据mp3数据所在的文件夹创建和命名。收集所有数据后,mp3音轨和相应的播放列表将复制到目标文件夹。

private string CreatePlayList(string folder)
{
	UltraID3 ultraId = new UltraID3();
	StringBuilder stringBuilder = new StringBuilder();

	string[] files = Directory.GetFiles(folder, "*.mp3", SearchOption.TopDirectoryOnly);
	if (files.Count() != 0)
	{
		ShowMessage(string.Format("Reading tracks from :  {0} ", folder));
		int entryNumber = 0;

		stringBuilder.AppendLine("[playlist]");

		foreach (string fileName in files)
		{
			ultraId.Read(@fileName);
			int lenght = Convert.ToInt32(ultraId.Duration.TotalSeconds);
			megaBytes = megaBytes + ultraId.Size / 1000000;

			if (megaBytes > maxNumberOfMB && maxNumberOfMB > -1)
			{
				numberOfMBExceeded = true;
				megaBytes = megaBytes - ultraId.Size / 1000000;
				break;
			}
			numberOfTracks = numberOfTracks + 1;
			if (numberOfTracks > maxNumberOfTracks && maxNumberOfTracks > -1)
			{
				numberOfTracksExceeded = true;
				numberOfTracks = numberOfTracks - 1;
				break;
			}
			entryNumber = entryNumber + 1;
			string title = ultraId.Title;
			stringBuilder.AppendLine(string.Format("File{0}={1}", 
				entryNumber, Path.GetFileName(fileName)));
			stringBuilder.AppendLine(string.Format("Title{0}={1}", entryNumber, title));
			stringBuilder.AppendLine(string.Format("Length{0}={1}", entryNumber, lenght));
		}
		stringBuilder.AppendLine(string.Format("NumberOfEntries={0}", entryNumber));
		stringBuilder.AppendLine("Version=2");
	}
	return stringBuilder.ToString();
}

仍然需要考虑一些Ampera/Volt mp3播放器的特殊性

  • 有时最多显示1000个音轨。
  • 每个播放列表最多显示200个音轨。

目前,该代码仅适用于mp3文件,但可以很容易地修改为使用其他音乐文件。最好的用法是创建相对较多的播放列表,每个播放列表的mp3音轨数量较少(少于100个)。这样做会让Ampera和Volt感到满意。

© . All rights reserved.