装载请说明原地址,谢谢~~



     前两天我已经封装好一个duilib中使用的webkit内核的浏览器控件和一个基于vlc的用于播放视频的视频控件,这两个控件可以分别用在放酷狗播放器的乐库功能和MV功能上,也可以用于其他duilib项目,说起来做仿酷狗程序,但是至今我虽然把仿酷狗的主界面做好了,但是还没有播放音乐的功能,所以今天就再封装一个音频类。

    我以前并不怎么使用音频和视频的功能,所以对常用的视频库和视频库不太了解,而我肯定不会使用系统的win32控件或者MFC里面的类,因为多数系统自带的功能还不能满足我的需求。我需要一个小巧但是功能足够做出仿酷狗的效果的音频库,昨天晚上在群里向群友们打听有什么好用的音频库,大家推荐了几个,比如 ffmpeg,PortAudio,SDL,bass,libzplay。

    我分别找了这几个库的资料,ffmpeg不用多少,功能强大众所周知,不过他技能播放音频又能播放视频,用他封装个音频库就杀鸡焉用牛刀了。SDL是一套开源的跨平台多媒体开发库,使用C语言写成。bass是个轻量级的音频库,功能方面还不够强大。libZPlay库集成了所有支持格式(mp3, mp2, mp1, ogg, flac, ac3, aac, oga, wav and pcm
)的编码解码器。库本身是由WINAPI编写,你无须额外的库,也不需要MFC / .NET的支持,只能在Windows下运行。

    对比了一下,感觉这个libZPlay比较适合,因为我写的程序只面向windows平台,不需要跨平台,而且liZPlay支持常用的音频格式,也不需要附带额外的库,使用也比较简单。这个libZPlay不光能播放音乐,还能录音,绘制音频图像,支持一些音乐特效。恰巧昨天在群里和群友交流时得知网友花落半歌也在做音乐播放器,也使用的是这个库。

    去官网下载了libzplay的最新版本libzplay-2.02-sdk,库的二进制文件大约2M,使用是添加libzplay.h头文件和libzplay.lib库文件就可以了。先打开作者给的demo,发现每个demo都挺简单,都是控制台工程,我编译了VC对应的工程的example1 demo,先使用了一下,感觉功能对我来说足够了,使用截图如下



    可以看到上方是控制按钮,通过对应的按钮可以控制音乐效果,控制功能还是很全面的,比如声音渐弱、渐强、回音、通道混合、均衡器、去除某个音轨。我随便找了一个音乐改变了一下音乐特效,很有意思的是可以把做出各类的人声,从女性变到男性,变成怪物音或者小孩音。

    demo的代码浅显易懂,我对应着demo里使用的函数把libZPlay库封装为CMusicPlayer类,对应设demo的函数封装很简单



    如果要配合duilib,让音频库可以主动通知主窗体,去改变音乐状态,比如反馈当先已经播放了多长时间, 是否播放完毕等就需要再封装几个回调函数的接口,libZPlay库自带了回调通知的函数,其原型为:

virtual int __stdcall SetCallbackFunc(TCallbackFunc pCallbackFunc,TCallbackMessage nMessages, void *user_data) = 0;

    第一个参数是回调函数,回调函数的原型要定义为这样typedef int  (__stdcall * TCallbackFunc)(void* instance, void *user_data, TCallbackMessage
message, unsigned int param1, unsigned int param2); 第二个参数代表要通知的消息的类型,由我们自己选择比如,MsgPlay|MsgStop|MsgNextSong,代表了当音乐播放、停止、换歌时会调用回调函数。有了这个我们使用音频库结合duilib就更简单了,在回调函数里,可以再使用更多的详细的来自主窗体的回调函数,通过回调函数分类去操作界面 ,或者可以用消息机制发消息给主窗体去让主窗体自己改变行为。

    到此主要内容就说完了,封装完后,我封装的这个类头文件138行代码,源文件493行代码。

    另外群里先后好多人询问怎么使用duilib自带的MenuDemo,因为自带的MenuDemo没有增加消息通知的接口,所有很多人不会用,我打算再写一篇日志,说明一下给MenuDemo怎么增加接口 ,让他可以去通知主窗体一些事件。详见后面的日志。

