Я пишу программу, которая принимает несколько потоков RTSP и транслирует их в различные форматы. Моей первой идеей было создание потока для каждого потока для обработки получения, демультиплексирования и ремикса; затем я понял, что концептуально лучше вместо этого распределить работу по «рабочим».
Так что в итоге я получил
-
std::queue
(и связанный мьютекс) AVPacket
с для каждого потока - семафор, основанный на
std::condition_variable
- рабочий для работы с сетью io (который по существу переходит на
av_read_frame
и уведомляет семафор о каждой успешной итерации) - рабочий «потребляет» полученные пакеты из очереди (которая ожидает семафор)
Теперь, используя вышеприведенное, качество потока заметно снизилось. Я не уверен, что мой подход к балансировке нагрузки плох или как-то портит libavformat; я что-то пропустил?