在Internet传播声音

多媒体 专栏收录该内容
1 篇文章 0 订阅

        -使用Audio Compression Manager(ACM)

 作者/Peter Morris  翻译/陈省

  在几年以前IP电话被炒的沸沸扬扬,但用过的人都觉得这个技术非常不成熟,语音质量很差,时断时续,还经常有延迟,结果这项技术的应用没有普及开来。但随着Internet应用的越来越广泛以及相关技术发展的日新月异,声音质量不断提高,通过Internet打电话早已不再是梦想,已经成为了我们生活中的一部分。今天我使用IP电话打长途,每分钟只需要3毛钱,使用OICQ的语音聊天,网友仿佛就在你的身边。如果我们的带宽足够的,我们甚至还可以在网上收看Quicktime视频直播,用RealAudio收听电台广播,也可以点播好听的MP3歌曲。不过对于程序员来说,更好的消息是我们对于这些媒体流的编程也也变得越来越容易。为什么这么说呢,下面让我们先来了解一下Codec

 Codecs

  什么是Codecs?其实它就是音频压缩的解码编码器,实际上有点类似ActiveX控件。ActiveX控件使程序员可以调用一些他人实现好的功能而无需从头做起。Codecs提供了类似的功能,只不过它集中在提供如何对媒体格式进行转换的功能。例如,如果想写一个把CD转MP3的应用程序,我们只需要做下列工作:

 l         CD音轨中读取数据。

 l         生成一个有效的MP3文件头。

 l         调用相应的codec把音轨数据编码为MP3。

Windows本身已经带了很多的codec。下面是其中几个的说明:

名称

说明

GSM

好像用于某些移动电话网络。

DSP TrueSpeech

可以生成一种一位的声音格式用于语音通话-声音非常清楚。

Fraunhoffer IIS MP3

这种可以用来生成MP3格式。

PCM

用于生成Windows标准声音格式。大多数Codec支持的声音格式都可以和它相互转化。

  当前安装的codec的完整列表可以通过察看控制面板中多媒体的部分来获得。 

ACM API

  ACM是"Audio Compression Manager"缩写,翻译过来就是声音压缩管理器。它是微软编写的用于调用Codec功能的接口函数库。它本来应该声明在MMSystem.pas单元中,但是由于某些原因Borland把它给省略了。所以我们要作的第一件事是找到它的API声明单元MSACM.pas。必须要感谢Francois Piette,他共享了他转换的单元文件,我们可以从www.Delphi-Jedi.org下载它。

  使用ACM转换媒体格式包括以下几步:

  l         首先必须指定输入输出格式,我们需要设定TWaveFormatEX记录, 但是这个结构记录太小无法容纳大多数Codec所需要的信息。为了解决这个问题,我们使用一个自定义的 TACMFormat记录,这个记录在TWaveFormatEX的基础上增加了128字节。

  l         打开一个ACM流。首先调用acmStreamOpen函数,把输入输出格式作为参数传递过去。然后ACM或者返回一个有效的句柄或者返回一个错误代码(比如ACMERR_NotPossible)来表明转换的请求无法完成。

  l         接下来要确定输出缓冲区的大小。调用acmStreamSize函数会通知ACM每次我们将生成多少字节的数据,然后函数会返回请求大小的缓冲区(我们总是应该高估一下大小,保证提供一个足够大的缓冲区)。

  l         然后,我们要生成一个转换头。需要调用acmStreamPrepareHeader函数,把先前调用acmStreamOpen函数返回的流句柄作为参数。生成的转换头会告诉ACM源缓冲区和目的缓冲区的地址。ACM不会自动分配内存,我们必须自己来申请内存。

  l         所有的准备工作基本上完成了,只剩下如何转换数据了。这是非常简单的,只需要调用acmStreamConvert函数。AcmStreamConvert函数的参数包括流句柄和转换头句柄。这个函数通过设定转换头中的cbDstLengthUsed表明转换过程中真正被使用的字节数。

  l         一旦完成了ACM的会话,我们必须释放使用的全部资源。转换头用acmStreamUnprepareHeader函数来释放,流用acmStreamClose来关闭。

 选择格式

  正如前面提到的,在开始转换以前必须先设定输入输出格式。TWaveFormatEX记录(声明在MMSystem.pas单元中),它仅仅指定了比特率,频率等等。除非我们只打算在不同的PCM格式间进行转换,否则TWaveFormatEX是不够用的。下面是它的替代格式:

