C# UWP MediaPlayer停止播放声音
我正在使用MediaPlayer类()在我的UWP项目中播放声音。这一切在开始时都可以正常工作,但Play()调用突然开始“播放”声音(例如,PlaybackSession的状态为“播放”),但没有声音输出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
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次之后。另一件事是,声音文件很短。