Правильная обработка многопоточности FFMpeg - PullRequest
0 голосов
/ 31 марта 2020

Я пишу программу, которая принимает несколько потоков RTSP и транслирует их в различные форматы. Моей первой идеей было создание потока для каждого потока для обработки получения, демультиплексирования и ремикса; затем я понял, что концептуально лучше вместо этого распределить работу по «рабочим».

Так что в итоге я получил

  • std::queue (и связанный мьютекс) AVPacket с для каждого потока
  • семафор, основанный на std::condition_variable
  • рабочий для работы с сетью io (который по существу переходит на av_read_frame и уведомляет семафор о каждой успешной итерации)
  • рабочий «потребляет» полученные пакеты из очереди (которая ожидает семафор)

Теперь, используя вышеприведенное, качество потока заметно снизилось. Я не уверен, что мой подход к балансировке нагрузки плох или как-то портит libavformat; я что-то пропустил?

...