2008-09-24 152 views
3

我有一个通过套接字发送数据的服务器,数据是一个wav'文件'。我可以很容易地将数据写入磁盘,然后在WMP中播放,但我不知道如何从插槽读取数据。可能吗?流式传输wav文件

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

这是用于原生C++的窗口。

回答

3

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

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

  • 你有足够的数据来开始播放
  • 当你的插座缺少数据和你有什么发送到播放缓冲区
  • 你能够处理的情况下以足够的速度从插槽读取数据以保持播放缓冲区已满

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

+0

我说:“这是在本地C++的窗户”,所以我想我是明确的足够:-) – gbjbaanb 2008-09-25 12:10:31

0

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

如果您的数据流是WAV文件数据(如MP3或WMA)以外的其他格式,则必须执行将数据解码为WAV格式并使用waveOutXXXX API播放的额外步骤。找到一个很好的组件来做MP3解码比你想象的要复杂 - 我认为这与Fraunhofer许可情况有关(如果你使用MP3编码,你应该支付)。

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

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 - (微软波形文件,inlcluding压缩wav文件。 PCM,MP3和IMA ADPCM压缩的WAV