Russian Qt Forum
Ноябрь 22, 2024, 16:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Показ видео средствами Qt  (Прочитано 20857 раз)
ERO-X
Гость
« : Август 12, 2006, 08:37 »

У меня вот такая задача: нужно средствами Qt-3.3.2 выводить на экран живое видео, т.е. показывать 25 картинок в секунду размером 352x288.

 Пробовал в QCanvasView поставить QCanvas, и методом setBackgroundPixmap ставить ему мои кадры - работает, но при этом на экране сильное мерцание, смотреть невозможно. Потом пробовал ставить кадры методом setTile. Мерцания нет, но обрабатываться успевает не более 5 кадров в секунду.

 Не подскажете как это правильно сделать?
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Август 12, 2006, 10:51 »

про мерцание читай на тему Double buffering
Записан
ERO-X
Гость
« Ответ #2 : Август 12, 2006, 12:18 »

Пробовал при помощи функции setDoubleBuffering. Но по-умолчанию двойная буферизация уже включена, тройной и четверной не предусмотрено :-)
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #3 : Август 12, 2006, 16:16 »

я видео показываю так:

в QLabel изменяю Pixmap, функцией setPixmap
мерцаний нет, правда у меня FPS примерно 15

PS: насколько я знаю вроде в QT3 ее надо включать, а в QT4 она по умолчанию
Записан
ERO-X
Гость
« Ответ #4 : Август 12, 2006, 18:50 »

По поводу двойной буферизации в HELP по Qt версии 3.3.2 сказано что она включена по умолчанию, но я не на всякий случай включаю ещё раз в программе.

setPixmap попробую, надеюсь что поможет. А всё остальное у тебя стандартно там? Никаких специфических функций? И у тебя это видео в 3 или в 4 версии работает?
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #5 : Август 12, 2006, 22:07 »

я работаю в 4, хотя в тройке была картинка в 24 бита, меньше было преобразований!

а так все стандартно!
Записан
ERO-X
Гость
« Ответ #6 : Август 12, 2006, 23:09 »

А в 4-й версии 32 бита? Сколько работаю с видео так и не смог воспользоваться этим лишним четвёртым байтом с пользой, который вроде как за прозрачность отвечает. Всегда лишний цикл в коде - то ставить этот лишний ноль, то наоборот убирать.

Спасибо за помощь - буду пробовать!
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #7 : Август 13, 2006, 17:20 »

ага этот канал сильно напрягает
лишнее преобразование
Записан
alex0303
Гость
« Ответ #8 : Август 13, 2006, 19:22 »

В 3-ке QImage 32-х разрядный. (8 и 1 бит не в счёт)
Внутренности QPixmap - не известно и не гарантируются. Может зависить от видеорежима и т.д. Т.е.
Для показа видео (и именно видео в его бытовом понимании YUV 422 и прочие) практически все плейеры используют оверлеи (в терминах видеокарты).
В винде черех директшоу. В линуксе через либы расширений Иксов.
Записан
SLiDER
Гость
« Ответ #9 : Август 13, 2006, 20:49 »

Цитата: "alex0303"
Для показа видео (и именно видео в его бытовом понимании YUV 422 и прочие) практически все плейеры используют оверлеи (в терминах видеокарты).
В винде черех директшоу. В линуксе через либы расширений Иксов.


Я недавно, в теме про mp3, уже говорил и тут осмелюсь предложить, если в проекте на Qt требуется работа с мультимедиа (звук, видео и даже OpenGL), имет смыл обратить внимание на SDL (http://www.libsdl.org), особенно если нужна (или может понадобиться впоследствии) кроссплатформенность. Библиотека весьма мощная и шустрая, с очень неплохо продуманой архитектурой. И лицензия LGPL. Так что рекомендую.
Записан
ERO-X
Гость
« Ответ #10 : Август 14, 2006, 18:11 »

Цитата: "alex0303"
В линуксе через либы расширений Иксов.


У меня как раз Линукс, работаю в нём недолго, раньше в Виндовз средствами DirectX пользовался для показа видео. Нельзя ли поподробнее про расширения Х? Нет ли у тебя какого-нибудь примера с с использованием Х для видео?
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #11 : Август 14, 2006, 20:49 »

SDL хороша как либа, только пример бы к ней внятный с QT
я в свое время ее пользовал
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #12 : Август 16, 2006, 00:28 »

подразобрался с темой

SDL как либа хороша, но все пользуют связку QT+SDL+Linux
связка QT+SDL+Win32 как НЛО, все болтают, никто не видел

DirectX для меня сложноват

реализовал классик под Windows, загрузка проца упала с 60% до 30%. Так как камер у меня 3, то что и требовалос.

вот код:
1. Массив должен быть в BGR, а не в RGB
2. Картинка будет перевернута, особнености BMP
3. Работает ХОРОШО под qt4.1.4 или qt3, в старых баг был

Код:

CFastImage::CFastImage(QWidget* parent)
 : QWidget(parent)
{
m_data=NULL;
     setAttribute( Qt::WA_PaintOnScreen, true);
     startTimer( 20);
}

CFastImage::~CFastImage()
{
if(m_data!=NULL) delete[] m_data;
}

void CFastImage::timerEvent(QTimerEvent*)
{
update();
}

void CFastImage::paintEvent(QPaintEvent* p)
{
    // just for illustration purposes. You get the same effect if you leave the paint event completely empty, too.
    QWidget::paintEvent(p);

BITMAPINFO BMP;
BMP.bmiHeader.biWidth=width;
BMP.bmiHeader.biHeight=height;
BMP.bmiHeader.biBitCount=24;

BMP.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
BMP.bmiHeader.biPlanes = 1;
BMP.bmiHeader.biCompression = BI_RGB;
BMP.bmiHeader.biSizeImage = ( ( BMP.bmiHeader.biWidth * ( BMP.bmiHeader.biBitCount >> 3 ) + 3 ) & - 4 ) * BMP.bmiHeader.biHeight;

HDC hdc = GetDC(winId());

    SetStretchBltMode( hdc, COLORONCOLOR );

StretchDIBits ( hdc , 0 , 0 , width , height , 0 , 0 , width , height , m_data , &BMP , DIB_RGB_COLORS , SRCCOPY );

    ReleaseDC(winId(), hdc);
}

QPaintEngine* CFastImage::paintEngine() const
{
     return 0;
}


Код:

#ifndef _FAST_IMAGE_H_
#define _FAST_IMAGE_H_

class CFastImage : public QWidget
{
public:
   CFastImage(QWidget* parent = NULL);
   ~CFastImage();
public:
   virtual void timerEvent(QTimerEvent*);
   void paintEvent(QPaintEvent* p);
   QPaintEngine *paintEngine() const;
public:
unsigned char* m_data;
int width;
int height;
};

#endif //_FAST_IMAGE_H_
Записан
ERO-X
Гость
« Ответ #13 : Август 16, 2006, 07:30 »

А мне дали умную и книгу и я сделал, чтоб картинка в label не мерцала при показе. Тут 3 момента:
1) Установить флаг WNoAutoErase
2) Вызвать метод setBackgroundMode и передать ему флаг NoBackground
3) Включить двойную буферизацию

Всё действительно отлично работает после этого!!
Камер в проекте у меня вообще до 16 может быть. Конечно если захотят все сразу смотреть....
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #14 : Август 16, 2006, 10:55 »

ну я вот щас с 3 работаю! они 3 выжирают весь CPU!
попробуй тоже!

мне понравилось что я у себя избавился от QImage! не надо теперь в нее конвертить
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 22.