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;

}

转载于:https://www.cnblogs.com/wanggang123/p/5765287.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一个跨平台的应用程序开发框架,可以用来实现各种应用程序的开发,括图像处理和视频传输等。Qt提供了简单易用的API,使得开发者可以轻松编写网络传输代码。 图片及视频TCP/UDP网络传输使用Qt的QtNetwork模块来实现。通过创建QTcpServer或QUdpSocket对象来监听传入的连接或数据报,使用QTcpSocket或QUdpSocket对象来建立连接或发送数据。可以使用Qt的QImage和QPixmap类来处理图像,使用QVideoFrame和QVideoSurface类来处理视频。在使用网络传输时,需要将图像和视频转换成字节流,然后在网络传输。 为了保证网络传输的可靠性,TCP协议应该被选择。TCP协议提供了重传机制和流量控制,因此可以保证传输的准确性和稳定性。在需要实时传输的情况下,UDP协议应该被选择。UDP协议不提供重传机制和流量控制,但是传输速度更快,因此可以保证传输时延较低。 在Qt中,可以使用QDataStream类来将数据流转换成字节流,然后发送到网络中。接收方可以使用QDataStream类来接收网络中的字节流,并将其转换回原始数据流。接收方可以使用QImage、QPixmap、QVideoFrame或QVideoSurface类来处理接收到的图像和视频。 总之,Qt是一个功能强大的跨平台框架,可以用来实现图片和视频的TCP/UDP网络传输。Qt提供了易用的API和丰富的类库,使得开发者可以轻松实现网络传输的代码。在实际应用中,需要根据传输的要求和需求选择合适的TCP或UDP协议。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值