Имя:
Пароль:
-- ИЛИ --
Войти, используя:

Форум   Общая тематика и компьютеры   Программирование

сохранение/восстановление настроек формата видео

 
Пост #57136 от 24 октября 2008, 12:56 

HeaveN

Здравствуйте. Есть видеокамера с WDM драйвером. Формат вывода RGB24.
Как сохранить/восстановить настройки фильтра (т.е. самой камеры), я сделал как написано где то на этом форуме (через IPersistStream). При этом сохраняются такие настройки как контрастность,яркость и тд и тп.
Проблема встала при сохранении/восстановлении формата видео. Нужно чтобы программа при запуске восстанавливала разрешение картинки (там по умолчанию всегда ставится 2136 на 1602 а мне надо например 640 на 480 (он камерой тоже поддерживается).
Эти настройки изменяются в диалоге настроек пина. Ни интерфейс IPin ни IAMStreamConfig не имеют IPersistStream (хотя IAMStreamConfig как раз и имеет диалог настроек).
Пробовал делать через IAMStreamConfig->GetFormat (сохраняю в ини), потом опять GetFormat, потом смера настройка формата данными из ини, потом IAMStreamConfig->SetFormat. Не работает. Точнее настройки пина захвата вроде меняются, а вот при pGrabber->GetConnectedMediaType(&mt) структура mt не соотв нужной.
Как это вообще можно реализовать или что я делаю не так?
Отправить личное сообщениеПрофиль пользователяКонфигурация пользователяРоссия
Рыбинск
Постов: 6
Нарушений: Нет
Access violation по русски это Матрица поимела тебя
Пост #57140 от 24 октября 2008, 18:09 

Vlafy

HeaveN : потом IAMStreamConfig->SetFormat
Так и надо делать. Это надо делать до соединения пина.
Отправить личное сообщениеПрофиль пользователяКонфигурация пользователяБлог пользователяWeb-сайт пользователяРоссия
Сосновый Бор
Постов: 6083
Нарушений: Нет
Пост #57148 от 25 октября 2008, 10:21 

HeaveN

Вот только не понял. Почитал тут ещё на wonderu так получается что мне мало того что надо конфигурировать выходной пин фильтра захвата, так ещё и копировать потом эту настройку во входной пин семпл граббера. И только потом всё это дело соединять?
Отправить личное сообщениеПрофиль пользователяКонфигурация пользователяРоссия
Рыбинск
Постов: 6
Нарушений: Нет
Access violation по русски это Матрица поимела тебя
Пост #57153 от 25 октября 2008, 16:13 

Vlafy

HeaveN,
По идее достаточно сконфигурировать выходной пин фильтра захвата. Не получается?
Отправить личное сообщениеПрофиль пользователяКонфигурация пользователяБлог пользователяWeb-сайт пользователяРоссия
Сосновый Бор
Постов: 6083
Нарушений: Нет
Пост #57184 от 27 октября 2008, 10:32 

HeaveN

Я создаю фильтр захвата как описано в DirectShow SDK, через enumerator устр-в. Перед добавлением на граф делаю гетформат потом меняю его настройки из ини потом сет формат. Потом соотв pGraph->AddFilter(pCap, L"Capture Filter");
При pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,pCap, pSG_Filter,pNull ) выдаёт сообщ что у вас запущен дебаггер просьба его выкл и тд и тп. Потом появл окно ЦПУ ( я в Билдере 6-ом программирую), а там всё по 0 (по личному опыту это вроде значит что где то косяк). Уже не понимаю вообще в чём дело. Структуру заполняю полностью, то есть как поля стр-ры AM_MEDIA_TYPE так и поля VIDEOINFOHEADER входящего в эту стр-ру. Всю голову себе уже сломал.
Отправить личное сообщениеПрофиль пользователяКонфигурация пользователяРоссия
Рыбинск
Постов: 6
Нарушений: Нет
Access violation по русски это Матрица поимела тебя
Пост #57202 от 28 октября 2008, 00:21 

Vlafy

HeaveN : Перед добавлением на граф делаю гетформат потом меняю его настройки из ини потом сет формат
Это всё надо делать после добавления фильтра в граф. Должно работать. Я с такими проблемами не сталкивался.
Отправить личное сообщениеПрофиль пользователяКонфигурация пользователяБлог пользователяWeb-сайт пользователяРоссия
Сосновый Бор
Постов: 6083
Нарушений: Нет
Пост #57452 от 7 ноября 2008, 09:20 

HeaveN

