PHZ76 / RtspServer

RTSP Server , RTSP Pusher
MIT License
990 stars 356 forks source link

内存异常增长问题 #85

Open 11hwu2 opened 1 year ago

11hwu2 commented 1 year ago

使用rtsp_h264_file推一个H264文件,在局域网内用ffplay指定udp传输数据播放。 在网络环境较好的情况下,进程内存占用在4MB左右,偶尔丢包导致马赛克,画面延时基本在1秒左右; 在网络环境不太好的情况下,存在大量丢包,ffplay会经常输出日志: RTP missed 2 packets ,画面马赛克严重.;进程长时间运行后,视频画面(对着时钟计数器)累积延时可以达到1分钟甚至更长(4分半钟),此时进程内存占用增长至40MB甚至更高(最高86MB)。

问题大概出在对trigger_events_的操作:

bool TaskScheduler::AddTriggerEvent(TriggerEvent callback)
{
    if (trigger_events_->Size() < kMaxTriggetEvents) {
        std::lock_guard<std::mutex> lock(mutex_);
        char event = kTriggetEvent;
        trigger_events_->Push(std::move(callback));
        wakeup_pipe_->Write(&event, 1);
        return true;
    }

    return false;
}

......

void TaskScheduler::HandleTriggerEvent()
{
    do 
    {
        TriggerEvent callback;
        if (trigger_events_->Pop(callback)) {
            callback();
        }
    } while (trigger_events_->Size() > 0);
}

TaskScheduler::AddTriggerEvent由读取H264帧的线程进行RTP封包后调用; TaskScheduler::HandleTriggerEvent由任务调度主线程调用; 两个线程需要做好互斥处理,修改如下再测试,没有内存异常增长问题:

void TaskScheduler::HandleTriggerEvent()
{
    std::lock_guard<std::mutex> lock(mutex_);
    do 
    {
        TriggerEvent callback;
        if (trigger_events_->Pop(callback)) {
            callback();
        }
    } while (trigger_events_->Size() > 0);
}