iOS直播推流丢包处理方案

iOS推流一般是用aac+h264封装成flv后,推流rtmp协议
大致的流程图我简单画了下

iOS推流.png

在使用过程中发现,如果主播推流网络卡了M分钟(很常见),这时候编码后的数据如果不丢的话,还会把老的(编码后的)数据陆陆续续推上去(可能要N分钟才能推完),这时候播放器有丢包处理,X分钟后恢复正常,但是体验其实不算太好,因为推流端没丢包,本来不该推上去的老数据,还是推上去了,这样播放器即使丢包了,还是会看到老数据,会造成几个不好的结果:

  1. 播放器过了很久才恢复到实时。
  2. 无谓的带宽浪费了。
  3. 在那段恢复的时间内,延迟大。

所以,要丢包,编码出来的包,如果队列很大,说明推不上去,那这时候,应该丢掉一部分。


我的思路是: 根据包的队列或者buffer, 换算成时间单位s, 如果>3s, 就丢掉一半,或者丢的只剩3s。
根据pts为阀值来判断,丢掉某个pts之前的数据。
丢包的时候,视频包要注意一下,很老的I帧包可以丢,但是临近阀值的时候,就不能丢,丢到I帧前一帧。
如果不能按照pts丢,那就只能用size大小来丢帧。
这个策略和播放的丢包其实是一样的。

Size大小丢帧:

           //当前帧的size追加到m_bufferSize
            increaseBuffer(size);
           //如果超过了最大缓冲buf,且又是视频I帧,置一下标志位
           if(m_bufferSize > kMaxSendbufferSize && isKeyframe) {
                m_clearing = true;
                //Todo 记录丢帧次数,满足条件就重连
            }
            m_networkQueue.enqueue([=]() {
                size_t tosend = size;
                uint8_t* p ;
                buf->read(&p, size);
                //如果没到max_buf,则视频I/P帧,音频I帧都输出,如果超过max_buf,只写视频I帧
                while(tosend > 0 && !this->m_ending && (!this->m_clearing || this->m_sentKeyframe == packetTime)) {
                    this->m_clearing = false;
                    size_t sent = m_streamSession->write(p, tosend);
                    p += sent;
                    tosend -= sent;
                    this->m_throughputSession.addSentBytesSample(sent);
                    if( sent == 0 ) {
                        dispatch_semaphore_wait(m_networkWaitSemaphore, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)));
                    }
                }

              this->increaseBuffer(-int64_t(size)); //m_bufferSize -= size

消息回调的函数中,把重连的消息抛上去

      setClientState(kClientStateBlock);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 教程一:视频截图(Tutorial 01: Making Screencaps) 首先我们需要了解视频文件的一些基...
    90后的思维阅读 4,792评论 0 3
  • 现今移动直播技术上的挑战要远远难于传统设备或电脑直播,其完整的处理环节包括但不限于:音视频采集、美颜/滤镜/特效处...
    大荣纸阅读 8,236评论 5 22
  • 360页,51个故事。都是短篇。作家的体裁,有写情感,工作,成长,鸡汤类的文章。而本书,却是写精神病患者的世界和思...
    走在雨的缝中阅读 618评论 1 1
  • 李笑来把人分为表现型和进取型,表现型的人更在意的是别人对自己的评价,害怕自己表现不够好,所以感觉不行的话,就干脆放...
    问天eric阅读 351评论 0 0
  • 错的人相遇之后总会离开 而对的人会一直在那里 在最好的年纪遇到你 算我倒霉 但我肯定会遇到更好的人 以及那个更好的...
    叶力力阅读 894评论 3 2