【问题标题】:SoudPlayer plays the same file again and again [closed]SoudPlayer 一遍又一遍地播放同一个文件[关闭]
【发布时间】:2014-07-29 13:24:07
【问题描述】:

我正在使用 C# 在我的应用程序中进行录制。

我将语音录制到同一个文件并播放,但 SoundPlayer 播放的是第一次录制的内容。

例如我有文件test.wav,我在其中记录"hello",然后我将"hi"记录到同一个文件中

通过覆盖文件。当我播放文件test.wav时,播放器播放"hello"

我只有一个播放器实例,例如

public static System.Media.SoundPlayer Player;      

static void Main()
{           
    try
    {
        Player = new System.Media.SoundPlayer();
    }
    catch (Exception ex)
    {
    }
}

文件播放代码:

public static void Play(string fileName)
{
    if (File.Exists(fileName))
    {
        Program.Player.SoundLocation = fileName;
        Program.Player.Load();
        if (Program.Player.IsLoadCompleted)
        {
            Program.Player.Play();
        }
    }
}

我不知道这里出了什么问题。

【问题讨论】:

  • "我不知道这里出了什么问题。" - 只要你抓住并忽略所有有价值的例外,你永远不会这样做。
  • 实际加载和播放文件的代码在哪里?
  • 所以有什么例外吗?录音方法呢?
  • @UweKeim:try/catch 仅在我创建播放器时使用。
  • 感谢您添加额外的代码。每次将新文件写入磁盘时都会调用整个 Play 函数吗?

标签: c# audio


【解决方案1】:

SoundLocation 属性的 Setter 内部是一个有趣的检查:

set
{
    if (value == null)
    {
        value = string.Empty;
    }
    if (!this.soundLocation.Equals(value))
    {
        this.SetupSoundLocation(value);
        this.OnSoundLocationChanged(EventArgs.Empty);
    }
}

您可以看到它会查看新位置是否与旧位置不同。如果是这样,那么它会进行一些设置工作。如果没有,它基本上什么都不做。

我敢打赌,您可以通过执行以下操作来解决此问题:

public static void Play(string fileName)
{
    if (File.Exists(fileName))
    {
        Program.Player.SoundLocation = "";
        Program.Player.SoundLocation = fileName;
        Program.Player.Load();
        if (Program.Player.IsLoadCompleted)
        {
            Program.Player.Play();
        }
    }
}

第一次调用SoundLocation setter 将清除加载的流。然后第二个将再次使用该位置正确设置它,并允许Load 按预期加载流。

【讨论】:

  • 谢谢,这有帮助,你知道为什么一些智者不赞成这个问题吗?周围都是奇怪的人……
  • 人们有时很快就会投反对票。但总的来说,它有助于确保您的问题在最初发布时格式正确且完整(例如,包括所有相关代码)。
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2019-04-16
相关资源
最近更新 更多