音频播放器会自动处置

发布于 2025-02-14 02:07:08 字数 1543 浏览 3 评论 0原文

更改音频文件时,音频播放器会被处置。该应用程序在共享\音频文件夹中的文件中播放顺序音频。第一个文件播放还可以,但在第一次音频后停止。我使用插件.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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

空城缀染半城烟沙 2025-02-21 02:07:09

鉴于新的症状(崩溃是从CMDNext返回之后),播放处理程序返回后的队列上运行:

// NOTE: As Christopher Richmond commented, move this to a place that is only called once.
audio.PlaybackEnded += SafePlayNext;
...

private void SafePlayNext(object sender, EventArgs e)
{
    // Queue to run after return.
    Device.BeginInvokeOnMainThread(() =>
        cmdNextClicked(null, null));   // Arguments not used, `null` works fine.
}

说明:启动另一个音频显然是 disposes 。原始代码启动了另一个音频,然后处理程序结束,然后返回到该音频的播放事件处理器。在该处置的音频上可以访问一些东西。因此处置了例外。

以上代码将cmdnextClicked调用到Mainthread队列,然后立即返回到该音频的播放。因此,在要求下一个音频之前,它有机会完成。

Given the new symptom (crash happens after return from cmdNext), queue to run after PlaybackEnded handler returns:

// NOTE: As Christopher Richmond commented, move this to a place that is only called once.
audio.PlaybackEnded += SafePlayNext;
...

private void SafePlayNext(object sender, EventArgs e)
{
    // Queue to run after return.
    Device.BeginInvokeOnMainThread(() =>
        cmdNextClicked(null, null));   // Arguments not used, `null` works fine.
}

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文