Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с отборажением декодированного кадра, используя WIN API 
:(
    Опции темы
Incinerated
Дата 19.3.2008, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Вот есть небольшой код, который сам написал, разбирался, но вот в конце что-то не получается. Хочу отобразить на Image первый кадр видео, но функция BitBlt возвращает ошибку. Может подскажите в чем моя ошибка? (проверки на ошибки вырезаны).
Код

PAVIFILE ppfile;
PAVISTREAM ppstream;
PGETFRAME frame;
int avi,s;
long *sdata;
LPVOID data = NULL,getframe;
::AVIFileInit();
avi = ::AVIFileOpen(&ppfile,"d:\\0\\2.avi",OF_READ,NULL);
s = ::AVIFileGetStream(ppfile,&ppstream,streamtypeVIDEO,0);
frame = ::AVIStreamGetFrameOpen(ppstream,0);
getframe = ::AVIStreamGetFrame(frame,1);
BOOL temp = ::BitBlt(Image1->Picture->Bitmap->Handle,
                  0,
                  0,
                  100,
                  100,
                  getframe,
                  0,
                  0,
                  MERGECOPY);


Это сообщение отредактировал(а) Incinerated - 19.3.2008, 10:37
PM MAIL   Вверх
Andrey44
Дата 19.3.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Incinerated, а где у тебя выделяется память под getframe
или хотя бы где у тебя запись данных в эту переменную?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Incinerated
Дата 20.3.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Цитата(Andrey44 @ 19.3.2008,  15:12)
Incinerated, а где у тебя выделяется память под getframe
или хотя бы где у тебя запись данных в эту переменную?

Насколько я знаю, эта функция AVIStreamGetFrame() возвращает указатель на декодированный кадр, формата DIB. А как его отобразить, зная только указатель я не знаю...
PM MAIL   Вверх
korian
Дата 20.3.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 4
Всего: 17



во первых надо знать BITMAPINFOHEADER
Код

BITMAPINFOHEADER bmi;
//заполняем bmi теми данными, какой формат надо получить
frame = ::AVIStreamGetFrameOpen(ppstream,&bmi);
getframe = ::AVIStreamGetFrame(frame,1);

//дальше вообщем-то, getframe может использоваться как указатель на пиксели.
SetDIBits(Image1->Canvas->Handle, Image1->Picture->Bitmap->Handle, 0, bmi.biHeight, getframe, &bmi, DIB_RGB_COLORS)


и кстати не путайте битмап с девайс контекстом ::BitBlt(Image1->Picture->Bitmap->Handle - это не правильно

PM   Вверх
Andrey44
Дата 20.3.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Incinerated, точно, я когда-то делал покадровое видео.
Но исходники дома. Если найду, и если тебе еще надо то принесу.



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Incinerated
Дата 24.3.2008, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Цитата(Andrey44 @ 20.3.2008,  12:33)
Incinerated, точно, я когда-то делал покадровое видео.
Но исходники дома. Если найду, и если тебе еще надо то принесу.

если можно, очень нужно
PM MAIL   Вверх
Andrey44
Дата 24.3.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Хорошо, завтра принесу.
Написал-бы раньше, уже принес-бы. smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Andrey44
Дата 25.3.2008, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Incinerated, напиши мне в личку свое мыло - скину исходники.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Incinerated
Дата 25.3.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Цитата(korian @ 20.3.2008,  12:28)
во первых надо знать BITMAPINFOHEADER
Код

BITMAPINFOHEADER bmi;
//заполняем bmi теми данными, какой формат надо получить
frame = ::AVIStreamGetFrameOpen(ppstream,&bmi);
getframe = ::AVIStreamGetFrame(frame,1);

//дальше вообщем-то, getframe может использоваться как указатель на пиксели.
SetDIBits(Image1->Canvas->Handle, Image1->Picture->Bitmap->Handle, 0, bmi.biHeight, getframe, &bmi, DIB_RGB_COLORS)

проблема с 6 параметром, он просит указатель на BITMAPINFO, а не на BITMAPINFOHEADER.
BITMAPINFOHEADER это одна из двух частей структуры BITMAPINFO, а где брать вторую часть для этой структуры я не знаю, там нужен вроде массив RGB значений, а как его получить я не в курсе...
PM MAIL   Вверх
korian
Дата 25.3.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 4
Всего: 17



Цитата(Incinerated @  25.3.2008,  14:04 Найти цитируемый пост)
проблема с 6 параметром, он просит указатель на BITMAPINFO, а не на BITMAPINFOHEADER.

на самом деле AVIStreamGetFrameOpen тоже требует BITMAPINFO.
структура BITMAPINFOHEADER не постоянная, как раз на палитру (bmiColors для BITMAPINFO).
BITMAPINFO существует для удобства. короче там надо разбираться...
если не вдаваться в подробности, то для 32 битного формата выглядеть это будет так:

Код

BITMAPINFO bi;
memset(&bi, 0, sizeof(BITMAPINFO));
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
bi.bmiHeader.biWidth = 800; //желаемая ширина
bi.bmiHeader.biHeight = 600; //желаемая высота
bi.bmiHeader.biBitCount = 32;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biCompression = BI_RGB;
bi.bmiHeader.biSizeImage = bi.bmiHeader.biWidth * bi.bmiHeader.biHeight * 4;

frame = ::AVIStreamGetFrameOpen(ppstream,&bi.bmiHeader);
getframe = ::AVIStreamGetFrame(frame,1);
SetDIBits(Image1->Canvas->Handle, Image1->Picture->Bitmap->Handle, 0, bi.bmiHeader.biHeight, getframe, &bi, DIB_RGB_COLORS);


Это сообщение отредактировал(а) korian - 25.3.2008, 15:55
PM   Вверх
Incinerated
Дата 26.3.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



в принципе проиграть получилось, но только без звука... 
а можно ли как то проиграть потоковое аудио...
получается это следующим образом:
Код

PAVISTREAM paudiostream;
AVISTREAMINFO infos;
::AVIStreamOpenFromFile(&pauidostream,"D:\\0\\3.avi",streamtypeAUDIO,0,0,NULL);
::AviStreamInfo(pauidostream,&infos,0);

писал по памяти, т.к. с собой кода нету... но вроде так...
Т.е. в результате есть аудио-поток, а какими средставми его проиграть, даже не представляю... ну точнее теоертически можно записать в файл, и потом проигрывать из файла, но не думаю что это лучший вариант.

PM MAIL   Вверх
Andrey44
Дата 26.3.2008, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Да, я и сам бился долго над проигрыванием звука smile 
Но никак не смог добиться синхронизации видео со звуком.
Плюнул на все и стал использовать DirectShow smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Incinerated
Дата 26.3.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Цитата(Andrey44 @ 26.3.2008,  13:58)
Да, я и сам бился долго над проигрыванием звука smile 
Но никак не смог добиться синхронизации видео со звуком.
Плюнул на все и стал использовать DirectShow smile

твой пример, что ты мне скинул, там звук не проигрывается, по крайней мере в тех файлах которых я пытался открыть(... МНе бы пускай не синхронно проиграть этот поток...
PM MAIL   Вверх
Andrey44
Дата 27.3.2008, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Там просто закомментированы места где из потока достается звук.
Я уже точно не помню , но там нада доставать кусок данных из потока 
заполнять WAVEHEDER отправлять на воспроизведение кусками ,
следить за тем, когда кусок звука заканчивается ........ и так далее в цикле.
Короче лучше с этим не заморачиваться smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Incinerated
Дата 29.3.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Цитата(Andrey44 @ 27.3.2008,  09:57)
Там просто закомментированы места где из потока достается звук.
Я уже точно не помню , но там нада доставать кусок данных из потока 
заполнять WAVEHEDER отправлять на воспроизведение кусками ,
следить за тем, когда кусок звука заканчивается ........ и так далее в цикле.
Короче лучше с этим не заморачиваться smile

прийдется заморачиваться, у меня выхода нет.
Есть функция waveOutPrepareHeader(), вроде так называется, у нее первый параметр - указатель на аудио-устройство, которое предается из waveOutOpen(), второй параметр структурка, и третий размер структуры...
Вот проблема заключается в самой структуре, после выпролнения функции waveOutPrepareHeader(), она вовзращает ошибку "Invalid parametr", я так подозреваю что проблема в структуре, т.к. waveOutOpen() сработала без ошибок. Там в структурке есть первый параметр - указатель на аудио-поток, но тип там (char *), и как мне преобразовать PAVISTREAM в char* я даже не знаю... А так если бы получилось, то думаю играло бы...Ну дальше там вызываются другие функции чтоб проиграть...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0819 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.