SoudPlayer 一遍又一遍地播放同一个文件[关闭]

Posted

技术标签:

【中文标题】SoudPlayer 一遍又一遍地播放同一个文件[关闭]【英文标题】:SoudPlayer plays the same file again and again [closed] 【发布时间】: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 函数吗? 【参考方案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 按预期加载流。

【讨论】:

谢谢,这有帮助,你知道为什么一些智者不赞成这个问题吗?周围都是奇怪的人…… 人们有时很快就会投反对票。但总的来说,它有助于确保您的问题在最初发布时格式正确且完整(例如,包括所有相关代码)。

以上是关于SoudPlayer 一遍又一遍地播放同一个文件[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 OnPreRender 被一遍又一遍地调用?

一遍又一遍地运行代码

CoreData关系一遍又一遍地保存了两个

为啥在反应的“useState”钩子中一遍又一遍地设置初始状态

Google Cloud Run 一遍又一遍地错误运行

如何防止 Firebase 一遍又一遍地创建同一个用户?