Приветствую
Продолжаю мучать перекодировку из mjpeg в libx264 с отдачей в rtsp
В целом задача выглядит как писать на флешку mjpeg 1920х1080 хотя б по 15 кадров и отдавать по запросу максимально возможное fps в rtsp с разрешением 640х480, но не меньше 15 кадров
И тут опять затык, требующий совета или поругайте идею, пожалста.
Стандартная последовательность действий такова:
- Захватываем пакет (и скорее всего его тут же пишем, но через каждый 2 кадр из 30 фреймрейт)
- Декодируем пакет во фрейм
- Масштабируем фрейм
- Кодируем фрейм в пакет
- Отправляем пакет в сокет
Как уже до меня дошло
- как минимум п.4 (кодирование) выполняется на всех ядрах цпу
- п.2 (декодирование) непонятно, полагаю в один поток идет mjpeg -> raw
- если исключить п.3 (масштабирование) с 1920х1080 -> 640x480, то фпс растет в 4 раза (получается 0.25 сек. каждый кадр, вместо 0.06 сек.)
Работа в одном потоке очевидно похожа на эстафету, когда «бежит» только один участок, поэтому очевидно надо вводить мутексы и разделять ими все участки, чтобы пока предыдущий бежит, следующий за ним этап ждет, т.е. создаем 4 потока, в котором одновременно выполняются 1 и 3, а 2 и 4,5 ждут, либо наоборот
Но насколько это поможет? ведь п.3 (масштабирование) занимает больше всего времени и получается нужно держать какой то массив входящих-исходящих фреймов (видимо по 5 пар судя по времени выполнения) и заполнять ее еще 5 потоками *безумныйсмайл*
зы. всего 4 ядра, при этом на одном потоке вижу загрузку до 130% всего лишь, но при полной задаче с машстабированием получаю всего 4 фпс ...