C# Xamarin窗体异步播放声音
我可以使用Xamarin表单(Android和iOS)成功播放声音,但我还需要实现以下目标:C# Xamarin窗体异步播放声音,c#,audio,xamarin,xamarin.ios,task,C#,Audio,Xamarin,Xamarin.ios,Task,我可以使用Xamarin表单(Android和iOS)成功播放声音,但我还需要实现以下目标: 我需要等待,这样,如果多个声音被“播放”,一个将在下一个之前完成 我需要返回一个布尔值来指示操作是否成功 以下是我当前的简化代码(适用于iOS平台): 我曾希望听到的音频文件1,然后文件2,然后文件3。然而,我只听到文件1,代码似乎没有到达第二个等待 谢谢我想你这里的问题是,AVAudioPlayer\u播放器在完成之前就被清除了。如果要将调试添加到FinsihedPlaying,您会注意到您从未达
- 我需要等待,这样,如果多个声音被“播放”,一个将在下一个之前完成
- 我需要返回一个布尔值来指示操作是否成功
谢谢我想你这里的问题是,
AVAudioPlayer\u播放器
在完成之前就被清除了。如果要将调试添加到FinsihedPlaying
,您会注意到您从未达到这一点
尝试一下这些更改,我制作了一个私有的AVAudioPlayer
来坐在任务之外
(我使用以下指南作为参考)
public异步void play()
{
系统。诊断。调试。写入线(“播放1”);
等待播放音频任务(“wave2.wav”);
系统.诊断.调试.写入线(“播放2”);
等待播放音频任务(“wave2.wav”);
系统。诊断。调试。写入线(“播放3”);
等待播放音频任务(“wave2.wav”);
}
私人AVAudioPlayer播放器;//将玩家置于任务之外
公共任务PlayAudioTask(字符串文件名)
{
var tcs=new TaskCompletionSource();
//有声音播放吗?
如果(玩家!=null)
{
//停止并处理任何声音
player.Stop();
player.Dispose();
}
字符串filePath=NSBundle.MainBundle.PathForResource(
Path.GetFileNameWithoutExtension(文件名),Path.GetExtension(文件名));
var url=NSUrl.FromString(文件路径);
player=AVAudioPlayer.FromUrl(url);
player.FinishedPlaying+=(对象发送者,AVStatusEventArgs e)=>
{
System.Diagnostics.Debug.WriteLine(“完成播放”);
player=null;
tcs.SetResult(真);
};
player.NumberOfLoops=0;
System.Diagnostics.Debug.WriteLine(“开始播放”);
player.Play();
返回tcs.Task;
}
我想你这里的问题是
AVAudioPlayer\u播放器在完成之前就被清除了。如果要将调试添加到FinsihedPlaying
,您会注意到您从未达到这一点
尝试一下这些更改,我制作了一个私有的AVAudioPlayer
来坐在任务之外
(我使用以下指南作为参考)
public异步void play()
{
系统。诊断。调试。写入线(“播放1”);
等待播放音频任务(“wave2.wav”);
系统.诊断.调试.写入线(“播放2”);
等待播放音频任务(“wave2.wav”);
系统。诊断。调试。写入线(“播放3”);
等待播放音频任务(“wave2.wav”);
}
私人AVAudioPlayer播放器;//将玩家置于任务之外
公共任务PlayAudioTask(字符串文件名)
{
var tcs=new TaskCompletionSource();
//有声音播放吗?
如果(玩家!=null)
{
//停止并处理任何声音
player.Stop();
player.Dispose();
}
字符串filePath=NSBundle.MainBundle.PathForResource(
Path.GetFileNameWithoutExtension(文件名),Path.GetExtension(文件名));
var url=NSUrl.FromString(文件路径);
player=AVAudioPlayer.FromUrl(url);
player.FinishedPlaying+=(对象发送者,AVStatusEventArgs e)=>
{
System.Diagnostics.Debug.WriteLine(“完成播放”);
player=null;
tcs.SetResult(真);
};
player.NumberOfLoops=0;
System.Diagnostics.Debug.WriteLine(“开始播放”);
player.Play();
返回tcs.Task;
}
苹果的AVAudioPlayer参考-Xamarin-使用AVAudioPlayer播放声音-苹果的AVAudioPlayer参考-Xamarin-使用AVAudioPlayer播放声音-
public Task<bool> PlayAudioTask(string fileName)
{
var tcs = new TaskCompletionSource<bool>();
string filePath = NSBundle.MainBundle.PathForResource(
Path.GetFileNameWithoutExtension(fileName), Path.GetExtension(fileName));
var url = NSUrl.FromString(filePath);
var _player = AVAudioPlayer.FromUrl(url);
_player.FinishedPlaying += (object sender, AVStatusEventArgs e) =>
{
_player = null;
tcs.SetResult(true);
};
_player.Play();
return tcs.Task;
}
var res1 = await _audioService.PlayAudioTask("file1");
var res2 = await _audioService.PlayAudioTask("file2");
var res3 = await _audioService.PlayAudioTask("file3");
public async void play()
{
System.Diagnostics.Debug.WriteLine("Play 1");
await PlayAudioTask("wave2.wav");
System.Diagnostics.Debug.WriteLine("Play 2");
await PlayAudioTask("wave2.wav");
System.Diagnostics.Debug.WriteLine("Play 3");
await PlayAudioTask("wave2.wav");
}
private AVAudioPlayer player; // Leave the player outside the Task
public Task<bool> PlayAudioTask(string fileName)
{
var tcs = new TaskCompletionSource<bool>();
// Any existing sound playing?
if (player != null)
{
//Stop and dispose of any sound
player.Stop();
player.Dispose();
}
string filePath = NSBundle.MainBundle.PathForResource(
Path.GetFileNameWithoutExtension(fileName), Path.GetExtension(fileName));
var url = NSUrl.FromString(filePath);
player = AVAudioPlayer.FromUrl(url);
player.FinishedPlaying += (object sender, AVStatusEventArgs e) =>
{
System.Diagnostics.Debug.WriteLine("DONE PLAYING");
player = null;
tcs.SetResult(true);
};
player.NumberOfLoops = 0;
System.Diagnostics.Debug.WriteLine("Start Playing");
player.Play();
return tcs.Task;
}