zoukankan      html  css  js  c++  java
  • udp 视频包网络传输花屏

        视频数据传输在传输层可以选择TCP或者UDPTCP面向连接,传输中断,发送端是知道的。TCP传输的好处是不丢包,坏处是网络不太好的情况下会越堵越严重。UDP非面向连接,发送端只管发送数据,接收端有没有接收到不管。UDP的好处应该是实时性,坏处显而易见:网络抖动大时数据会丢失严重,出现我们常说的花屏的情况。有一些情况是网络也“正常”,ping包延时很低。但是接收端也会出现花屏。这是什为何呢?下面我将讲述这种情况如何解决。

          如果视频发送端视频数据播放正常,接收端播放视频花屏,第一件事情就是WireShark抓包。WireShark会告诉你很多问题点。有一种情况是发送端每次发送的数据包过大。一般交换机MTU单元设置一次通过的数据包大小是1500字节。如果WireShark显示很多fragment(分片)说明数据包被拆分。两种解决方案,要么增大MTU值,要么重新组包,保证数据包的大小在MTU范围内。正常情况下,要求网络工程师设置通用值1500字节。因为很多库比如Ffmpeg就遵守这个值。在实际的项目中我就遇到过接收端播放视频花屏,怎么修改代码都没有,最后定位的数据包的网络传输,让网络工程师修改MTU,问题才得以解决。

        包大了不行,小了同样也会有问题。这个问题是本文的另一作者皑雪发现并解决的,问题是单个数据包太小接收端播放视频同样出现花屏,我所遇到的网络环境里没有碰到这种情况数据包小了,多发几次也没出现花屏。这个问题的解决方法是如果包太小先缓存,等数据包够数时一起发送。下面给出解决问题的基本代码(代码是皑雪写的)。

    #define BUFFER_LEN   1480

    if (m_nBufferLen + nDataSize < BUFFER_LEN)

    {

    memcpy(m_pchBuffer + m_nBufferLen, (char*)pkt + RTP_HEAD_LEN, nDataSize);

    m_nBufferLen += nDataSize;

    }

    else

    {

    SendData(pthis->sendtransport, m_pchBuffer, m_nBufferLen);

     memset(m_pchBuffer, 0, sizeof(m_pchBuffer));

    m_nBufferLen = 0;

    memcpy(m_pchBuffer, (char*)pkt + RTP_HEAD_LEN, nDataSize);

    m_nBufferLen = nDataSize;

    }

  • 相关阅读:
    MySQL基础知识总结
    PHP常见算法
    PHP程序功能设计
    SVN配置使用及移植
    推荐一个SpringBoot + Vue + MyBatis 音乐网站项目
    累积sql常用查询语句「Oracle」
    Nginx服务器设置http/https正向代理,使用ngx_http_proxy_connect_module模块
    squid配置文件
    nginx命令
    k8s与Docker有啥关系
  • 原文地址:https://www.cnblogs.com/wanggang123/p/5765287.html
Copyright © 2011-2022 走看看