音频播放器会自动处置
更改音频文件时,音频播放器会被处置。该应用程序在共享\音频文件夹中的文件中播放顺序音频。第一个文件播放还可以,但在第一次音频后停止。我使用插件.simpleaudioplayer 这是代码,我在做什么错。
public partial class MainPage : ContentPage
{
private ISimpleAudioPlayer audio;
private int pagenum;
public MainPage()
{
InitializeComponent();
}
private void playaudio(int pgnum)
{
audio = CrossSimpleAudioPlayer.Current;
audio.PlaybackEnded += cmdNextClicked;
var stream = GetStreamFromFile(string.Concat("audio.w", (pgnum + 1).ToString(), ".mp3"));
audio.Load(stream);
audio.Play();
}
Stream GetStreamFromFile(string filename)
{
var assembly = typeof(App).GetTypeInfo().Assembly;
var stream = assembly.GetManifestResourceStream("App1." + filename);
return stream;
}
private void cmdRunClicked(object sender, EventArgs e)//
{
playaudio(pagenum);
}
private void cmdStopClicked(object sender, EventArgs e)//
{
if (!(audio is null))
{
audio.Stop();
}
}
private void cmdClicked(object sender, EventArgs e)
{
audio.Seek(audio.CurrentPosition + 30.0);
}
private void cmdNextClicked(object sender, EventArgs e)
{
pagenum++;
lblPageNo.Text = pagenum.ToString();
playaudio(pagenum);
}
private void cmdPrevClicked(object sender, EventArgs e)
{
pagenum--;
lblPageNo.Text = pagenum.ToString();
playaudio(pagenum);
}
}
The audio player gets disposed when changing audio files. The app plays sequential audio in files in the shared\audio folder. The first file plays ok but stops after first audio. Im using Plugin.SimpleAudioplayer
Here's the code, what am i doing wrong.
public partial class MainPage : ContentPage
{
private ISimpleAudioPlayer audio;
private int pagenum;
public MainPage()
{
InitializeComponent();
}
private void playaudio(int pgnum)
{
audio = CrossSimpleAudioPlayer.Current;
audio.PlaybackEnded += cmdNextClicked;
var stream = GetStreamFromFile(string.Concat("audio.w", (pgnum + 1).ToString(), ".mp3"));
audio.Load(stream);
audio.Play();
}
Stream GetStreamFromFile(string filename)
{
var assembly = typeof(App).GetTypeInfo().Assembly;
var stream = assembly.GetManifestResourceStream("App1." + filename);
return stream;
}
private void cmdRunClicked(object sender, EventArgs e)//
{
playaudio(pagenum);
}
private void cmdStopClicked(object sender, EventArgs e)//
{
if (!(audio is null))
{
audio.Stop();
}
}
private void cmdClicked(object sender, EventArgs e)
{
audio.Seek(audio.CurrentPosition + 30.0);
}
private void cmdNextClicked(object sender, EventArgs e)
{
pagenum++;
lblPageNo.Text = pagenum.ToString();
playaudio(pagenum);
}
private void cmdPrevClicked(object sender, EventArgs e)
{
pagenum--;
lblPageNo.Text = pagenum.ToString();
playaudio(pagenum);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
鉴于新的症状(崩溃是从CMDNext返回之后),播放处理程序返回后的队列在上运行:
说明:启动另一个音频显然是 disposes 。原始代码启动了另一个音频,然后处理程序结束,然后返回到该音频的播放事件处理器。在该处置的音频上可以访问一些东西。因此处置了例外。
以上代码将
cmdnextClicked
调用到Mainthread队列,然后立即返回到该音频的播放。因此,在要求下一个音频之前,它有机会完成。Given the new symptom (crash happens after return from cmdNext), queue to run after PlaybackEnded handler returns:
EXPLANATION: Starting another audio apparently disposes the previous audio. Original code started another audio, then handler ends, and returns to that audio's PlaybackEnded event processor. Something is accessed on that disposed audio. Thus the disposed Exception.
The above code puts the
cmdNextClicked
call on to MainThread's queue, then immediately returns to that audio's PlaybackEnded. Which thus has a chance to finish, before the next audio is asked for.