如何播放非PCM文件或即时转换为PCM?

4
以下代码适用于某些wav文件,但对于其他一些文件会出现“InvalidOperationException was unhandled. Message=Sound API only supports playing PCM wave files.”的错误提示。
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格式。

因此,我需要一种方法,在下载这些文件后(它们是从一个url下载并在本地播放),能够即时将CCITT u-Law格式转换为PCM格式,或者使用与PlaySync()不同的播放方式来播放这些文件。


1
你还期望有哪些格式? - Daniel Hilgarth
@Daniel:我没有期望任何东西;我认为.wav文件就是.wav文件,所以当一个文件播放正常而另一个文件不能时,我感到相当困惑。 - B. Clay Shannon-B. Crow Raven
1
不,.wav 有很多变种。http://en.wikipedia.org/wiki/WAV - David Heffernan
3个回答

1

看一下 Mitov 公司的 audiolab 库,它效果非常不错。


4
好的,明天我会去查看。 - B. Clay Shannon-B. Crow Raven
现在我知道了“I accidentally”模因中缺失的动词 :-) - Arioch 'The
Mitov似乎只适用于Embarcadero产品,这有点“90年代”的感觉(曾经我是Delphi的铁杆支持者,但那已经过去了...) - B. Clay Shannon-B. Crow Raven
@Clay,嘿,Delphi不是20世纪90年代的技术了 :-) 几天前Embarcadero发布了Delphi XE3 - TLama
@Clay WUT?Mitov Software 提供 Delphi、C++ Builder、Visual C++ MFC/Win32 和 .NET 2.0-4.0(C#、Visual Basic、C++/CLI、J#)。透明桥接 VCL<->MFC 单独不太像 Borland。现在也不是 .Net 的优势了。 - Arioch 'The
显示剩余2条评论

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

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

本答案是关于播放文件的。


您也可以尝试直接使用FFDShow编解码器,而无需通过DirectX中间件。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#方面使用这些C或C++ API是否容易。


1
但是 OP 想在 C# 中播放 wave 文件,而不是在 Delphi 中。无论如何,您不需要使用 DSPack 包装器,请查看您可以多么简单地 播放文件,因此在 Delphi 中,您只需使用 DirectShow 标头即可 ;-) - TLama
@TLama根据Henry的说法,那些头文件只是他的DSPack复制粘贴而来,他对此非常不满。他期望EMB只是克隆它们,并且永远不会维护。 - Arioch 'The
@TLama Bass 也有 .Net API。 - Arioch 'The
“您想播放文件还是转换文件?” - 我更喜欢直接播放它,但是.NET的Soundplayer类需要.wav文件是PCM .wav文件,并拒绝播放CCITT u-Law .wav文件。因此,如果没有直接播放CCITT u-Law .wav文件的方法,我将需要在播放时将它们即时转换为PCM .wav文件格式。 - B. Clay Shannon-B. Crow Raven
关于 https://github.com/ermau/libav.net,我无法理解它的作用。我以前从未听说过FFmpeg。我的目的是播放CCITT u-Law方言的.wav文件。我很难相信没有一个相当简单的方法来播放这样的文件,或者至少将文件转换为PCM方言(在此之后,我可以使用现有代码播放它)。 - B. Clay Shannon-B. Crow Raven
显示剩余3条评论

0

1
“x” 不必大写,但必须被替换掉。(它是一些奇怪的 Unicode “x”) - Chad Schouggins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接