C# UWP MediaPlayer停止播放声音

C# UWP MediaPlayer停止播放声音,c#,audio,uwp,C#,Audio,Uwp,我正在使用MediaPlayer类()在我的UWP项目中播放声音。这一切在开始时都可以正常工作,但Play()调用突然开始“播放”声音(例如,PlaybackSession的状态为“播放”),但没有声音输出 Dictionary<string, MediaPlayer> Effects = new Dictionary<string, MediaPlayer>(); public async Task LoadEffects() { Effe

我正在使用MediaPlayer类()在我的UWP项目中播放声音。这一切在开始时都可以正常工作,但Play()调用突然开始“播放”声音(例如,PlaybackSession的状态为“播放”),但没有声音输出

 Dictionary<string, MediaPlayer> Effects = new Dictionary<string, MediaPlayer>();

 public async Task LoadEffects()
    {
        Effects?.Clear();
        StorageFolder folder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync("sounds");
        foreach (var effect in await folder.GetFilesAsync())
        {
            MediaPlayer snd = new MediaPlayer();
            snd.AutoPlay = false;
            snd.Source = MediaSource.CreateFromStorageFile(effect);
            snd.RealTimePlayback = true;
            snd.AudioCategory = MediaPlayerAudioCategory.GameMedia;
            Effects.Add(effect.DisplayName, snd);
        }
        IsLoaded = true;
    }
 public void StartPlaying(string name, float volume = 1.0f, bool force = false)
    {
      lock (_instance)
        {
            if (Effects.ContainsKey(name))
            {
                   //if force is true, force the sound to stop and play again otherwise just exit
                    if (Effects[name].PlaybackSession.PlaybackState == MediaPlaybackState.Playing && !force)
                    {
                        return;
                    }
                    Effects[name].Pause();
                    Task.Delay(100).ContinueWith((res) =>
                    {
                        Effects[name].Volume = volume;
                        Effects[name].PlaybackSession.Position = TimeSpan.Zero;
                        Effects[name].IsLoopingEnabled = true;
                        Effects[name].Play();
                    });
            }
        }
}

public void StopPlaying(string name)
    {
        lock (_instance)
        {
            try
            {
               //if nothing is playing just return
                if (Effects[name].PlaybackSession.PlaybackState != MediaPlaybackState.Playing) return;
            }
            catch(Exception ex)
            {
                //weird error happens sometimes, catch it and just return
                return;
            }
            if (Effects.ContainsKey(name))
            {
                Debug.WriteLine($"Stopping {name} now; state before: {Effects[name].PlaybackSession.PlaybackState.ToString()}");
                Effects[name].IsLoopingEnabled = false;
                Effects[name].Pause();

                Effects[name].PlaybackSession.Position = TimeSpan.Zero;
            }
        }
    }
Dictionary Effects=newdictionary();
公共异步任务LoadEffects()
{
效果?.Clear();
StorageFolder folder=等待Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(“声音”);
foreach(wait folder.getFileAsync()中的var效应)
{
MediaPlayer snd=新的MediaPlayer();
snd.AutoPlay=false;
snd.Source=MediaSource.CreateFromStorageFile(效果);
snd.RealTimePlayback=true;
snd.AudioCategory=MediaPlayerAudioCategory.GameMedia;
Effects.Add(effect.DisplayName,snd);
}
IsLoaded=true;
}
public void StartPlaying(字符串名称,浮动卷=1.0f,bool force=false)
{
锁(_实例)
{
if(效果。容器(名称))
{
//如果force为true,则强制声音停止并再次播放,否则退出
if(Effects[name].PlaybackSession.PlaybackState==mediapybackstate.Playing&&!force)
{
返回;
}
效果[名称]。暂停();
任务。延迟(100)。继续((res)=>
{
效果[名称]。体积=体积;
效果[name].PlaybackSession.Position=TimeSpan.Zero;
效果[name].IsLoopingEnabled=true;
效果[名称]。播放();
});
}
}
}
公共空间(字符串名称)
{
锁(_实例)
{
尝试
{
//如果什么都没有,就回来吧
if(Effects[name].PlaybackSession.PlaybackState!=mediapybackstate.Playing)返回;
}
捕获(例外情况除外)
{
//有时会发生奇怪的错误,抓住它,然后返回
返回;
}
if(效果。容器(名称))
{
Debug.WriteLine($“立即停止{name};之前的状态:{Effects[name].PlaybackSession.PlaybackState.ToString()}”);
效果[name].IsLoopingEnabled=false;
效果[名称]。暂停();
效果[name].PlaybackSession.Position=TimeSpan.Zero;
}
}
}
我注意到,当我不使用Task.Delay()时,这种情况似乎发生得更频繁。
锁被使用了,因为我有一个singleton类。

您能提供一个锁吗?您的代码片段不足以重现您的问题。这里使用的
力是什么?这是用于重新播放媒体的代码段吗?停止播放声音,画面如何?我添加了加载和停止声音的功能。希望现在足以重现。。。有一件事需要注意:它并不总是发生。只有在停止和重放4-5次之后。另一件事是,声音文件很短。你能提供一个声音文件吗?您的代码片段不足以重现您的问题。这里使用的
力是什么?这是用于重新播放媒体的代码段吗?停止播放声音,画面如何?我添加了加载和停止声音的功能。希望现在足以重现。。。有一件事需要注意:它并不总是发生。只有在停止和重放4-5次之后。另一件事是,声音文件很短。