RtspServer
RtspServer copied to clipboard
内存异常增长问题
使用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);
}