4

以下代码适用于一些 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 文件都可以正常播放。这是德尔福代码:

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() 不同的播放这些文件的方式...

4

3 回答 3

1

查看 mitov 的 audiolab 库。效果很好

于 2012-09-12T21:08:43.000 回答
1

那么,你想播放文件还是转换它?首要目标是什么?你玩它是为了证明你可以转换它,还是因为你不知道如何播放未转换的文件而转换它? 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 is a library (native win32/win64 DLL) allowing to check most multimedia formats content. I don't know if using tis C or C++ APis is easy from C# side.

于 2012-09-13T07:51:43.453 回答
0

The way to do it is to use newkie's code at: http://www.codeproject.com/Articles/175030/PlaySound-A-Better-Way-to-Play-Wav-Files-in-C?msg=4366037#xx4366037xx

In my case, at least, I had to change all of the lowercase x's to uppercase x's, though, to get it to work.

于 2012-09-13T16:35:41.510 回答