RTSP丢包处理原理及doubango代码改进

简介: RTSP丢包处理原理及doubango代码改进

在做视频时,发现有时丢包很严重。当然,头目甲提拔的研发总监李某,根本就没有解决难题的想法。所以,这个问题只能是吾解决了。终端使用的是doubango,吾研究了代码,先后设计了两个方案,做了大量改动。如有兴趣,可以详细了解。


 首先是自己管理丢包功能。本来这个方案也是可行的,适用于P2P模式。而李某只做了服务器转发,转发时会更改RTSP报文的信息,进而导致服务器拒绝发送报文。这个方案测试之后只能放弃。


 后来吾在代码中发现,已经有处理丢包的代码。吾仔细研究之后,搞明白了,当然也是很简单的处理办法。经过深入分析,吾搞了一套完备的丢包处理。看看tdav_session_video.c中,吾修改的一个函数,说明如下:


// From jitter buffer to codec
static int _tdav_session_video_jb_cb(const tdav_video_jb_cb_data_xt* data)
{
    tdav_session_video_t* video = (tdav_session_video_t*)data->usr_data;
    tdav_session_av_t* base = (tdav_session_av_t*)data->usr_data;
    tmedia_session_t* session = (tmedia_session_t*)data->usr_data;
    switch (data->type) {
    default:
        break;
    case tdav_video_jb_cb_data_type_rtp: {
        return _tdav_session_video_decode(video, data->rtp.pkt);
    }
    case tdav_video_jb_cb_data_type_tmfr: {
        base->time_last_frame_loss_report = tsk_time_now();
        _tdav_session_video_local_request_idr(session, "TMFR", data->ssrc);
    }
    case tdav_video_jb_cb_data_type_fl: {
        base->time_last_frame_loss_report = tsk_time_now();
        if(data->fl.count > TDAV_SESSION_VIDEO_PKT_LOSS_MAX_COUNT_TO_REQUEST_FIR) {
            _tdav_session_video_local_request_idr(session, "TMFR", data->ssrc);
        }
        else if (base->avpf_mode_neg || base->is_fb_nack_neg)
        { // AVPF?
            if (data->lost_pkt_info_list)
            {
                //想了想,还是暂时不公开。等……再说。
            }
            /*else if (data->fl.count > 0)
            {
                // 这个代码我看明白了。
                // 每16个为一组进行发送。
                // i 进行分组,
                // k 是分组中的变量,
                // j 是每组的数量。
                // Send RTCP-NACK
                tsk_size_t i, j, k;
                uint16_t seq_nums[16];
                for (i = 0; i < data->fl.count; i+=16) {
                    for(j = 0, k = i; j < 16 && k < data->fl.count; ++j, ++k) {
                        seq_nums[j] = (uint16_t)(data->fl.seq_num + i + j);
                        TSK_DEBUG_INFO("Request re-send(%u)", seq_nums[j]);
                    }
                    trtp_manager_signal_pkt_loss(base->rtp_manager, data->ssrc, seq_nums, j);
                }
            }*/
        }
        break;
    }
    case tdav_video_jb_cb_data_type_fps_changed: {
        if (base->congestion_ctrl_enabled) {
            video->fps_changed = tsk_true;
            if (video->decoder.codec) {
                TSK_DEBUG_INFO("Congestion control enabled and fps updated from %u to %u", data->fps.old, data->fps.new);
                TMEDIA_CODEC_VIDEO(video->decoder.codec)->in.fps = data->fps.new;
            }
            tsk_mutex_lock(video->h_mutex_qos);
            session->qos_metrics.video_in_avg_fps = (session->qos_metrics.video_in_avg_fps + data->fps.new) / (video->in_avg_fps_n++ ? 2 : 1);
            tsk_mutex_unlock(video->h_mutex_qos);
        }
        break;
    }
    }
    return 0;
}


 在tdav_video_jb.c中,吾重新设计了丢包的判断、保存,然后再通过这里发送。


 那么改进效果如何?效果极为明显。丢包30%时画面都可以接受。吾还专门进行了统计、显示。在南昌进行投标演示的时候,在视频画面上显示出来,这样画面变差时很令人信服。


 这个只是丢包检测完成后的重发请求。其实还有大量的修改。

目录
相关文章
|
存储 人工智能 搜索推荐
SuperAGI 一个开发优先的开源自主人工智能代理框架
供应、生成和部署自主人工智能代理
|
测试技术
西门子S7-200 SMART自由口通信,如何编写发送程序,使用超级终端发送测试
今天我们学习编写西门子S7-200 SMART自由口通信的发送程序,并使用超级终端进行发送功能测试。首先设置参数,打开STEP7 Micro/WIN SMART编程软件,右键单击项目树中的CPU,选择打开,在打开的系统块中选择CPU类型和信号板类型。设置信号板,串口的类型为RS232,地址为2,波特率为9600。
西门子S7-200 SMART自由口通信,如何编写发送程序,使用超级终端发送测试
|
Web App开发 编解码 算法
发现一个非常好用的RTC(实时音视频通信)方案,做直播和视频通话都很牛
HaaS RTC是阿里云IoT联合视频云开发的IoT设备端上的实时通讯服务,主要面向直播,音视频通话等各种场景。
2755 2
发现一个非常好用的RTC(实时音视频通信)方案,做直播和视频通话都很牛
|
JavaScript 开发者
Vue 创建项目后没有 webpack.config.js(vue.config.js) 文件
Vue 创建项目后没有 webpack.config.js(vue.config.js) 文件
703 0
|
7月前
|
机器学习/深度学习 计算机视觉
YOLOv11改进策略【Head】| (独家改进)结合 ICME-2024 中的PPA注意力模块,自研带有注意力机制的小目标检测头
YOLOv11改进策略【Head】| (独家改进)结合 ICME-2024 中的PPA注意力模块,自研带有注意力机制的小目标检测头
170 10
YOLOv11改进策略【Head】| (独家改进)结合 ICME-2024 中的PPA注意力模块,自研带有注意力机制的小目标检测头
|
编解码 小程序
微信小程序11177版本开启控制台方法
微信小程序11177版本开启控制台方法
|
传感器 机器学习/深度学习 编解码
音视频同步的方法:深入探索基于FFmpeg的音视频同步策略(二)
音视频同步的方法:深入探索基于FFmpeg的音视频同步策略
1002 1
|
编解码 UED
音视频同步的方法:深入探索基于FFmpeg的音视频同步策略(一)
音视频同步的方法:深入探索基于FFmpeg的音视频同步策略
1690 1
|
域名解析 存储 网络协议
基于 Wireshark 分析 UDP 协议
基于 Wireshark 分析 UDP 协议