流WAV文件
我有一台通过套接字发送数据的服务器,该数据是wav"文件"。我可以轻松地将数据写入磁盘,然后在WMP中播放,但是我不知道从套接字读取数据时该如何播放。是否有可能?
额外的问题:如果流是mp3或者其他格式,我该怎么办?
这适用于本机C ++中的Windows。
解决方案
因为我们已经说过WMP,所以我假设这个问题适用于尝试在Windows计算机上播放wav文件。如果不是,则此答案不相关。
我们想做的事并不简单。在代码项目上有一篇很好的文章介绍了Windows音频模型。它描述了如何设置音频设备以及如何将数据流传输到设备中以进行播放。我们"仅"需要提供来自套接字的数据作为回放缓冲区的数据。但这就是所有棘手的工作所在。我们必须确保
- 我们有足够的数据来开始播放
- 处理套接字缺少数据而没有任何内容要发送到播放缓冲区的情况
- 我们能够以足够的速度从套接字读取数据,以保持播放缓冲区已满
这是一个有趣的练习。但是很棘手。
马克说这是一个棘手的问题是正确的。 waveOutXXXX API是古老的(早于Windows 95),并且比我们想象的需要更多的易于出错的编码。与C#相比,与C ++中的API交互将使工作更加轻松。只需确保这是我们真正想要做的。
如果流是WAV文件数据以外的其他格式(例如MP3或者WMA),则我们必须执行将数据解码为WAV格式并使用waveOutXXXX API播放的添加步骤。找到一个好的组件来进行MP3解码比我们想象的要棘手,我认为这与Fraunhofer许可情况有关(如果我们以任何方式使用MP3代码,都应该向他们付费)。
我会找到一个现成的产品来做到这一点,除非我们想要学习的经验。
马克说这是一个棘手的问题是正确的。如果我们使用DirectSound而不是waveOut,则可能不会那么棘手。这是一篇有关从磁盘流化wave文件的文章:从网络流化本质上是相同的过程。在开始之前,请确保我们从网络收集了足够的数据,并且希望获得比本文提到的2个缓冲区更多的缓冲区。
FMOD更加棘手。从常见问题解答:
增强的互联网功能
- 互联网音频流。包括自定义的互联网流代码,可以实现无缝的SHOUTcast,Icecast和http流支持。
- 下载功能。支持网络文件的FMODs模块化文件系统的副作用是,即使静态样本也可以从Internet上加载。
文件格式支持:FMOD当前支持多种音频文件格式。
部分清单:
- MP3-(MPEG I / II第3层,包括VBR支持)
- OGG-(Ogg Vorbis格式)
- WAV-(Microsoft Wave文件,包括压缩的WAV。PCM,MP3和IMA ADPCM压缩的WAV