美文网首页
iOS直播推流丢包处理方案

iOS直播推流丢包处理方案

作者: 南风无影 | 来源:发表于2016-12-12 15:08 被阅读384次

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);

相关文章

  • iOS直播推流丢包处理方案

    iOS推流一般是用aac+h264封装成flv后,推流rtmp协议大致的流程图我简单画了下 在使用过程中发现,如果...

  • Demo

    IOS视频直播 + 推流实现 采用开源框架ijkplayer 以及LFLiveKit实现推流,主要完善关注,分享和登录

  • iOS 直播 —— 推流

    推流,就是将采集到的音频,视频数据通过流媒体协议发送到流媒体服务器。 推流前的工作:采集,处理,编码压缩 推流中做...

  • iOS 直播 —— 推流

    *推流,就是将采集到的音频,视频数据通过流媒体协议发送到流媒体服务器。*推流前的工作:采集,处理,编码压缩*推流中...

  • iOS 直播 —— 推流

    推流,就是将采集到的音频,视频数据通过流媒体协议发送到流媒体服务器。 推流前的工作:采集,处理,编码压缩 推流中做...

  • iOS直播开发总结

    1、iOS客户端要实现直播功能,需要经过流程为: 采集-处理-编码-封包-推流-播放 采集: 视频通过摄像头...

  • iOS直播推流实现-推流

    将最近学习的直播推流技术做个笔记。iOS推流的主要流程如下: 视频音频采集[https://www.jianshu...

  • 直播---iOS直播推流/拉流

    工作空闲之余, 闲来无事, 弄了个直播的项目, 基本上主流的功能都有了... 直播推流(主播端直播/美颜/切换摄...

  • 直播的学习与使用-----播放

    直播原理:把直播录制的视频,推送到服务器,在由服务器发给观众看 直播环节:推流端(采集、美颜处理、编码、推流)、服...

  • 最全的连麦直播技术点整理-AnyRTC

    直播关键字 采集、前处理、编码、传输、解码、渲染, 推流, 拉流、连麦、直播、互动、RTMP 原理科普 为何一直推...

网友评论

      本文标题:iOS直播推流丢包处理方案

      本文链接:https://www.haomeiwen.com/subject/hqmmmttx.html