有声读物播放器






4.86/5 (34投票s)
专为收听有声读物设计的音频播放器

引言
我是一个热情的有声书听众。我用我的 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”目录,其中每个子目录代表一个皮肤名称,并且其中应包含各种按钮的图像)。
- 库窗体 – 用于查看、组织、重命名、移动和选择书籍(播放列表)。
- 书籍属性窗体 – 如上所述,每本书的书签(文件#和时间线标记)、随机播放属性和音量级别都是单独维护的。
- 文件选择器窗体 – 用于为书籍选择媒体文件。
- 媒体信息窗体
- 还有一个“关于”窗体,显示程序版本。
类是
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# 并进行了修改,以更好地支持我的程序。