2014.7.27  15:19  Redrain 

使用libzplay库封装一个音频类的更多相关文章

  1. 1.使用C++封装一个链表类LinkList

     使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸********** ...

  2. Swift - 简单封装一个工具类模板

    创建模板类(封装一个类) 例1:新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var desc ...

  3. 封装一个帮助类来写文件到android外置存储器上

    项目地址:点击打开 项目简介:写文件到android外置存储器的一个帮助类,和它的demo程序 它是如何工作的呢? 1.创建 AppExternalFileWriter 对象并传递context(上下 ...

  4. 使用Java封装一个DBUtils类(反射)

    刚开始学JavaWeb时,我是调用N个setter方法将从数据库中查询出的数据封装成JavaBean的,极其繁琐. 后来了解SpringJDBC后,发现它提供的接口非常简单,然后就想自己封装一个简单的 ...

  5. 使用AutoFac实现依赖注入(封装一个注册类)

    public class AutoFacBootStrapper { public static void CoreAutoFacInit() { var builder = new Containe ...

  6. 封装一个 员工类 使用preparedStatement 查询数据 (2) 使用 arrayList 集合

    创建 员工=类生成 有参构造 get set 方法 toString 方法 package cn.hph; public class emp1 { //创建员工类的属性 private int id; ...

  7. 封装一个 员工类 使用preparedStatement 查询数据 (1)

    创建员工类  自动生成get set 方法 package cn.hph; public class emp { //定义表中的属性 private int id; private String en ...

  8. 封装一个mysql类(ggshop)

    接口 abstract class db{ //连接服务器 public abstract function connect($n,$u,$p); //发送查询 protected abstract ...

  9. php封装一个接口类

    <?phpClass Response{//返回数据 public static function show($code,$message='',$data='',$type = 'json', ...

随机推荐

  1. lintcode:插入区间

    题目: 插入区间 给出一个无重叠的按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 样例 插入区间[2, 5] 到 [ ...

  2. JavaWeb项目开发案例精粹-第2章投票系统-002配置文件及公共类

    1. <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5&qu ...

  3. Android系统

    系统内核 Android 是运行于Linux kernel之上,但并不是GNU/Linux.   因为在一般GNU/Linux 里支持的功能,Android 大都没有支持,包括Cairo.X11.Al ...

  4. Windows下获取高精度时间注意事项

    Windows下获取高精度时间注意事项 [转贴 AdamWu]   花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: ...

  5. PHP程序员的40点陋习

    1.不写注释 2.不使用可以提高生产效率的IDE工具 3.不使用版本控制 4.不按照编程规范写代码 5.不使用统一的方法 6.编码前不去思考和计划 7.在执行sql前不执行编码和安全检测 8.不使用测 ...

  6. ListView(2)最简单的上拉刷新,下拉刷新

    最简单的上拉刷新和下拉刷新,当listview滚动到底部时向上拉刷新数据.当listview滚动到最顶部时下拉刷新.       图1,上拉刷新 图2,下拉刷新 1,设置lisview,加载heade ...

  7. 【POJ】3523 The Morning after Halloween

    1. 题目描述$m \times n$的迷宫(最大为$16 \times 16$)包含最多3个点,这些点可以同时向相邻方向移动或保持停止,使用小写字母表示起始位置,使用大写字母表示中止位置.求最少经过 ...

  8. Hibernate框架简述

    Hibernate的核心组件在基 于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层.它通过配置文件(hibernate.properties或 hibernate ...

  9. bzoj2324营救皮卡丘

    费用流. 建图比较重要. 1.S->id[0][0] flow=k. 表示k条路径. 2.S->id[i][0] flow=1, 每次消耗1流量就补充1流量. 3.id[i][1]-> ...

  10. UVa 11076 (有重元素的排列) Add Again

    n个可重复的元素的排列一共有 = All种,其中 假设这些数依次为ai,每种数字有mi个. 从右往左考虑第d位数(d≥0),第i个数字出现的次数为,那么这个数字对所求答案的贡献为 其实可以先一次求出个 ...