日期:2012-12-09  浏览次数:20400 次

关键字: VB.NET DirectSound9 播放器 均衡器 作者:董含君

转载请注明来自:http://blog.csdn.net/a11s

发现最近发帖有点上瘾,这个估计真的是最后一篇关于DirectSound的文章了.用VB做播放器--估计又是我填补国内空白了.呵呵开玩笑.用MediaPlayer做播放器的不要看不起我哦...现在来写一下均衡器.必要知识是示波器,如果没有示波器的知识来做均衡器估计比较困难.这个是连接

http://blog.csdn.net/a11s/archive/2005/03/07/313672.aspx

依旧是拿WinAmp来分析

中间的那个就是均衡器(这个图没有截好,而且这个Blog居然不能删除上传的图像,我晕)




上面的1k 3k 6k ...都是可以调整的.

根据上一篇文章的说明,就是修改播放的buffer

1 primaryBuffer 这里面是DirectSound的最终播放缓冲,通常说来,你不需要修改他的内容,包括SDK的例子也没有涉及到PrimaryBuffer的操作.包括写入,锁定,播放 三个部分.更加详细的资料只能参照C++的资料的,全部都是英文的.不要指望我来翻译,我怕挨骂.

2 针对当时示波器的方案,应用到均衡器.就是将某一段的音量进行调整.这个"段"可以映射到riff的数据块,也就是播放前就修改了Primary的数据,然后lock ,最后play

3 最重要的还是这个"范围"的定义.由于我对声学了解几乎为0.但是相信winAmp这么划分时有道理的.你仔细看均衡器的上面有一条曲线.他的放大并不是大起大落,而是平滑的,这样你的EQ函数跟示波器的绘制函数一样,应该是连续的效果才会比较好

4 多种声音的加载.

这个在示波器没有多说,主要是为了拿到均衡器这边来.

既然知道均衡器最终的实质是修改PrimaryBuffer,那么你应该很容易就联想到怎么加载mp3 或者 wma了

最"经典"的办法,自己读mp3文件,然后转化成响应的riff,写PrimaryBuffer,最后Play

流行的办法,利用现有的插件,COM对象.没有发现么,DIrectShow支持的文件格式基本上就包含了MediaPlayer的文件格式,很多播放器都是这样.基本上都是为windows media player做插件.RealOne也有自己的Update 站点升级插件,WinAmp的插件也很多.他们的功能就是将目标文件专成riff然后给源程序播放.

5 播放器的播放环节

5.1 初始化

5.2 打开文件

5.3 找合适的插件读取文件内容,变成riff

5.4 找合适的插件进行示波

5.5 找合适的插件进行EQ调整

5.6 找合适的插件进行输出(这里我们用DirectSound)

5.7 播放进行时,处理各种时间以及做好节目列表

5.8 ....

可见,里面插件担当了非常重要的技术,而且不是一个人能够做的来的.

视频操作更是如此.

但是都是利用了一个同一的标准,然后大家具体实现其中的内容.

6 说了这么多,是不是对插件感兴趣?这个你可以直接用.但是需要到winamp的官方查看他的示例代码.当年豪杰曾经也出过演示程序,C++的.然后既然知道了接口,你就应该能够制作出这样的程序来适应他的插件.

相关技术主要还是经典的dll的动态加载问题,C# 以及 vb.net J# 都办不到.建议还是看C++或者Delphi吧.虽说安装插件的VB6也能做到.....

估计这块已经没有什么可以再值得研究的了,或者说也不是一个人能够做到的了.仅仅了解一下就可以了.如果真的认真做,需要耗费的时间跟精力是难以估量的.或者你去做个forlinux的也许还能有前途,这个就不是我要讨论的问题了

=============End===============