使用libzplay库封装一个音频类
装载请说明原地址,谢谢~~
前两天我已经封装好一个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怎么增加接口 ,让他可以去通知主窗体一些事件。详见后面的日志。
使用libzplay库封装一个音频类的更多相关文章
- 1.使用C++封装一个链表类LinkList
使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸********** ...
- Swift - 简单封装一个工具类模板
创建模板类(封装一个类) 例1:新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var desc ...
- 封装一个帮助类来写文件到android外置存储器上
项目地址:点击打开 项目简介:写文件到android外置存储器的一个帮助类,和它的demo程序 它是如何工作的呢? 1.创建 AppExternalFileWriter 对象并传递context(上下 ...
- 使用Java封装一个DBUtils类(反射)
刚开始学JavaWeb时,我是调用N个setter方法将从数据库中查询出的数据封装成JavaBean的,极其繁琐. 后来了解SpringJDBC后,发现它提供的接口非常简单,然后就想自己封装一个简单的 ...
- 使用AutoFac实现依赖注入(封装一个注册类)
public class AutoFacBootStrapper { public static void CoreAutoFacInit() { var builder = new Containe ...
- 封装一个 员工类 使用preparedStatement 查询数据 (2) 使用 arrayList 集合
创建 员工=类生成 有参构造 get set 方法 toString 方法 package cn.hph; public class emp1 { //创建员工类的属性 private int id; ...
- 封装一个 员工类 使用preparedStatement 查询数据 (1)
创建员工类 自动生成get set 方法 package cn.hph; public class emp { //定义表中的属性 private int id; private String en ...
- 封装一个mysql类(ggshop)
接口 abstract class db{ //连接服务器 public abstract function connect($n,$u,$p); //发送查询 protected abstract ...
- php封装一个接口类
<?phpClass Response{//返回数据 public static function show($code,$message='',$data='',$type = 'json', ...
随机推荐
- Project Euler 97 :Large non-Mersenne prime 非梅森大素数
Large non-Mersenne prime The first known prime found to exceed one million digits was discovered in ...
- C++ Primer笔记整理
1. 迭代器:迭代器是一种对象,它可以看做是游标,用来遍历标准模板库中的部分或者全部元素. 每个迭代器指向容器中确定的地址,此外,迭代器还提供一些基本操作符:*.++.==.!=.=. 2. 模板:是 ...
- scanf()函数用法小结
scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息. 其调用格式为: scanf("<格式化字符串>",<地址表>); ...
- Hibernate逍遥游记-第15章处理并发问题-003乐观锁
1. 2. drop database if exists SAMPLEDB; create database SAMPLEDB; use SAMPLEDB; drop table if exists ...
- tornado nginx supervisor
安装:sudo apt-get install python-tornado sudo apt-get install nginx sudo apt-get install supervisor 1. ...
- python 下划线的使用(转载:安生犹梦 新浪博客)
Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核 ...
- Shell最多支持多少个参数
本文转自:http://www.jb51.net/article/56548.htm 这篇文章主要介绍了Shell最多支持多少个参数?本文是对Shell最多可以输入多少个参数的一篇测试文章,需要的 ...
- 你真的了解try{ return }finally{}中的return?
你真的了解try{ return }finally{}中的return? 今天去逛论坛 时发现了一个很有趣的问题: 谁能给我我解释一下这段程序的结果为什么是:2.而不是:3 代码如下: class ...
- Wince 中如何实现注册表恢复原厂设置
理论: 使用HIVE注册表,系统在完成了第一阶段也就是加载完了boot.hv+binfs之后和加载系统HIVE注册表之前,filesys.exe都会调用OEMIoControl来查询是否需要清除保存在 ...
- BZOJ 2301 Problem b(莫比乌斯函数)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2301 题意:每次给出a,b,c,d,K.求有多少数对(x,y)满足a<=x< ...