2016-12-13 11 views
1

Я не уверен, что это Xamarin специфическая или родная проблема.ios h264 рендеринг видео отлично работает, перезапущен 15 раз больше не видно видео

Я создаю свой ViewRenderer и в OnElementChanged мой UIImageView.

 base.OnElementChanged(e); 
     Foundation.NSError error; 
     var session = AVFoundation.AVAudioSession.SharedInstance(); 
     session.SetCategory(AVFoundation.AVAudioSession.CategoryPlayAndRecord, out error); 

     if (error != null) 
     { 
      ClientLogger.Instance.Log("Error im MediaViewRenderer creating AV session, error code: " + error.Code, ClientLogger.LogLevel.Error); 
     } 

     //_control = e.NewElement as CustomMediaView; 
     UIKit.UIImageView surface = new UIKit.UIImageView(); 
     if (surface != null) 
     { 
      this.SetNativeControl(surface); 

Я создаю мой videolayer, если он является недействительным и множество связанных и Frames каждый раз, когда я сделать:

  if (_surface != null) 
      { 
       if (_videoLayer == null && IsRunning) 
       { 
        _videoLayer = new AVSampleBufferDisplayLayer(); 
        _videoLayer.VideoGravity = AVLayerVideoGravity.ResizeAspect.ToString(); 

        _timeBase = new CMTimebase(CMClock.HostTimeClock); 

        _videoLayer.ControlTimebase = _timeBase; 
        _videoLayer.ControlTimebase.Time = CMTime.Zero; 
        _videoLayer.ControlTimebase.Rate = 1.0; 

        _surface.Layer.AddSublayer(_videoLayer); 
       } 

       if (_videoLayer != null) 
       { 
        //if (_videoLayer.VisibleRect == null || _videoLayer.VisibleRect.Height == 0 || _videoLayer.VisibleRect.Width == 0) 
        // ClientLogger.Instance.Log("Error iOS H264Decoder rect", ClientLogger.LogLevel.Error); 
        _videoLayer.Frame = _surface.Frame; 
        _videoLayer.Bounds = _surface.Bounds; 
       } 

я получу свой поток RTP и декодировать и отображать мое видео, как она descriped здесь:

How to use VideoToolbox to decompress H.264 video stream

Если я хочу, чтобы остановить видео, я поставил videolayer в нуль, позже surafce тоже.

  _videoLayer.Flush(); 
      _videoLayer.Dispose(); 
      _videoLayer = null; 

       _surface.Dispose(); 
       _surface = null; 

Это отлично работает и дает мне приятное видео H264 около 15 раз.

И после этого он показывает пустой фон. Видео не видно. Декодер отлично работает и, кажется, визуализирует, поверхность и видеослои не являются нулевыми.

Кажется, что нет отверстия для памяти или, по крайней мере, не такого размера, что это может быть проблемой.

Бывает на обоих iOS 9 и 10. Я думаю, что что-то не так с видеослоем?

Любая идея, почему она работает только 15 раз?

Большое спасибо за помощь или идеи!

+0

Это действительно интересно. Можете ли вы рассказать нам больше о видео, которое вы играете? – Feign

ответ

0

Поскольку вы не предоставляете весь код для процесса «остановки видео», я предполагаю, что вы не вызываете метод removeFromSuperlayer вашего свойства videoLayer, и вы не вызываете метод removeFromSuperview для ваше поверхностное свойство?

Это приведет к тому, что эти объекты все еще присутствуют в иерархии представлений и дереве слоев, и, вероятно, все еще остаются на ресурсах VT нижнего уровня. Вам нужно удалить все ссылки на эти объекты, удалив их из иерархии представлений и дерева слоев.

+0

Добро пожаловать в Stackoverflow! Это не дает ответа на вопрос. Получив достаточную репутацию, вы сможете [комментировать] (http://stackoverflow.com/help/privileges/comment) в любой должности. Если вы могли бы указать причину, по которой искатель не использует 'removeFromSuperlayer()' или 'removeFromSuperview()' правильно, ваш ответ станет интересным. – francis