Russian Qt Forum

Qt => Мультимедиа => Тема начата: ERO-X от Август 12, 2006, 08:37



Название: Показ видео средствами Qt
Отправлено: ERO-X от Август 12, 2006, 08:37
У меня вот такая задача: нужно средствами Qt-3.3.2 выводить на экран живое видео, т.е. показывать 25 картинок в секунду размером 352x288.

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

 Не подскажете как это правильно сделать?


Название: Показ видео средствами Qt
Отправлено: Admin от Август 12, 2006, 10:51
про мерцание читай на тему Double buffering


Название: Показ видео средствами Qt
Отправлено: ERO-X от Август 12, 2006, 12:18
Пробовал при помощи функции setDoubleBuffering. Но по-умолчанию двойная буферизация уже включена, тройной и четверной не предусмотрено :-)


Название: Показ видео средствами Qt
Отправлено: Admin от Август 12, 2006, 16:16
я видео показываю так:

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

PS: насколько я знаю вроде в QT3 ее надо включать, а в QT4 она по умолчанию


Название: Показ видео средствами Qt
Отправлено: ERO-X от Август 12, 2006, 18:50
По поводу двойной буферизации в HELP по Qt версии 3.3.2 сказано что она включена по умолчанию, но я не на всякий случай включаю ещё раз в программе.

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


Название: Показ видео средствами Qt
Отправлено: Admin от Август 12, 2006, 22:07
я работаю в 4, хотя в тройке была картинка в 24 бита, меньше было преобразований!

а так все стандартно!


Название: Показ видео средствами Qt
Отправлено: ERO-X от Август 12, 2006, 23:09
А в 4-й версии 32 бита? Сколько работаю с видео так и не смог воспользоваться этим лишним четвёртым байтом с пользой, который вроде как за прозрачность отвечает. Всегда лишний цикл в коде - то ставить этот лишний ноль, то наоборот убирать.

Спасибо за помощь - буду пробовать!


Название: Показ видео средствами Qt
Отправлено: Admin от Август 13, 2006, 17:20
ага этот канал сильно напрягает
лишнее преобразование


Название: Показ видео средствами Qt
Отправлено: alex0303 от Август 13, 2006, 19:22
В 3-ке QImage 32-х разрядный. (8 и 1 бит не в счёт)
Внутренности QPixmap - не известно и не гарантируются. Может зависить от видеорежима и т.д. Т.е.
Для показа видео (и именно видео в его бытовом понимании YUV 422 и прочие) практически все плейеры используют оверлеи (в терминах видеокарты).
В винде черех директшоу. В линуксе через либы расширений Иксов.


Название: Показ видео средствами Qt
Отправлено: SLiDER от Август 13, 2006, 20:49
Цитата: "alex0303"
Для показа видео (и именно видео в его бытовом понимании YUV 422 и прочие) практически все плейеры используют оверлеи (в терминах видеокарты).
В винде черех директшоу. В линуксе через либы расширений Иксов.


Я недавно, в теме про mp3, уже говорил и тут осмелюсь предложить, если в проекте на Qt требуется работа с мультимедиа (звук, видео и даже OpenGL), имет смыл обратить внимание на SDL (http://www.libsdl.org), особенно если нужна (или может понадобиться впоследствии) кроссплатформенность. Библиотека весьма мощная и шустрая, с очень неплохо продуманой архитектурой. И лицензия LGPL. Так что рекомендую.


Название: Показ видео средствами Qt
Отправлено: ERO-X от Август 14, 2006, 18:11
Цитата: "alex0303"
В линуксе через либы расширений Иксов.


У меня как раз Линукс, работаю в нём недолго, раньше в Виндовз средствами DirectX пользовался для показа видео. Нельзя ли поподробнее про расширения Х? Нет ли у тебя какого-нибудь примера с с использованием Х для видео?


Название: Показ видео средствами Qt
Отправлено: Admin от Август 14, 2006, 20:49
SDL хороша как либа, только пример бы к ней внятный с QT
я в свое время ее пользовал


Название: Показ видео средствами Qt
Отправлено: Admin от Август 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_


Название: Показ видео средствами Qt
Отправлено: ERO-X от Август 16, 2006, 07:30
А мне дали умную и книгу и я сделал, чтоб картинка в label не мерцала при показе. Тут 3 момента:
1) Установить флаг WNoAutoErase
2) Вызвать метод setBackgroundMode и передать ему флаг NoBackground
3) Включить двойную буферизацию

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


Название: Показ видео средствами Qt
Отправлено: Admin от Август 16, 2006, 10:55
ну я вот щас с 3 работаю! они 3 выжирают весь CPU!
попробуй тоже!

мне понравилось что я у себя избавился от QImage! не надо теперь в нее конвертить


