ImSjt / RtspServer

RTSP服务器,支持传输H.264和AAC格式的音视频
606 stars 254 forks source link

there are some question about threadpool and task ? #2

Closed wusopp closed 5 years ago

wusopp commented 5 years ago

h264_rtsp_server.cpp :

H264FileMediaSource::H264FileMediaSource(UsageEnvironment* env, std::string& file) { for(int i = 0; i < DEFAULT_FRAME_NUM; ++i) mEnv->threadPool()->addTask(mTask); }

1、您好,我对上面这部分代码不太明白这部分用意。这部分使用线程池,为什么默认为4个任务呢?线程池调用执行readFrame() 进行生产者进行数据提取,在h264_rtsp_server.cpp 中仅是从文件中提取h264数据,这时4个任务对应着4个线程,这里采用线程池,是不是仅为了加速还是什么原因呢? PS:我测试了下,一个任务同样可以支持多路播放。 2、生产者直接放入queue中,消费者则定时的从queue中取数据,二者之间会不会出现数据缓存过多,造成的延时问题呢?

ImSjt commented 5 years ago

你好 第一个问题:首先要明白放进线程池里的任务只会被运行一次,然后就被移除线程池的任务队列,并不是每个任务对应一个线程,两者没有直接关系。默认是四个任务是因为生产者的AVFrame默认四个,一开始就加入四个任务目的是为了把缓存先填满。这里使用线程池的原因一方面是为了加速,因为读取文件或者是编码是比较费时的,一方面是为了耦合 第二问题:你可以仔细看一看生产者,里面默认就是四个AVFrame,还有两个队列(一个入队列,一个出队列),我是借此实现了一个循环队列。缓存区最多的个数只有DEFAULT_FRAME_NUM个,而只有当有空闲的AVFrame时,才会往线程池里加入任务(可以看一看RtpSink::timeoutCallback),所以不会造成溢出

wusopp commented 5 years ago

你好 第一个问题:首先要明白放进线程池里的任务只会被运行一次,然后就被移除线程池的任务队列,并不是每个任务对应一个线程,两者没有直接关系。默认是四个任务是因为生产者的AVFrame默认四个,一开始就加入四个任务目的是为了把缓存先填满。这里使用线程池的原因一方面是为了加速,因为读取文件或者是编码是比较费时的,一方面是为了耦合 第二问题:你可以仔细看一看生产者,里面默认就是四个AVFrame,还有两个队列(一个入队列,一个出队列),我是借此实现了一个循环队列。缓存区最多的个数只有DEFAULT_FRAME_NUM个,而只有当有空闲的AVFrame时,才会往线程池里加入任务(可以看一看RtpSink::timeoutCallback),所以不会造成溢出

大佬,十分感谢你的回答,请及时关闭问题呀