一种基于收看直播数据分发乱序丢包处理方法

最近接到一个关于收看直播数据包乱序处理任务,服务端会一直在轮询发送直播的数据(也可以是升级包数据),附带有包序号和总包数以及每包的长度,各个终端接收直播数据,直到数据全部接收完为止;

一般领导安排任务的时候都是三两句话的功夫,程序员可能就需要两三天来实现这个需求,排除大神之外,我们都是再普通不过的程序员了。

组长给了一点建议:收看直播在实际场景真正用的时候,下载的文件大小可能很大,然后可能还有多个终端同时在下载,建议是集齐一小段连续片段在磁盘上写一段,最后所有片段做一个合成;
这个方案昨天上午实现了一部分后发现实际用代码实现过程中并没有那么简单,需要考虑的情况有很多种,比如分片大小和分片的起止索引,如果在网络不好的情况下,丢包处理等等。于是就自己想了一个比较偷懒的方案,实际测试过程中发现效果还不错,现在记录到博客里来;

1.接收端始终从包序号=0的时候开始接收,并记录下总包数和包长度,同时把所有的包序号保存下来;

2.每次接收到一包数据,判断包序号是否存在,存在就偏移到要写的文件位置,然后写文件,并把对应的包序号移除;

3.当所有的包序号收集完就表示所有数据接收完了。

需要注意的是:

1.由于网络原因可能出现丢包问题,在第一轮接收过程中可能丢了100包,到下一轮可能还会丢失10包,直到把所有的数据包收集完,实际测试过程中最多一次接收完需要接收5轮。

2.第一轮不接收,因为服务端会先发数据后发收看直播指令,所以当接收到的时候已经发送了好几千包数据了。

下面是具体实现代码和实际运行结果:

扫描二维码关注公众号,回复: 4766047 查看本文章

 当m_mapPacketIndex.size()==0时就表示全部接收完了;

实际发送的文件大小和接收到文件的大小一致;

 

刚刚同事说上报下载进度有问题,我先看看去;

欢迎广大网友交流讨论更好的实现方案。

猜你喜欢

转载自blog.csdn.net/u014162133/article/details/85162402