流式传输wav文件

时间:2008-09-24 22:15:56

标签: c++ stream wav

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

奖金问题:如果流是mp3或其他格式,我该怎么做?

这适用于原生C ++中的Windows。

3 个答案:

答案 0 :(得分:3)

因为您已经说过WMP,我假设这个问题适用于尝试在Windows机器上播放wav文件。如果没有,这个答案就不相关了。

你想做的事情并非无足轻重。在代码项目上有一篇很好的文章here来描述windows音频模型。它介绍了如何设置音频设备以及如何将数据流式传输到设备中进行播放。您“只需”提供来自套接字的数据作为回放缓冲区的数据。但这就是所有棘手工作的地方。你必须确定

  • 您有足够的数据可以开始播放
  • 当您的套接字缺少数据且没有任何内容可以发送到播放缓冲区时处理此案例
  • 您可以以足够的速度从套接字读取数据,以保持播放缓冲区已满

这是一项有趣的练习。但很棘手。

答案 1 :(得分:1)

马克说这是一个棘手的问题。如果使用DirectSound而不是waveOut,可能不那么棘手。关于来自磁盘的流式波形文件的Here's an article:来自网络的流式传输基本上是相同的过程。确保在开始之前从网络收集足够的数据 - 您需要的不仅仅是文章提到的2个缓冲区。

更为棘手的是FMOD。来自FAQ

增强的互联网功能

  • 互联网音频流。包括自定义互联网流媒体代码,允许无缝SHOUTcast,Icecast和http流媒体支持。
  • 下载功能。 FMOD的模块化文件系统的副作用支持网络文件,甚至静态样本也可以从互联网上加载。

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

  • MP3 - (MPEG I / II第3层,包括VBR支持)
  • OGG - (Ogg Vorbis格式)
  • WAV - (Microsoft Wave文件,包括压缩wavs。PCM,MP3和IMA ADPCM压缩wav

答案 2 :(得分:0)

马克说这是一个棘手的问题。 waveOutXXXX API很古老(它早于Windows 95),并且需要比您想象的更容易出错的编码。与C#相比,您可以更轻松地在C ++中与API进行交互。只要确保这是你真正想做的事情。

如果您的流是WAV文件数据以外的某种格式(如MP3或WMA),则必须执行将数据解码为WAV格式并使用waveOutXXXX API播放的附加步骤。找到一个好的组件进行MP3解码比你想象的要复杂 - 我认为这与弗劳恩霍夫授权情况有关(如果你以任何方式使用MP3代码,你应该支付它们。)

除非您需要学习经验,否则我会找到一个现成的产品。