Видео по-прежнему загружается после выпуска экземпляра AVPlayer

У меня проблемы с моим видеоплеером, который использует API AV Foundation и воспроизводит клип через прогрессивную загрузку по HTTP. Даже когда AVPlayer выпущен, я все еще загружаю видеоклип (наблюдается с помощью анализатора HTTP-трафика).

Мой плеер инициализируется так:

m_player = new AVPlayer();
m_playerLayer = new AVPlayerLayer();
m_playerLayer.Player = m_player;

Затем, когда у меня есть URL-адрес видео:

m_url = new NSUrl (...); 
m_asset = new AVAsset(m_url);
m_asset.AddObserver(this, new NSString ("playable"), NSKeyValueObservingOptions.Initial | NSKeyValueObservingOptions.New, AVPlayerAssetObservationContext);

Когда меня уведомляют, что актив доступен для воспроизведения, я создаю AVPlayerItem:

m_playerItem = new AVPlayerItem(m_asset);
if (m_player.CurrentItem != m_playerItem)
{
  m_player.ReplaceCurrentItemWithPlayerItem (m_playerItem);    
}

У меня видео воспроизводится без проблем. Затем, когда я нажимаю кнопку «Назад», у меня есть механизм, который вызывает метод Destroy(). Здесь я пробовал много вещей, чтобы убедиться, что мой плеер хорошо выпущен:

 if(m_player != null)
  {
    m_player.Pause();
    m_player.Dispose();
    m_player = null;
  }

  if(m_playerLayer != null)
  {
    m_playerLayer.Dispose();
    m_playerLayer = null; 
  }


  if(m_playerItem != null)
  {
    m_playerItem.Dispose();
    m_playerItem = null;
  }

  if(m_asset != null)
  {
    m_asset.CancelLoading();
    m_asset.RemoveObserver(this, new NSString("playable"));
    m_asset.Dispose();
    m_asset = null;

  }

  if(m_url != null)
  {
    m_url.Dispose();
    m_url = null;
  }

Я протестировал свое приложение с помощью отладчика и точно попал в этот код. Мои объекты, кажется, хорошо выпущены, но наверняка приложение все еще загружает URL-адрес видео. Я что-то не так делаю в коде инициализации/релиза?

Заранее благодарим за помощь!


person nicolas    schedule 20.02.2012    source источник
comment
Обходной путь, который я нашел, состоит в том, чтобы добавить m_player.ReplaceCurrentItemWithPlayerItem(new AVPlayerItem()); Загрузка видео прерывается.   -  person nicolas    schedule 20.02.2012
comment
Вы должны переместить свой комментарий в ответ и пометить его как отвеченный. Вам также следует открыть отчет об ошибке на странице bugzilla.xamarin.com с тестовым примером, потому что это должно ( по крайней мере) должны быть задокументированы, и возможно мы можем сделать что-то, чтобы сделать это проще (в API).   -  person poupou    schedule 20.02.2012
comment
Я надеюсь, что этого достаточно, чтобы поместить здесь обходной путь :-)   -  person nicolas    schedule 21.02.2012
comment
Вызов cancelPendingPrerolls исправить это?   -  person Douglas    schedule 06.05.2013


Ответы (1)


Обходной путь, который я нашел, состоит в том, чтобы добавить эту строку в код Destroy().

m_player.ReplaceCurrentItemWithPlayerItem(new AVPlayerItem()); 

После этого загрузка видео прерывается.

person nicolas    schedule 21.02.2012