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



     前两天我已经封装好一个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. linux入门教程(三) Linux操作系统的安装

    因为笔者一直都是使用CentOS,所以这次安装系统也是基于CentOS的安装.把光盘插入光驱,设置bios光驱启动.进入光盘的欢迎界面. 其中有两个选项,可以直接按回车,也可以在当前界面下输入 lin ...

  2. [主席树]HDOJ3874 Necklace

    题意:n个数 m个询问 询问的是[l, r]区间内不同的数的和 没有修改,静态的主席树即可 与 SPOJ QUERY 一样 将重复的元素建树即可 注意范围:$N \le  50000$ 每个值不超过1 ...

  3. Project Euler 86:Cuboid route 长方体路径

    Cuboid route A spider, S, sits in one corner of a cuboid room, measuring 6 by 5 by 3, and a fly, F, ...

  4. 关于ssh的一篇很好的文章

    源地址:http://www.w3hacker.com/?p=156   ssh-agent的manual写得倒是挺详细,可看了好几次都没怎么搞明白.08年在网上找到了非常好的一篇文章,An Illu ...

  5. [Codeforces677B]Vanya and Food Processor(模拟,数学)

    题目链接:http://codeforces.com/contest/677/problem/B 题意:n个土豆,每个土豆高ai.现在有个加工机,最高能放h,每次能加工k.问需要多少次才能把土豆全加工 ...

  6. 宏btr_pcur_open_on_user_rec

    参考http://wqtn22.iteye.com/blog/1820436 http://blog.jcole.us/2013/01/10/btree-index-structures-in-inn ...

  7. Google发布SSLv3漏洞简要分析报告

    今天上午,Google发布了一份关于SSLv3漏洞的简要分析报告.根据Google的说法,该漏洞贯穿于所有的SSLv3版本中,利用该漏洞,黑客可以通过中间人攻击等类似的方式(只要劫持到的数据加密两端均 ...

  8. Samba 4.x.x全版本存在命令执行漏洞

    Samba 4.0.0到4.1.10版本的nmbd(the NetBIOS name services daemon)被发现存在远程命令执行漏洞.CVE编号为CVE-2014-3560.目前官方已经发 ...

  9. jquery获取div距离顶部的距离

    获取元素到页面顶部距离的语句为: 1.jquery写法:$(“#divID”).offset().top //推荐 $("#vertical").position().top 2. ...

  10. Liunx常用的特殊环境变量

    [weiqiang.liu@l~]$ sh variable xiaoqiang xiaoxuenumber:2scname:variablefirst:xiaoqiangsecond:xiaoxue ...