满意答案
shirleyrae
2013.08.25
采纳率:45% 等级:11
已帮助:11337人
你的问题属于多媒体开发中的基本问题,在本科院校计算机学院的《多媒体技术》这门课中都有相应的解答,并有国外经典教材的中译本,这些可以上网查找。
具体到你的问题,其实三个问题都是对于多媒体文件格式及其解析的困惑。
首先,所有多媒体文件都是有标准格式的,这些格式是由各种国际组织制定颁布,全球统一的。比如各种图像格式,一般会在文件的前几十个字节中直接用二进制数值标明图像的格式、图像的大小、图像的分辨率等属性,接下来大量的二进制字节都是图像具体数据。这就是文件的内部结构,音频和视频文件同理。所以这种结构是存在的,但不同于程序语言的结构体这种用高级语言定义的结构,而是纯粹的二进制数据,只不过我们规定了文件头部的这些二进制数值的含义,而这些都是由国际组织规定的。
其次,程序具体怎样解析多媒体文件?我们可以想到的最直接的办法就是我们将多媒体文件本身作为输入流,然后用某种编程语言(如C++)提供的各种二进制处理函数一段一段解析文件,首先解析头(文件的前面几十个字节),从头中得出文件的格式等信息(这个需要参照国际标准,比如文件第二个字节的前四个bit可能表明了文件格式),然后再调用声卡驱动,将你解析得到的格式信息和剩下的二进制流(需要进行一定的处理)作为函数的参数,声卡会根据你提供的格式采用相应的办法把二进制数据转换为声音。所以需要直接处理大量二进制数据的是声卡驱动程序。
但是在具体实现的时候一般不会这么原始,因为有强大的操作系统在,并且各种程序设计语言本身又对各种多媒体操作进行了函数封装。具体而言,windows操作系统封装了声卡驱动提供的函数,然后将封装后的函数作为win api;各种编程语言又对win api进行了封装,再给出自己的多媒体操作函数;而对于以上我提到的解析多媒体文件头部的工作,各种编程语言也都进行了自己的封装,我们只需要调用它们即可。比如,我们可以用输入流打开一个音频文件,然后将流作为参数传递给某函数,从这个函数的返回值我们可以直接得到文件的格式等信息,调用另一个函数,这个函数可能会直接播放文件。而这些函数内部,其实都会调用win api,然后win api再通过操作系统调用声卡驱动,声卡驱动最终解析二进制数据完成发声工作。
最后,关于你的最后一个问题,这很有可能是VC提供的录音函数保存数据的格式与众不同,导致只有VC本身的播放函数才能播放;或者千千和酷我本身无法播放wav格式文件,因为它们不支持这种格式。
如果还有什么疑问,请站内短信。
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
Vae团队招人!!!欢迎各位加入!!!走过路过不要错过!!!迅猛发展中!!!
vaela
00分享举报