使用libzplay库封装一个音频类

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

     前两天我已经封装好一个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 
目录
相关文章
|
3月前
|
安全 API Android开发
Android网络和数据交互: 解释Retrofit库的作用。
Android网络和数据交互: 解释Retrofit库的作用。
38 0
调用自己封装的库,实现位图的格式转换
调用自己封装的库,实现位图的格式转换
|
3月前
|
前端开发 程序员 开发者
自己封装的一些工具函数
自己封装的一些工具函数
|
4月前
|
数据中心
常见光模块的封装
光模块的封装,保障了光通信的稳定和可靠性。本文介绍几种常见的光模块的封装类型。
|
4月前
|
Java 数据安全/隐私保护
类,封装,包
类,封装,包
38 0
|
8月前
D类音频功放
D类音频功放
106 0
|
10月前
|
存储 XML JSON
Android配置文件操作模块封装,全互联网最简单好用的封装
Android配置文件操作模块封装,全互联网最简单好用的封装
|
11月前
|
存储 传感器 前端开发
多媒体终瑞形式和接口
多媒体终瑞形式和接口
|
编解码
如何使用RTP封装H264视频数据
RTP的第一个字节是消息类型,如果是FU-A,第二个字节用来指示是否是I帧,是否I帧的开始或结束。
如何使用RTP封装H264视频数据
|
设计模式 JSON JavaScript
从封装JSONEditor和ElButton看如何二次封装第三方库和插件
从封装JSONEditor和ElButton看如何二次封装第三方库和插件
429 0

热门文章

最新文章