ios h264视频渲染工作正常,重启15次,没有视频可见了

时间:2016-12-13 14:18:50

标签: ios video xamarin h.264

我不确定它是Xamarin特定还是原生问题。

我正在创建我的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);

如果它是null,我创建我的视频图层,并在每次渲染时设置bound和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流并解码和显示我的视频,就像在这里描述的那样:

How to use VideoToolbox to decompress H.264 video stream

如果我想停止视频,我将视频图层设置为空,稍后也会将视频图层设置为空。

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

                _surface.Dispose();
                _surface = null;

效果很好,给我一个很好的H264视频大约15次。

之后它仅显示空白背景。没有视频可见。解码器工作正常,似乎渲染,Surface和videolayer不为空。

似乎没有记忆孔或至少没有大小可能是一个问题。

发生在iOS 9和10上。 我认为视频层有问题吗?

知道它为什么只能工作15次左右?

非常感谢你提供一些帮助或想法!

1 个答案:

答案 0 :(得分:0)

由于您没有提供所有代码,因此请停止视频"过程中,我假设你没有调用videoLayer属性的removeFromSuperlayer方法而你没有调用表面属性的removeFromSuperview方法?

这将导致这些对象仍然存在于视图层次结构和层树中,并且很可能仍然保留在较低级别的VT资源上。您需要通过从视图层次结构和层树中删除对这些对象的所有引用来删除它们。