代码之家  ›  专栏  ›  技术社区  ›  gbjbaanb

流式处理wav文件

  •  3
  • gbjbaanb  · 技术社区  · 17 年前

    我有一个服务器通过套接字发送数据,数据是一个wav“文件”。我可以很容易地将数据写入磁盘,然后在wmp中播放,但我不知道如何在从套接字读取数据时播放它。有可能吗?

    额外问题:如果流是MP3或其他格式的,我该怎么做?

    这是针对本机C++中的Windows。

    3 回复  |  直到 12 年前
        1
  •  3
  •   Mark    17 年前

    因为你说过wmp,我假设这个问题适用于在Windows机器上播放wav文件。如果没有,这个答案是不相关的。

    你想做的不是小事。有一篇好文章 here 在描述Windows音频模型的代码项目上。它描述了如何设置音频设备以及如何将数据流到设备中进行播放。您“简单地”需要提供从套接字传入的数据作为回放缓冲区的数据。但这就是所有棘手的工作所在。你必须确定

    • 您有足够的数据开始播放
    • 当您的套接字缺少数据,并且没有任何数据发送到回放缓冲区时,处理这种情况。
    • 您能够以足够的速度从套接字中读取数据,以保持播放缓冲区满。

    这是一个有趣的练习。但狡猾。

        2
  •  1
  •   AShelly    12 年前

    马克说得对,这是个棘手的问题。如果你用直接声音而不是摇摆不定,这就不那么棘手了。 Here's an article 从磁盘流式传输波形文件:从网络流式传输基本上是相同的过程。在开始之前,请确保从网络中收集了足够的数据——您将需要超过本文提到的2个缓冲区。

    更不棘手的是 FMOD . 从 FAQ :

    增强的Internet功能

    • 互联网音频流。包括定制的互联网流代码,允许无缝的Shoutcast、ICecast和HTTP流支持。
    • 下载功能。支持网络文件的fmod_的模块化文件系统的副作用,甚至静态样本也可以从互联网上加载。

    文件格式支持 :fmod当前支持多种音频文件格式。 部分列表 :

    • MP3-(MPEG I/II第3层,包括VBR支持)
    • ogg-(ogg vorbis格式)
    • wav-(Microsoft Wave文件,包括压缩的wav。PCM、MP3和IMA ADPCM压缩wav
        3
  •  0
  •   MusiGenesis    17 年前

    马克说得对,这是个棘手的问题。WaveOutXXXX API很古老(它早于Windows95),需要比您想象的更容易出错的编码。与C语言相比,在C++中与API进行交互的时间更容易。只要确保这是你真正想做的事情。

    如果流不是wav文件数据的某种格式(如mp3或wma),则必须执行将数据解码为wav格式并使用waveoutXXXX API播放数据的附加步骤。找到一个好的MP3解码组件比你想象的要复杂得多——我认为这与弗劳恩霍夫许可证的情况有关(如果你以任何方式使用MP3代码,你应该支付这些费用)。

    我会找到现成的产品来做这个,除非你想要学习的经验。