我想在gui线程上同步播放wav文件,但我对PlaySync的调用提前返回(并过早地停止播放)。wav文件需要2-3分钟。
下面是我的代码:
//in gui code (event handler)
//play first audio file
JE_SP.playSound("example1.wav");
//do a few other statements
doSomethingUnrelated();
//play another audio file
JE_SP.playSound("example2.wav");
//library method written by me, called in gui code, but located in another assembly
public static int playSound(string wavFile, bool synchronous = true,
bool debug = true, string logFile = "", int loadTimeout = FIVE_MINUTES_IN_MS)
{
SoundPlayer sp = new SoundPlayer();
sp.LoadTimeout = loadTimeout;
sp.SoundLocation = wavFile;
sp.Load();
switch (synchronous)
{
case true:
sp.PlaySync();
break;
case false:
sp.Play();
break;
}
if (debug)
{
string writeMe = "JE_SP: \r\n\tSoundLocation = " + sp.SoundLocation
+ "\r\n\t" + "Synchronous = " + synchronous.ToString();
JE_Log.logMessage(writeMe);
}
sp.Dispose();
sp = null;
return 0;
}我想到的一些事情是加载超时,在另一个线程上播放音频,然后通过强制gui线程等待声音文件的持续时间来手动‘冻结’gui。我尝试延长加载超时时间,但没有效果。
我不太确定获得wav文件持续时间的最好方法是什么,而不是使用不是我/微软的人编写的代码。我想这是可以计算的,因为我知道文件的大小,并且所有的编码属性(比特率,采样率,采样大小等)在我打算播放的所有文件中都是一致的。有人可以详细说明如何使用这些信息来计算wav文件的持续时间吗?也就是说,如果没有人知道为什么PlaySync会提前返回。
编辑:
注意:不久前我在VB6中遇到了类似的问题,但这是由超时引起的,我不认为这是一个问题。较短(< 1分钟)的文件似乎播放得很好,所以我可能会决定手动编辑较长的文件,然后通过多次调用分别播放它们。
附加信息:我注意到同一文件在同一时间一致地停止。这些文件是使用Audacity创建的。有没有可能PlaySync期望文件的特定编码与我的Audacity生成的编码不同?
发布于 2011-02-01 04:40:14
为了防止其他人在同步播放一个大的wav文件时遇到问题,我写了一个使用WMP作为替代的方法:
public static int playSoundWMP(string soundFile, bool synchronous = true)
{
Stopwatch sw = new Stopwatch();
sw.Start();
wmp.URL = soundFile;
wmp.controls.play();
Thread.Yield();
while (wmp.playState == WMPLib.WMPPlayState.wmppsTransitioning)
{
Application.DoEvents();
Thread.Yield();
}
int duration = Convert.ToInt32(wmp.currentMedia.duration * 1000);
double waitTime = wmp.currentMedia.duration;
if (synchronous)
{
Thread.Sleep(duration);
}
long elapsed = sw.ElapsedMilliseconds;
sw.Stop();
sw = null;
return (int) wmp.currentMedia.duration * 1000;
}此方法使用WMP来播放音频文件,而不是SoundPlayer类,因此它可以更可靠地播放较大的wav文件。
https://stackoverflow.com/questions/4696284
复制相似问题