Название: Показ видео средствами Qt
Отправлено: ERO-X от Август 16, 2006, 22:14
У меня вообще смешно: я по сети получаю кадры в JPEG с 16-ти камер. Самым быстрым оказалось скидывать их файлами на винт и считатывать QPixmap->load(). Удивительно, но как-либо разжимать самому по ресурсам намного медленнее, не помогают даже самые оптимизированные библиотеки.

Зато реально теперь открываю одновременно по 8 окошек и с половины камер смотрю видео - не реайлтайм, но 10 кадров примерно с каждой показывает!

Но у нас наверно есть принципиальная разница в проектах: у меня Линукс (МСВС).
А DirectX всё таки самое мощное решение под Винду, быстрее него ничего не видел. Даже если его только для показа использовать - и то большое преимущество. Программировать кажется сложно, но привыкнуть к COM идеологии реально :-) Я на нём такое писал, что даже самому теперь страшно :-)


Название: Показ видео средствами Qt
Отправлено: Admin от Август 16, 2006, 23:01
QT пользуется libjpeg, так что используя ее можно добится той же производительности

Если сеть быстрая, то лучше bmp пользовать

А у меня проект кросплатформенный, так что еще предстоит Linux(Debian)+SDL+QT


Название: Показ видео средствами Qt
Отправлено: ERO-X от Август 17, 2006, 00:37
У меня тоже кроссплатформенный, всё кроме как ни странно интерфейса.
Сетевые и системные части кода после долгих усилий работают и в Винде и в Линуксе.

Сеть не быстрая, тестирую на 100mb, но реально будут коммутаторы на Е1.

Вообще с Линуксом намучался. Он же изначально создавался многими людьми как снежный ком. В итоге gcc абсолютно не оптимизирует код, куча багов и глюков в самой системе. Конечно бы юниксовое что-нибудь в духе Solaris или FreeBSD, но не я это решаю к сожалению...


Название: Показ видео средствами Qt
Отправлено: Admin от Август 17, 2006, 15:00
я бы тоже про windows сказал
но у меня интерфейс на QT написан и почти кросплаформенный

щас появимлись только 2 вещи
1. интерфейс общения с web камерой
2. отображение, раньше было QImage и тормозило


Название: Показ видео средствами Qt
Отправлено: ERO-X от Август 17, 2006, 15:28
А какого типа интерфейс для камеры у тебя? Не VFW?

К Винде у меня в целом хорошее отношение, программировать приятнее. Среда разработки удобнее, документация цивильнее.

Кажется отвлеклись от темы форума...


Название: Показ видео средствами Qt
Отправлено: Admin от Август 17, 2006, 21:10
в windows оказалость что только DirectX позволяет снимать сразу с 2 камер

в linux используем video4linux

PS: а VC6 самая удобная среда


Название: Показ видео средствами Qt
Отправлено: Вудруф от Август 18, 2006, 07:15
Цитировать
а VC6 самая удобная среда

С, пожалуй, самой плохой поддержкой стардарта C++, которую я когда-либо видел.


Название: Показ видео средствами Qt
Отправлено: troorl от Август 18, 2006, 07:50
Цитата: "ERO-X"
У меня тоже кроссплатформенный, всё кроме как ни странно интерфейса.
Сетевые и системные части кода после долгих усилий работают и в Винде и в Линуксе.

Сеть не быстрая, тестирую на 100mb, но реально будут коммутаторы на Е1.

Вообще с Линуксом намучался. Он же изначально создавался многими людьми как снежный ком. В итоге gcc абсолютно не оптимизирует код, куча багов и глюков в самой системе. Конечно бы юниксовое что-нибудь в духе Solaris или FreeBSD, но не я это решаю к сожалению...

[offtop]
Сорри за оффтоп, но не удержался...
Насчёт Линуха я в корне с тобой не согласен. Для того, чтобы его использовать, его сначала нужно понять. Виндовые принципы здесь просто не работают. Поэтому не разобравшись, ты скорее всего наделал уйму тривиальных ошибок, которые тебе потом показались багами.
Лично я просто плююсь (в бувальном смысле), когда мне приходиться загружать Windows, а тем более что-то в ней писать. Это как после навороченного бимера сесть в запорожец :) Но здесь всё дело в понимании системы, так что убедить кого-то просто так нельзя. К этому можно только прийти самому.
[/offtop]


Название: Показ видео средствами Qt
Отправлено: Admin от Август 18, 2006, 10:44
Цитата: "Вудруф"
Цитировать
а VC6 самая удобная среда

С, пожалуй, самой плохой поддержкой стардарта C++, которую я когда-либо видел.


да я поставил себе VC2005
он меня обругал, что вместо функций printf надо пользовать printf_s
а где я ее в линуксе возму

Моя цепочка такова:
VC6 + Intel compilator 8.0 + gcc3 или 4

они спокойно понимают код и собирают его


