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



     前两天我已经封装好一个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. 一起学Maven

    转载自:http://blog.csdn.net/songdeitao/article/details/18452459 一. 初识Maven 开场白 在现在的项目开发过程中,越来越重视项目的管理,而 ...

  2. Linux内核的同步机制

    本文详细的介绍了Linux内核中的同步机制:原子操作.信号量.读写信号量和自旋锁的API,使用要求以及一些典型示例 一.引言 在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实象多进程 ...

  3. Android:实现数组之间的复制

    System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制 System.arraycopy(src, srcPos, dst, dstPos, length); src ...

  4. sql server 自定义函数的使用

    sql server 自定义函数的使用 自定义函数 用户定义自定义函数像内置函数一样返回标量值,也可以将结果集用表格变量返回 用户自定义函数的类型: 标量函数:返回一个标量值 表格值函数{内联表格值函 ...

  5. 1、Web容器的理解&Tomcat的安装与配置

    Web容器的理解 <Java Web开发实战经典——基础篇>一书中对Web容器这一概念阐述得很好,借用其观点对Web容器加以理解: 想要运行一个Java Web的程序,则必须有相应的Web ...

  6. 受限波兹曼机导论Introduction to Restricted Boltzmann Machines

    Suppose you ask a bunch of users to rate a set of movies on a 0-100 scale. In classical factor analy ...

  7. 排序 归并排序&逆序对

    void MergeArray(int cry[],int temp[],int begin,int middle,int end) { int i=begin; int j=middle+1; in ...

  8. Vim的可视模式

    可视模式可以看到选中的字符串, 并对其进行操作 v:进入字符选择模式 V:进入行选择模式 ctrl-v(Window是ctrl-q):进入block选择模式 o:移动光标到选择的另一端 O:移动光标到 ...

  9. android从应用到驱动之—camera(2)---cameraHAL的实现

    本来想用这一篇博客把cameraHAL的实现和流程都给写完的.搞了半天,东西实在是太多了.这篇先写cameraHAL的基本实现框架,下一篇在具体写camerahal的流程吧. cameraHAL的实现 ...

  10. HDU 4633 Who's Aunt Zhang(polay计数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4633 题意:有下面一个魔方.有K种颜色.可以为顶点.边.面(每个面有9个小面)染色.两种染色算作一种当 ...