构建多线程屏幕共享应用程序

时间:2020-06-30 07:27:46

标签: c++ multithreading concurrency

我正在开发一个屏幕共享应用程序。大部分时间需要完成3个主要任务:

  • 捕获屏幕框架(捕获功能)
  • 将屏幕帧编码为视频帧(编码器功能)
  • 以RTMP协议(流媒体功能)将视频帧发送到服务器

问题:

对于每个屏幕帧,这3个步骤将永远重复进行。当在单个线程中完成此操作时,性能会受到影响,我几乎无法获得30 fps。

屏幕帧的BYTE *指针被发送到编码器功能。编码后,已编码视频帧的uint8_t *指针被发送到流媒体功能。 很明显,编码器功能可以共享访问屏幕框架和视频框架。每次循环时,下一帧数据都会覆盖相同的指针。

每个任务都取决于先前的任务输出。

如何为这些任务设计多线程模型?


方法:

  1. 在更新时使用互斥体锁定屏幕框架和视频框架,使其几乎是单线程的(因为编码器功能既需要指向屏幕框架的指针又需要指向视频的指针框架,因此锁定对这些指针的访问权限意味着其他任务-捕获和流式传输-编码时无法完成)。性能提升不会很大。

  2. 使用两个import sample def some_action(): result = add(1,2) 。从捕获功能复制屏幕帧的第一个队列-编码器将从第一个队列获取副本进行编码。第二个队列从编码器功能复制每个编码的视频帧-流媒体功能将从第二个队列获取副本以发送到服务器。我不确定这是否是正确的方法。

第二种方法合理吗?

您能分享其他最佳方法吗?

0 个答案:

没有答案