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

有声读物播放器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (34投票s)

2008 年 9 月 15 日

CPOL

6分钟阅读

viewsIcon

208783

downloadIcon

3560

专为收听有声读物设计的音频播放器

image01.JPG

引言

我是一个热情的有声书听众。我用我的 ASUS MyPal 639 来听有声书。大约两年前当我开始这个习惯时,我下载并测试了几乎所有市面上的播放器(包括专门的有声书播放器;比如 Audible 在你购买有声书时提供的那个)。我没有找到一款专门为有声书设计的播放器(有些能部分满足我的需求,但没有一个全部做到)。

由于我有一些编程背景,我决定开发自己的播放器 – abPlayer (audio-book player)。

以下是我希望我的播放器具备的主要功能:

多个播放列表(有声书)

我经常同时听几本书(以及音乐合集)。我希望能够定义无限数量的播放列表,并且播放器能够“记住”书的播放位置——在设备关机和软重启后(除硬重启外)都能保存“书签”。

日常操作无需触控笔

所有播放/暂停/下一首… 等功能都应该通过拇指粗细的按钮/菜单来访问,包括浏览书籍收藏和切换书籍。

定义一本书及其文件是在你将新书添加到播放器时才需要做的操作,我不介意在执行这些操作时使用触控笔。

在“盲操”模式下切换播放和暂停

当你听书时,如果因为某些原因分心,你最不想做的就是开始摸索设备寻找暂停按钮(你真的不想跳过几句话然后重新定位自己)。我希望播放器的大部分显示区域都能用作交替的播放/暂停开关面板。

音量和随机播放属性

不同的书以不同的音量朗读(和录制)。一旦你将一本书的音量调整到你喜欢的程度,你通常希望它在整本书中都保持不变。然而,一本书的音量对于另一本书来说很可能不合适。此外,我经常在随机播放(“shuffle”)功能开启的情况下听音乐合集,但这不适用于有声书。所以——

我希望音量和随机播放功能能够被设置为特定书籍的属性并被记住,直到我更改它们。

精确导航

当你听书并需要沿着时间线导航时,一个粗略的量表式对象会过于笨拙。

我希望能够通过数字工具导航时间线。

显示重要信息

我经常一天听书好几个小时。由于这些设备的电池续航通常以“小时”来衡量,我需要一个连续方便的电池状态显示,以及一些颜色编码的机制来一目了然地验证电池电量。我还希望以同样的方式显示当前时间。

所以,就这样。基本上,上面的“心愿清单”描述了 abPlayer 的特性。

背景

随附的代码是完整的程序。编译它,加载它,玩玩它。

如上所述,这不是一个商业项目,它是一位热情的业余爱好者的作品。它唯一测试过的环境是我的 ASUS MyPal 639,Windows mobile 5 设备。可能需要进行一些调整以适应

  • 不同的屏幕尺寸
  • 不同的制造商
  • 不同的操作系统版本

所有可能依赖于设备的类代码都汇集在一个类中(参见下面的代码注释)。

我还需要说明的是,我在 .NET 或 C# 方面没有接受过正规培训(事实上,我的“编程”培训非常少)。我代码中使用的一些约定和技术可能存在争议。如果你愿意,请随时给我指教。我将感激任何建议(以及 bug 报告、功能增强等等……)。

Using the Code

我没有在此处附加任何代码示例,因为我不确定代码层面是否有任何新颖之处。

不过有一点值得注意:cPlayer 类负责激活和操作 Windows Mobile Media Player,它花费了大量的时间和尝试才开发出来,因为这方面的文档通常不清楚,而且绝对不完整。对编写一些 WMP 相关代码感兴趣的用户可能会发现这个类有助于降低学习难度。

该项目包含六个窗体和八个无窗体类。

  • 主要的“收听”窗体(如上所示)。
    • 我包含了两个版本(彩色和灰度)来演示“皮肤”效果。
    • 在窗体上任何位置右键单击弹出的菜单允许访问“关于”对话框和“皮肤”选择。
      我在下载的 zip 文件中包含了 2 种皮肤主题,这些应该放在 abPlayer.exe 所在的目录中。(应该创建一个“Skins”目录,其中每个子目录代表一个皮肤名称,并且其中应包含各种按钮的图像)。

    image02.JPG

  • 库窗体 – 用于查看、组织、重命名、移动和选择书籍(播放列表)。

    image03.JPG

  • 书籍属性窗体 – 如上所述,每本书的书签(文件#和时间线标记)、随机播放属性和音量级别都是单独维护的。

    frmFileselector.jpg

  • 文件选择器窗体 – 用于为书籍选择媒体文件。

    frmMedia.jpg

  • 媒体信息窗体
  • 还有一个“关于”窗体,显示程序版本。

类是

  • cBaseClasses:包含 3 个纯 abstract 类的定义,它们作为以下类的基础/模板
    • cBasePlayer - 播放器类
    • cBasePersistancy - 持久化类
    • cBaseDeviceSpecifics - 设备特定类
  • cPlayer (派生自 cBasePlayer):负责与 Windows Mobile Media Player 进行所有交互的类。
  • cASUS639DeviceSpecifics (派生自 cBaseDeviceSpecifics):封装所有 API 调用和其他可能需要设备适配的功能的类。这个类特定于 Asus Mypal 639,但全部或部分可能在其他设备上也能工作。
  • cMP3Info:读取 MP3 文件并提供其属性和标签信息的类。
  • cBookstore (派生自 cBasePersistancy):4 个不同的持久化类(一次只有一个被实际使用 – 请参阅 frmLibrary 查看其用法)。
    除了功能齐全外,每个类都可以作为使用不同方法(文件 IO、系统注册表、数据库、XML – 分别)的示例代码。
    • cFileSystemPersistancy(文件系统)
    • cRegistryPersistancy(注册表)
    • cDatabasePersistancy(DB – SqlServerCE)
    • cXMLPersistancy(XML)

历史

  • 版本 1 发布于 2008 年 9 月。
  • 当前下载:版本 2.4
  • 版本 1 以来的增强功能:
    • 支持滚动文本
    • 支持书架(用于将多本书组合在一起 – 用于系列)
    • 各种 GUI 增强
    • 支持外部“皮肤”
    • MP3 文件信息
    • 总书时长(已读/剩余)
    • 睡眠功能(在一定时间后关闭设备)
    • 支持按键码(通过箭头键操作各种功能)
    • 增强的绘制逻辑(无闪烁)
    • 类重构以实现更好的代码维护
    • 支持“关于”对话框和版本控制
    • 支持 4 种不同的持久化方法
    • 若干次小 bug 修复

参考文献/致谢

  • cMP3Info – 读取 MP3 文件并报告其属性和标签。
    • 原始 C++ 代码作者:Gustav "Grim Reaper" Munkby(原名:MP3Header
    • 由(我不记得是谁了,也找不到原文)转换为 VB。
    • 由我转换为 C# 并进行了修改,以更好地支持我的程序。
© . All rights reserved.