【问题标题】:How to play non-PCM file or convert it to PCM on the fly ?如何播放非 PCM 文件或即时将其转换为 PCM?
【发布时间】:2012-09-14 15:47:07
【问题描述】:

以下代码适用于一些 wav 文件,但我得到的其他代码,“InvalidOperationException 未处理。Message=Sound API 仅支持播放 PCM 波形文件。”

var webClient = new WebClient();
webClient.DownloadFile(url, fileName);
var fileSound = new SoundPlayer(fileName);
fileSound.PlaySync();

有没有办法以编程方式检查 wav 文件是否“坏”(不是 PCM 波形文件),然后根据需要进行转换?

奇怪的是,代码可以在旧版 Delphi 应用程序中运行 - 所有 wav 文件都可以正常播放。这是 Delphi 代码:

filename := GetEnvironmentVariable('TEMP')+'\archieAndDingbat.wav';
URLDownloadToFile(nil, PChar(url), PChar(filename), 0, nil);
PlaySound(filename);

我在资源管理器中查看了这两个文件的属性,发现确实存在差异。对于播放的文件,其音频格式为 PCM;不会玩的是CCITT u-Law。

所以...我需要一种在下载这些文件后即时从 CCITT u-Law 转换为 PCM 的方法(它们是从 url 下载然后在本地播放),或者可能是一种不同的播放这些文件的方式PlaySync() ...

【问题讨论】:

  • 您还期待哪些其他格式?
  • @Daniel:我什么都不期待;我以为 .wav 文件是 .wav 文件是 .wav 文件,所以当一个播放正常而另一个播放不正常时,我感到非常困惑。
  • 不,.wav 的很多变体en.wikipedia.org/wiki/WAV

标签: c# delphi audio wav pcm


【解决方案1】:

查看 mitov 的 audiolab 库。效果很好

【讨论】:

  • 好的,我明天去捷克。
  • 好吧,现在我知道“我不小心”模因的缺失动词 :-)
  • Mitov 似乎只适用于 Embarcadero 产品,这是“1990 年代”(曾经我是 Delphi 的死忠,但那时……)
  • @Clay,嘿,Delphi 不是 1990 年代 :-) 几天前 Embarcadero 发布了 Delphi XE3
  • @Clay WUT? Mitov Software 提供 Delphi、C++ Builder、Visual C++ MFC/Win32 和 . NET 2.0-4.0(C#、Visual Basic、C++/CLI、J#) 透明桥 VCLMFC 单独不是很无聊。 .Net novadays 也不是。
【解决方案2】:

那么,你想播放文件还是转换它?首要目标是什么?您播放它是为了证明您可以转换它,还是因为您不知道如何播放未转换的文件而转换它? http://www.catb.org/esr/faqs/smart-questions.html#goal

您的问题标题声称“转换”,但正文声称“播放”

这个答案是关于播放文件的。


您也可以尝试直接使用 FFDShow 编解码器,无需 DirectX 中间。 http://en.wikipedia.org/wiki/Libavcodechttp://libav.org/http://ffmpeg.org/(他们最近分裂了)

谷歌搜索“FFDShow dotnet”、“libav dotnet”、“ffmpeg dotnet”显示了一堆使用它的库,例如


还有 BASS 库。它的目标是在游戏过程中播放声音,因此它可能具有较少的格式范围并且用于重新编码的内容不多。仍然有许多音乐播放器是建立在它之上的。有人说它是最简单易用的 API。所以值得考虑。 http://www.un4seen.com/


http://MediaInfo.sf.net 是一个库(本机 win32/win64 DLL),允许检查大多数多媒体格式的内容。 我不知道在 C# 方面使用 tis C 或 C++ API 是否容易。

【讨论】:

  • 但是 OP 想在 C# 中播放波形文件,而不是在 Delphi 中。无论如何,您不需要使用 DSPack 包装器,请查看play a file 的简单程度,因此在 Delphi 中您可以只使用 DirectShow 标头;-)
  • @TLama 根据亨利的说法,这些标题只是他的 DSPack 复制粘贴,他对此非常不满。他预计 EMB 只是克隆了它们并且永远不会维护。
  • @TLama Bass 也有 .Net API
  • "你想播放文件还是转换它" - 我宁愿只播放它,但 .NET 的 Soundplayer 类要求 .wav 文件是 PCM .wav 文件,并且拒绝播放 CCITT u-Law .wav 文件。因此,如果无法直接播放 CCITT u-Law .wav 文件,我需要将它们即时从 CCITT u-Law 转换为 PCM .wav 文件格式。
  • IOW,我只想播放文件;我不在乎如何,只要它有效,代码/库是免费或开源的 - 越少混乱越好。
【解决方案3】:

方法是使用newkie的代码在:http://www.codeproject.com/Articles/175030/PlaySound-A-Better-Way-to-Play-Wav-Files-in-C?msg=4366037#xx4366037xx

不过,至少在我的情况下,我必须将所有小写 x 更改为大写 x,才能使其正常工作。

【讨论】:

  • 'x' 不必大写,但必须替换。 (这是一些奇怪的 unicode 'x')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 2020-09-22
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
相关资源
最近更新 更多