В настоящее время я пытаюсь написать приложение, которое отображает «живое» видео со специализированного USB-устройства.Устройство USB обеспечивает ок.10 кадров в секунду для видео 320х240 с массивом уровней серого.Приложение написано в Qt на платформе iMx51 (800 МГц), работающей под управлением Linux и X11.Мое приложение должно отображать это видео, масштабированное в 2 раза (так, 640x480) и использовать как можно меньше процессора.
В настоящее время изображения отображаются в виде простой QLabel, которая обновляет свое растровое изображение каждый раз, когда с устройства передается новый видеокадр.Когда QLabel отображается в разрешении 320x240, видео воспроизводится плавно, и приложение использует 20% ЦП.
Когда мы пытаемся масштабировать QLabel до размера 640x480, загрузка ЦП резко возрастает, а все доступные ресурсы потребляются со скоростью 10 кадров / сек.Наше единственное средство уменьшить загрузку процессора - сбросить кадры.
Мы пытались написать виджет с настраиваемым событием рисования, чтобы сами рисовать содержимое видеоизображения, но безрезультатно, этот метод использовал немного больше ресурсов ЦП, чем QLabel.
Наши другие продукты, которыеу этого есть возможность перетаскивать изображение непосредственно в необработанный кадровый буфер (без x11), и, несмотря на их гораздо более медленные процессоры, они могут справиться с этой задачей без каких-либо проблем.Кажется, что X11 и Qt добавляют нам колоссальные накладные расходы.
Должен быть ПРАВИЛЬНЫЙ способ отображения постоянно обновляемого изображения через Qt и X11, который не так ресурсоемок.Мы изучаем возможность установки и запуска openGL ES на устройстве, но об этом пока может быть и речи.Есть ли что-то, чего мне не хватает в Qt Framework, которое позволит мне выполнить эту относительно простую задачу?