Видео все еще загружается после выпуска экземпляра AVPlayer - PullRequest
1 голос
/ 20 февраля 2012

У меня проблемы с моим видеопроигрывателем, который использует AV Foundation API и воспроизводит клип по прогрессивной загрузке 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-адрес видео. Я делаю что-то не так в коде инициализации / выпуска?

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

1 Ответ

2 голосов
/ 21 февраля 2012

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

m_player.ReplaceCurrentItemWithPlayerItem(new AVPlayerItem()); 

Загрузка видео прервана.

...