Название: Показ видео средствами Qt
Отправлено: ERO-X от Август 18, 2006, 12:38
Цитата: "troorl"
Насчёт Линуха я в корне с тобой не согласен.


Это спор из серии что лучше: VC или DELPHI. Можно часами рассуждать...
Пользоваться Линухом я сам обучался, и советчиков не хватает. Но когда после вылета программы начинаю семафоры в ручную удалять, по многоинформационному сообщению "segmentation fault" думать из-за чего же она вылетает и использовать более чем скромные отладочные средства KDevelop... Молчу про оптимизацию - как ни старался арифметики на 30% медленнее по сравнению с VC.
Единственное что всегда радовало - сеть в Линухе действительно намного стабильнее Винды.
И Линухи опять же разные есть. Мой МСВС не лучший его пример.

Ну и оффтом развели однако...

добавлено спустя 7 минут:

 
Цитата: "Admin"
да я поставил себе VC2005
он меня обругал, что вместо функций printf надо пользовать printf_s


У меня чтоб всё работало и в Винде и в Линухе вообще есть файл, где я все основные системные и сетевые функции сам описал и в зависимости от текущей платформы подставляются уже нужные функции. По-другому не смог придумать: скажем создание потоков, таймеров, функции получения системного времени, сигналы достаточно отличаются в Линухе и в Винде.

VC2005 мне не понравился. Так и пользуюсь VC2003 - самое оптимальное на мой взгляд.


Название: Показ видео средствами Qt
Отправлено: Вудруф от Август 18, 2006, 13:10
В винде gcc действительно медленноват. Но в linux'е он у меня показывал весьма шустрые результаты, превосходящие MinGW и сравнимые с VS. И всё это с более хорошей поддержкой стандарта.


Название: Показ видео средствами Qt
Отправлено: ERO-X от Август 18, 2006, 14:15
Цитата: "Вудруф"
В винде gcc действительно медленноват. Но в linux'е он у меня показывал весьма шустрые результаты, превосходящие MinGW и сравнимые с VS. И всё это с более хорошей поддержкой стандарта.


Брал какой-нибудь алгоритм (типа JPEG) на чистом С, и замечал время выполнения в Винде и в Линухе при максимальной оптимизации (о3). В Винде примерно на 30% быстрее. Intel-компилятор ни там ни там не использовался, но с ним всё равно такая статистика.
Может конечно и не так что установил...


Название: Показ видео средствами Qt
Отправлено: Admin от Август 18, 2006, 16:23
насчет "segmentation fault" в линуксе

запускаем прогу в отладчике :
ddd proga или kdbg proga

еще полезные тулзы
strace
valgrind

так что операционки обе хороши


Название: Показ видео средствами Qt
Отправлено: bigirbis от Август 18, 2006, 18:03
OFFTOP
Цитировать
Мой МСВС не лучший его пример

Что за версия-то? Qt4-то под него еще не сделали?  :lol:
Я бы вообще его с Линуксом не ровнял - очень старый код. Разговаривал с челом, который ядро под тройку переделывал. Сказал, что в следующих версиях они такого количества граблей не сделают.   :lol:


Название: Показ видео средствами Qt
Отправлено: ERO-X от Август 19, 2006, 21:16
Цитата: "bigirbis"
OFFTOP
Я бы вообще его с Линуксом не ровнял - очень старый код. Разговаривал с челом, который ядро под тройку переделывал. Сказал, что в следующих версиях они такого количества граблей не сделают.   :lol:


МСВС 3.0: ядро 2.4.31-vniins40. Ставлю на него KDE и вот так вот работаю. Qt 3-я версия в нём. Не знаю, может ВНИИНС и новее чего уже сделал - моя компания пока не приобрела.
Хорошая или нет - зелёные друзья других не признают! :-)
Вообще не понимаю почему юниксовое ядро в МСВС не использовали...

добавлено спустя 4 минуты:

 
Цитата: "Admin"
насчет "segmentation fault" в линуксе

запускаем прогу в отладчике :
ddd proga или kdbg proga

еще полезные тулзы
strace
valgrind

так что операционки обе хороши

Сейчас попробую...  Спасибо за совет!! Чувствуется мне ещё учиться и учиться! После Винды тут пока вот кто-нибудь не скажет или кучу умных книг не прочитаешь...


Название: Показ видео средствами Qt
Отправлено: Admin от Август 19, 2006, 22:11
для линукса полезно что бы guru рядом сидел

так было в моем случае, щас я консультрую :)


Название: Показ видео средствами Qt
Отправлено: ERO-X от Август 20, 2006, 12:25
А в моём случае не было к сожалению... :-(

На работе даже интернет на рабочем месте не положен. Только ICQ через свой же мобильный телефон, от которого мало пользы.

Но с другой стороны прогресс уже не малый!