Как правильно расположить медиаплеер UWP? - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть кусок кода для проверки возможности воспроизведения списка мультимедиа. Проблема в том, что когда я запускаю метод и позволяю ему завершить sh или отменить его с помощью CancellationToken, MediaPlayer продолжает загружать контент и никогда не завершает работу, даже если у меня есть using и вызову Dispose(). Может быть, я делаю что-то не так ... Небольшая помощь очень ценится. Большое спасибо! Вот код:

CancellationTokenSource tokenSource = new CancellationTokenSource();
private async Task CheckMediaAsync(CancellationToken token)
{
    using (MediaPlayer mediaplayer = new MediaPlayer { IsMuted = true, AutoPlay = true })
    {
        List<Link> links = DataAccess.GetAllMedia();
        for (int i = 0; i < links.Count; i++)
        {
            mediaplayer.Source = MediaSource.CreateFromUri(new Uri(links[i].LinkMed));

            if (await Task.Run(() => CheckUntilTimeout(token, mediaplayer), token))
            {
                OffileMedia.Add(links[i].Name);
            }

            if (tokenSource.IsCancellationRequested)
            {
                mediaplayer.Source = null;
                mediaplayer.Dispose();
                return;
            }
        }
        mediaplayer.Source = null;
        mediaplayer.Dispose();
    }
}

private bool CheckUntilTimeout(CancellationToken ct, MediaPlayer mp)
{
    Stopwatch stopwatch = Stopwatch.StartNew();
    while (stopwatch.Elapsed < TimeSpan.FromSeconds(8))
    {
        if (ct.IsCancellationRequested)
        {
            stopwatch.Stop();
            return false;
        }

        if (mp.PlaybackSession.PlaybackState == MediaPlaybackState.None)
        {
            stopwatch.Stop();
            return true;
        }
        else if (mp.PlaybackSession.PlaybackState == MediaPlaybackState.Playing)
        {
            stopwatch.Stop();
            return false;
        }
    }

    stopwatch.Stop();
    return true;
}

Редактировать:
После некоторых других проверок кажется, что проблема действительно в MediaPlayer объекте. Если я попытаюсь установить Source в качестве аудиопотока, например:

http://icecast.unitedradio.it/Radio105.mp3
http://icecast.unitedradio.it/Virgin.mp3

или любой другой аудиопоток, MediaPlayer продолжит загрузку каждого из них, даже если для Source установлено значение null или Dispose() это. Любопытно, что если попытаться любой поток видео (m3u8 or mpd), кажется, работает правильно.

1 Ответ

1 голос
/ 22 апреля 2020

Вы бы скорее должны располагать соответствующим MediaSource соответствующим образом, чтобы прекратить загрузку, кроме удаления MediaPlayer.

Таким образом, правильные шаги для удаления MediaPlayer, в настоящее время воспроизводящего MediaSource, созданный из Uri, являются ...

  1. Приостановите воспроизведение на MediaPlayer.
  2. Отсоедините MediaSource от MediaPlayer.
  3. Утилизируйте MediaSource * и MediaPlayer.

* Поскольку класс MediaSource также имеет интерфейс IDisposable, может быть лучше заключить блок кода в предложение using (...) {}. Тогда вам не нужно вызывать Dispose явно.

private async Task CheckMediaAsync(CancellationToken token)
{
    using (MediaPlayer mediaplayer = new MediaPlayer { IsMuted = true, AutoPlay = true })
    {
        List<Link> links = DataAccess.GetAllMedia();
        for (int i = 0; i < links.Count; i++)
        {
            using (MediaSource ms = MediaSource.CreateFromUri(new Uri(links[i].LinkMed)))
            {
                mediaplayer.Source = ms;

                if (await Task.Run(() => CheckUntilTimeout(token, mediaplayer), token))
                {
                    OffileMedia.Add(links[i].Name);
                }
                mediaplayer.Pause();
                mediaplayer.Source = null;
            }
            if (tokenSource.IsCancellationRequested)
            {
                //mediaplayer.Source = null;
                //mediaplayer.Dispose();
                return;
            }
        }
        //mediaplayer.Source = null;
        //mediaplayer.Dispose();
    }
}
...