В общем просто поменять формат у меня не получилось. По этому сделал так:
после добавления на граф фильтра захвата подгружаю нужное разрешение след образом:
IAMStreamConfig *pSC;
HRESULT hr = pBuild->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video, pCap,
IID_IAMStreamConfig, (void **)&pSC);
if (hr!=S_OK)
return false;
GUID mediatype=MEDIATYPE_Video;//тип медиаданных, напр видео
GUID mediasubtype=MEDIASUBTYPE_RGB24;//поддип медиаданных, напр RGB24
GUID formattype=FORMAT_VideoInfo;
int iCount, iSize,needW,needH;
VIDEO_STREAM_CONFIG_CAPS scc;
AM_MEDIA_TYPE *pmt;
TIniFile *ini;
ini = new TIniFile(GetCurrentDir()+"\\Settings.ini");
needW=ini->ReadInteger("VIDEOINFOHEADER","biWidth",640);//треб. ширина
needH=ini->ReadInteger("VIDEOINFOHEADER","biHeight",480);//треб. высота
delete ini;
hr = pSC->GetNumberOfCapabilities(&iCount, &iSize);//получаем список возможн режимов камеры
if (sizeof(scc) != iSize)
{
// This is not the structure we were expecting.
return false;
}
for (int i=0;i<iCount;i++)
{
hr = pSC->GetStreamCaps(i, &pmt, reinterpret_cast<BYTE*>(&scc));
if (hr == S_OK)
{
if (pmt->formattype==formattype&&pmt->majortype==mediatype&&pmt->subtype==mediasubtype)
{
VIDEOINFOHEADER *pVih = reinterpret_cast<VIDEOINFOHEADER*>(pmt->pbFormat);
if ((pVih->bmiHeader.biWidth == needW)&&(pVih->bmiHeader.biHeight == needH))
{
hr = pSC->SetFormat(pmt);
break;
};
};
};

};
Не знаю на сколько правильно, но только так у меня действительно заработало.
И ещё, если при рендер филтерс вылезает ошибка с WinIce/SoftIce то скорей всего это из-за NERO, по крайней мере так написано было в msdn-форуме.
Может кому нибудь и пригодится.
Отправить личное сообщениеПрофиль пользователяКонфигурация пользователяРоссия
Рыбинск
Постов: 6
Нарушений: Нет
Access violation по русски это Матрица поимела тебя
Пост #57454 от 7 ноября 2008, 10:04 

Vlafy

HeaveN : если при рендер филтерс вылезает ошибка с WinIce/SoftIce то скорей всего это из-за NERO
Я бы по-другому сказал. При RenderFilters() граф пытается вставлять фильтры, чтобы соединить пины, которые не соединяются напрямую. А пытается он вставлять фильтры с высоким параметром merit. Многие программы ставят с собой фильтры, в которых есть защита от отладчика. Поэтому если Nero ставит фильтры с высоким merit и с защитой от отладчика, то с большой вероятностью не будет работать автоматическая сборка графа (RenderPin и т.п.) при запущенном отладчике.
Вообще, граф лучше собирать вручную, без автосборщиков, т.к. на разных системах их поведение может быть разным, в зависимости от установленных фильтров.
Отправить личное сообщениеПрофиль пользователяКонфигурация пользователяБлог пользователяWeb-сайт пользователяРоссия
Сосновый Бор
Постов: 6083
Нарушений: Нет
Пост #57455 от 7 ноября 2008, 10:21 

HeaveN

Ну я на граф в ручную ставлю только фильтр захвата, Sample Grabber и Null Renderer. А сам граф при рендере добавляет smart tee. Причём как ни странно он добавляет одни и те же фильтры как с имеющимися фильтрами Nero так и без них.

А про высокий merit это да, это суть процесса, я просто написал чё мне в частности помогло.
Отправить личное сообщениеПрофиль пользователяКонфигурация пользователяРоссия
Рыбинск
Постов: 6
Нарушений: Нет
Access violation по русски это Матрица поимела тебя
Пост #69332 от 13 января 2011, 20:33 

Ninetta

подскажите пожалуйста! что такое пин захвата???
и что я делаю не так?
мне надо покадрово считывать видео с камеры.

я делаю так
// Add filters
hr = pGraphBuilder->AddFilter(pDeviceFilter, L"Device Filter");
hr = pGraphBuilder->AddFilter(pGrabberF, L"Sample Grabber");
hr = pGrabberF->QueryInterface(IID_ISampleGrabber, (void**)&pGrabber);

AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Video;
mt.subtype = MEDIASUBTYPE_RGB24;
hr = pGrabber->SetMediaType(&mt);

hr = pGrabber->SetOneShot(FALSE); //Set one-shot mode and buffering.
hr = pGrabber->SetBufferSamples(TRUE);

hr = pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pDeviceFilter, NULL, NULL); //видео выводится, всё отлично

hr = pGrabber->GetConnectedMediaType(&mt);

pGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
pMediaControl->Run();

//вот тут пытаюсь создать массив данных кадров видеопотока, но ничего не получается
long Size = 0;
hr = pGrabber->GetCurrentBuffer(&Size, NULL);
unsigned char *pBuffer;
pBuffer = new unsigned char[Size];
hr = pGrabber->GetCurrentBuffer(&Size, (long*)pBuffer);

видео выводит, а массив не заполняет, что делать?
Отправить личное сообщениеПрофиль пользователяРоссия
Постов: 1
Нарушений: Нет
Если Вы зарегистрированы, то для отправки сообщений, пожалуйста, авторизуйтесь.
-- ИЛИ --
Войдите, используя: Facebook Twitter Yandex Вконтакте Mail.ru ...
Страница создана за 0.063 секунды
Copyright © 1999-2012 PcTuner.Ru · Design by Alex Dovby