4

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

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

这适用于本机 C++ 中的窗口。

4

3 回答 3

3

因为您说的是 WMP,所以我假设这个问题适用于尝试在 Windows 机器上播放 wav 文件。如果不是,则此答案不相关。

你想做的事情不是微不足道的。这里有一篇关于代码项目的好文章,描述了 Windows 音频模型。它描述了如何设置音频设备以及如何将数据流式传输到设备中进行播放。您“只需”需要提供来自套接字的数据作为播放缓冲区的数据。但这就是所有棘手的工作所在。你必须确定

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

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

于 2008-09-24T22:38:36.620 回答
1

Mark 认为这是一个棘手的问题是正确的。如果您使用 DirectSound 而不是 waveOut,则可能不会那么棘手。 这是一篇关于从磁盘流式传输波形文件的文章:从网络流式传输本质上是相同的过程。确保在开始之前从网络收集足够的数据 - 您需要的不仅仅是文章提到的 2 个缓冲区。

更简单的是FMOD。从常见问题解答

增强的互联网功能

  • 互联网音频流。包含自定义互联网流代码,允许无缝的 SHOUTcast、Icecast 和 http 流支持。
  • 下载能力。FMOD 支持网络文件的模块化文件系统的一个副作用,即使是静态样本也可以从互联网上加载。

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

  • MP3 -(MPEG I/II 第 3 层,包括 VBR 支持)
  • OGG -(Ogg Vorbis 格式)
  • WAV -(Microsoft Wave 文件,包括压缩 wav。PCM、MP3 和 IMA ADPCM 压缩 wav
于 2008-09-25T05:15:12.067 回答
0

Mark 认为这是一个棘手的问题是正确的。waveOutXXXX API 是古老的(它早于 Windows 95)并且需要比您想象的更容易出错的编码。使用 C++ 与 API 交互比使用 C# 更容易。只要确保这是您真正想做的事情。

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

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

于 2008-09-25T00:29:51.160 回答