如何播放非PCM文件或动态转换为PCM?

时间:2012-09-12 17:49:59

标签: c# delphi audio wav pcm

以下代码适用于某些wav文件,但我得到的是“InvalidOperationException未处理.Info = Sound API仅支持播放PCM wave文件。”

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(它们从网址下载然后在本地播放)或者可能采用不同的方式播放这些文件PlaySync()......

3 个答案:

答案 0 :(得分:1)

查看mitov的audiolab库。它很棒

答案 1 :(得分:1)

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

你的问题的标题声称“转换”但身体声称“播放”

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


您也可以尝试在没有DirectX中间的情况下直接使用FFDShow编解码器。 http://en.wikipedia.org/wiki/Libavcodechttp://libav.org/以及http://ffmpeg.org/(他们最近有分裂)

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


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


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

答案 2 :(得分:0)

这样做的方法是在http://www.codeproject.com/Articles/175030/PlaySound-A-Better-Way-to-Play-Wav-Files-in-C?msg=4366037#xx4366037xx

使用newkie的代码

在我的情况下,至少,我必须将所有小写的x更改为大写的x,以使其工作。