日期:2014-05-18  浏览次数:21114 次

C# VS2005 使用Media中的SoundPlayer, 在线程中SoundPlayer.PlaySync(); 在声音没有播放完的时候线程退出了, 请问问是怎么回事呢?
1.
Thread soundThread = new Thread(new ThreadStart(PlayWav));
soundThread.Start();

public void PlayWav()
{
  SoundPlayer soundPlayer = new SoundPlayer();
  soundPlayer.SoundLocation = "Test.wav";
  soundPlayer.PlaySync();
}

声音没有播放完,线程就退出了 不知道为什么
The thread 0x8e0 has exited with code 0 (0x0).

还有几个问题一起问一下吧, 我是新人分不多 对不住了

2.
要实现声音播放完后,通知一下用户,该怎么做呢?
a.
上面用PlaySync() 它使用UI线程 当声音播放完毕后 触发事件 按说应该就可以 结果线程退出了,不是很清楚
搜了一下http://topic.csdn.net/t/20020911/17/1015574.html 上面说的方法

"如果是静态从缓冲区,则判断缓冲区的播放位置是否到达你给定的最大缓冲区位置  
 用GetCurrentPosition方法,这要求不停的判断。还可以应用通告的方法。  
  将缓冲区的最大处设置一事件,当声音播放到结尾时会将此事件置位。"

但是不清楚如何实现

b.
SoundPlayer.Play() 可以很正常的播放完的
不过我如何控制它自己开辟的线程呢?
或者 SoundPlayer.Stream.Length 和 SoundPlayer.Stream.Position 如何在它开辟的线程里获得 Stream.Position?

总之实现 播放完毕后 通知一下用户 大家 帮帮忙啦


3.
a.
像 F-IN-BOX 这种直接从内存中播放Flash实现的原理是什么呢?

在 http://blog.csdn.net/whoo/archive/2005/01/09/246153.aspx 中 博主通过管道来实现Flash的播放
在 FlashPlayer9 或 flash9f.ocx 中好像不行

下面有人留言 "创建一个不可见、只能当前句柄的程序可访问的虚拟硬盘" 或许就是 为什么那控件能卖299刀的原因吧
C# 创建虚拟硬盘 ....完全都没有概念 WMI ?.....

b.
flash9f.ocx中MovieData 这个该如何使用呢? 也有人说从这里着手

c.
flash9f.ocx中的Movie属性只能赋值 URL 或 绝对路径
内存里的东西如何 虚拟一个路径出来 虚拟一个文件出来?.....


本人菜鸟一个 上面很多词是我自己杜撰的, 用错的还望见谅.
集思广益 大家帮帮忙 呵呵~! 先谢谢了







------解决方案--------------------
[DllImport("winmm.dll")]
private static extern bool PlaySound(string szSound, int hMod, PlaySoundFlags flags);

[System.Flags]
public enum PlaySoundFlags : int
{
SND_SYNC = 0x0000,
SND_ASYNC = 0x0001,
SND_NODEFAULT = 0x0002,
SND_LOOP = 0x0008,
SND_NOSTOP = 0x0010,
SND_NOWAIT = 0x00002000,
SND_FILENAME = 0x00020000,
SND_RESOURCE = 0x00040004
}

看看这个尝试下