TACMWaveFormat = packed record

     case integer of

       0 : (Format : TWaveFormatEx);

       1 : (RawData : Array[0..128] of byte);

   end;

  这个变体记录使我们仍然可以读取TWaveFormatEX结构数据,同时RawData提供了足够的空间来容纳其它Codec需要的额外信息。

  虽然我们不知道额外信息的大小,但我们可以使用acmFormatChoose函数来获得。

  AcmFormatChoose函数只需要一个TACMFormatChooseA类型的参数。这个参数是一个简单的结构可以包括下列信息:

成员

说明

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

2010-04-06 15:42 168 299497 Server\pap 2010-04-06 15:42 57 0 Server\reso.inc 2010-02-22 22:56 9883 0 Client\ACMConvertor.pas 2010-02-22 22:56 9883 0 Server\ACMConvertor.pas 2010-02-22 22:56 13207 0 Client\ACMIn.pas 2010-02-22 22:56 13207 0 Server\ACMIn.pas 2010-02-22 22:56 5003 0 Client\ACMOut.pas 2010-02-22 22:56 5003 0 Server\ACMOut.pas 2010-04-06 15:40 32073 0 Client\afxCodeHook.pas 2010-04-06 15:42 32073 0 Server\afxCodeHook.pas 2010-02-18 04:32 17377 0 Server\CnRawInput.pas 2010-02-08 22:43 1900 0 Server\CryptApi.pas 2010-02-22 22:56 10070 0 Server\ListUnit.pas 2010-04-06 15:42 23027 0 Server\MagicApiHooks.pas 2010-04-06 15:40 25920 0 Client\MainU.pas 2010-02-22 22:56 53930 0 Client\MSACM.pas 2010-02-22 22:56 53930 0 Server\MSACM.pas 2010-03-19 18:49 848 0 Client\uAbout.pas 2010-02-23 01:49 5850 0 Client\uAudioStream.pas 2010-04-03 02:11 13106 0 Client\uBuild.pas 2010-02-20 08:19 6133 0 Client\uCamspy.pas 2010-04-06 15:40 44498 0 Client\uConn.pas 2010-02-21 02:45 3444 0 Server\uDOS.pas 2010-02-08 22:36 973 0 Client\uDownload.pas 2010-02-08 22:43 4434 0 Server\uFilemanager.pas 2010-02-25 22:19 8738 0 Client\uFilemanager.pas 2010-02-08 22:43 11189 0 Server\uFireFox.pas 2010-02-08 22:41 12028 0 Client\uFlag.pas 2010-04-06 15:42 6398 0 Server\uFunction.pas 2010-02-20 23:24 772 0 Client\uInformation.pas 2010-04-06 15:42 17808 0 Server\uInstallation.pas 2010-02-20 14:37 2833 0 Client\uKeylogger.pas 2010-03-09 07:59 746 0 Server\uKeylogger.pas 2010-02-08 22:41 316 0 Client\uManager.pas 2010-04-06 15:40 11579 0 Client\uMini.pas 2010-03-19 21:51 401 0 Client\uNihal.pas 2010-02-22 22:56 5074 0 Server\UnitAudioStreaming.pas 2010-03-10 23:52 1989 0 Client\uNotify.pas 2010-03-12 20:30 1964 0 Server\untCMDList.pas 2010-02-08 22:43 373 0 Server\untHTTPDownload.pas 2010-02-20 14:37 2911 0 Client\uPass.pas 2010-02-08 22:41 353 0 Client\uPlugin.pas 2010-04-06 15:40 4261 0 Client\uProcess.pas 2010-04-06 15:40 5642 0 Client\uProfiles.pas 2010-04-06 15:42 9392 0 Server\uRegistry.pas 2010-02-18 01:29 2296 0 Client\uRegistryeditor.pas 2010-02-21 00:59 1392 0 Client\uRemoteShell.pas 2010-02-18 01:21 2149 0 Client\uScreen.pas 2010-03-08 17:40 5837 0 Client\uScreenNor.pas 2010-03-19 18:49 3108 0 Client\userv.pas 2010-02-13 02:10 3156 0 Server\uServices.pas 2010-03-10 23:52 1337 0 Client\uSettings.pas 2010-03-12 20:30 7550 0 Server\uThumbDesktop.pas 2010-02-16 18:50 4329 0 Server\uThumnail.pas 2010-03-19 18:49 1472 0 Client\uTransferView.pas 2010-02-20 02:15 5865 0 Server\uWebcam.pas 2010-02-18 01:21 493 0 Client\uWindow.pas 2010-02-13 02:10 1650 0 Server\uWindows.pas 2010-04-06 15:42 15 0 Server\Compile Resources.bat 2010-04-03 02:12 414 0 Server\Server.cfg 2010-08-16 20:46 9487 0 Server\ACMConvertor.dcu 2010-08-16 20:46 10367 0 Server\ACMIn.dcu 2010-08-16 20:46 17750 0 Server\afxCodeHook.dcu 2010-08-16 20:46 13094 0 Server\CnRawInput.dcu 2010-08-16 20:46 1711 0 Server\CryptApi.dcu 2010-08-16 20:46 7663 0 Server\ListUnit.dcu 2010-08-16 20:46 16909 0 Server\MagicApiHooks.dcu 2010-08-16 20:46 23123 0 Server\MSACM.dcu 2010-08-16 20:46 4442 0 Server\uDOS.dcu 2010-08-16 20:46 4886 0 Server\uFilemanager.dcu 2010-08-16 20:46 9598 0 Server\uFireFox.dcu 2010-08-16 20:46 7509 0 Server\uFunction.dcu 2010-08-16 20:46 16395 0 Server\uInstallation.dcu 2010-08-16 20:46 1924 0 Server\uKeylogger.dcu 2010-08-16 20:46 1948 0 Server\untCMDList.dcu 2010-08-16 20:46 872 0 Server\untHTTPDownload.dcu 2010-08-16 20:46 9277 0 Server\uRegistry.dcu 2010-08-16 20:46 4094 0 Server\uServices.dcu 2010-08-16 20:46 7251 0 Server\uThumbDesktop.dcu 2010-08-16 20:46 4269 0 Server\uThumnail.dcu 2010-08-16 20:46 6242 0 Server\uWebcam.dcu 2010-08-16 20:46 2594 0 Server\uWindows.dcu 2010-04-06 15:40 487251 0 Client\MainU.dfm 2010-03-19 18:49 343613 0 Client\uAbout.dfm 2010-02-23 01:49 2552 0 Client\uAudioStream.dfm 2010-04-03 02:11 189231 0 Client\uBuild.dfm 2010-02-23 01:49 72582 0 Client\uCamspy.dfm 2010-02-23 01:49 1079 0 Client\uDownload.dfm 2010-03-19 18:49 86192 0 Client\uFilemanager.dfm 2010-04-03 02:11 61718 0 Client\uInformation.dfm 2010-03-08 17:40 73577 0 Client\uKeylogger.dfm 2010-02-08 22:48 324 0 Client\uManager.dfm 2010-04-06 15:40 1122 0 Client\uMini.dfm 2010-03-19 21:51 60301 0 Client\uNihal.dfm 2010-03-10 23:53 217925 0 Client\uNotify.dfm 2010-02-23 01:49 2116 0 Client\uPass.dfm 2010-02-23 01:49 1071 0 Client\uPlugin.dfm 2010-03-19 18:49 74316 0 Client\uProcess.dfm 2010-04-06 15:40 16909 0 Client\uProfiles.dfm 2010-02-23 01:49 83902 0 Client\uRegistryeditor.dfm 2010-02-23 01:49 1766 0 Client\uRemoteShell.dfm 2010-02-18 04:32 71331 0 Client\uScreen.dfm 2010-02-23 01:49 2179 0 Client\uScreenNor.dfm 2010-03-10 23:52 71350 0 Client\uSettings.dfm 2010-03-19 18:49 71457 0 Client\uTransferView.dfm 2010-02-18 14:58 71065 0 Client\uWindow.dfm 2010-04-06 15:40 2217 0 Client\ProjRAT.dpr 2010-04-06 15:42 50708 0 Server\Server.dpr 2010-04-06 15:40 5306 0 Client\ProjRAT.dproj 2010-02-08 22:36 32900 0 Client\ProjRAT.res 2010-04-06 15:42 63284 0 Server\reso.RES 2010-08-16 20:46 310272 129249 Server\Server.exe 2010-04-13 20:09 文件夹 文件夹 Server 2010-04-13 20:09 文件夹 文件夹 Client # # 总计 大小 压缩后大小 文件数 # 3242848 428746 114
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值