Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2012, 02:11   #1
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
Восклицание DirectX - DirectShow - взять кадр из видео потока

Доброго времени суток! такая задача: нужно сдернуть кадр из тв-тюнера. Взялся за DirectShow. Для разборок взял книгу Сергея ЕСЕНИНА - Delphi и DirectX...
Разбираться особо нет времени. У автора есть готовые классы : "UdxMediaPlayer.pas" и "UdxCaptureManager.pas"
С помощью первого он реализует воспроизведение файла с диска, а второй класс учавствует в захвате потока с устройств (и не только..)
Чтоб не тратить время зря-собрал свой класс из двух этих "UdxCaptureManager1.pas"
Всё компилируется , прога работает, но при захвате изображения оказывается что размер изображения - не тотили просто не работает функция
Цитата:
function TdxCaptureManager.CaptureBitmap(Fil eName: string): HResult;
var
bSize: integer;
pVideoHeader: TVideoInfoHeader;
MediaType: TAMMediaType;
BitmapInfo: TBitmapInfo;
Bitmap: TBitmap;
Buffer: Pointer;
tmp: array of byte;
begin
Result := E_FAIL;

// Если отсутствует интерфейс фильтра перехвата изображения,
// то завершаем работу
if FSampleGrabber = NIL then
EXIT;
ok
// Получаем размер кадра
Result := FSampleGrabber.GetCurrentBuffer(bSi ze, NIL);
if (bSize <= 0) then
EXIT; тут
if FAILED(Result) then
EXIT; или ту выполняется условие и далее снимок не создаётся (даже если убираю проверку вылетает ошибка памяти во время работы)
// Создаем изображение
bitmap := TBitmap.Create;
try
// Получаем тип медиа потока на входе у фильтра перехвата
ZeroMemory(@MediaType, sizeof(TAMMediaType));
Result := FSampleGrabber.GetConnectedMediaTyp e(MediaType);
if FAILED(Result) then EXIT;

// Копируем заголовок изображения
pVideoHeader := TVideoInfoHeader(MediaType.pbFormat ^);
ZeroMemory(@BitmapInfo, sizeof(TBitmapInfo));
CopyMemory(@BitmapInfo.bmiHeader, @pVideoHeader.bmiHeader, sizeof(TBITMAPINFOHEADER));

Buffer := NIL;

// Создаем побитовое изображение
bitmap.Handle := CreateDIBSection(0, BitmapInfo, DIB_RGB_COLORS, Buffer, 0, 0);

// Выделяем память во временном массиве
SetLength(tmp, bSize);

try
// Читаем изображение из медиа потока во временный буфер
FSampleGrabber.GetCurrentBuffer(bSi ze, @tmp[0]);

// Копируем данные из временного буфера в наше изображение
CopyMemory(Buffer, @tmp[0], MediaType.lSampleSize);

// Сохраняем изображение в файл
Bitmap.SaveToFile(FileName);
except

// В случае сбоя возвращаем ошибочный результат
Result := E_FAIL;
end;
finally

// Освобождаем память
SetLength(tmp, 0);
FreeAndNil(Bitmap);
end;
end;
у меня FSampleGrabber.GetCurrentBuffer(bSi ze, NIL) возвращает или отрицательное значение bSize или тупо ошибку RESULT и далее попытки создать уже сам файл изображения - бесполезны ...
Велкам! :D http://radiomedtech.ucoz.ru

Последний раз редактировалось 100GRamm; 27.04.2012 в 02:41.
100GRamm вне форума Ответить с цитированием
Старый 27.04.2012, 02:11   #2
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
По умолчанию

Из-за отсутствия опыта работы с построением графов - скорее всего не правильно подключил фильтр захвата кадра

Цитата:
весь кусок кода взят из UdxCaptureManager.pas
function TdxCaptureManager.ConstructGraph: HResult;
var
MediaType: TAMMediaType;
begin
// Чистим граф
ResetGraph;

// Создаем объект для построения графа фильтров
Result := CoCreateInstance(CLSID_FilterGraph, NIL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, FGraphBuilder);
if FAILED(Result) then EXIT;

// Создаем объект для построения графа захвата
Result := CoCreateInstance(CLSID_CaptureGraph Builder2, NIL,
CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, FCaptureGraphBuilder);
if FAILED(Result) then
EXIT;
// Задаем граф фильтров для использования в построении графа захвата
Result := FCaptureGraphBuilder.SetFiltergraph (FGraphBuilder);
if FAILED(Result) then EXIT;

// Получение устройтва захвата видео
FVideoCaptureFilter := EnumerateDevices(CLSID_VideoInputDe viceCategory,
VideoCaptureDeviceName, NIL, TRUE);

// Добавляем фильтр захвата видео в граф
if FVideoCaptureFilter <> NIL then
begin
FGraphBuilder.AddFilter(FVideoCaptu reFilter, 'VideoCaptureFilter');
end;
//=============================== этот кусок кода взят из UdxMediaPlayer.pas
// Создаем фильтр
Result := CoCreateInstance(CLSID_SampleGrabbe r, NIL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, FBaseFilter);
if FAILED(Result) then
EXIT;

// Получаем интерфейс фильтра перехвата
FBaseFilter.QueryInterface(IID_ISam pleGrabber, FSampleGrabber);

// Добавляем фильтр в граф
Result := FGraphBuilder.AddFilter(FBaseFilter , 'GRABBER');
if FAILED(Result) then
EXIT;

if FSampleGrabber <> NIL then
begin
// Устанавливаем формат данных для фильтра перехвата
ZeroMemory(@MediaType, sizeof(TAMMediaType));

with MediaType do
begin
majortype := MEDIATYPE_Video;
subtype := MEDIASUBTYPE_RGB24;
formattype := FORMAT_VideoInfo;
end;

Result := FSampleGrabber.SetMediaType(MediaTy pe);
if FAILED(Result) then EXIT;

// Данные будут записаны в буфер в том виде, в котором они
// проходят через фильтр
FSampleGrabber.SetBufferSamples(TRU E);

// Граф не будет остановлен для получения кадра
FSampleGrabber.SetOneShot(false);
end;

//=================================== ========

// Если задан режим предварительного просмотра, то ...
if FPreview then
begin
// ... выводим изображени
if FVideoCaptureFilter <> NIL then
begin

Result := FCaptureGraphBuilder.RenderStream(@ PIN_CATEGORY_PREVIEW, @MEDIATYPE_Video,
FVideoCaptureFilter, NIL, NIL);
if FAILED(Result) then EXIT;

if FVideoHandle > 0 then
begin
// Запрашиваем интерфейс управления окном вывода изображения
FGraphBuilder.QueryInterface(IID_IV ideoWindow, FVideoWindow);

if FVideoWindow <> NIL then
begin
// Устанавливаем стиль видео окна
FVideoWindow.put_WindowStyle(WS_CHI LD or WS_CLIPSIBLINGS);

// Устанавливаем родительское окно для вывода изображения
FVideoWindow.put_Owner(FVideoHandle );

// Устанавливаем положение окна
FVideoWindow.SetWindowPosition(
FVideoRect.Left,
FVideoRect.Top,
FVideoRect.Right - FVideoRect.Left,
FVideoRect.Bottom - FVideoRect.Top);

// Показываем окно вывода изображения
FVideoWindow.put_Visible(TRUE);
end;
end;
end;
end;

// Если задан режим захвата, то ...
if FCapturing then
begin
// Создаем файл для записи данных из графа
Result := FCaptureGraphBuilder.SetOutputFileN ame(MEDIASUBTYPE_Avi,
PWideChar(FCaptureFileName), FMux, FSink);
if FAILED(Result) then EXIT;

// Устанавливаем режим захвата изображения
if FVideoCaptureFilter <> NIL then
begin
Result := FCaptureGraphBuilder.RenderStream(@ PIN_CATEGORY_CAPTURE, @MEDIATYPE_Video,
FVideoCaptureFilter, FVideoCompressFilter, FMux);

if FAILED(Result) then EXIT;
end;
end;

// Запрашиваем интерфейс управления графом
Result := FGraphBuilder.QueryInterface(IID_IM ediaControl, FMediaControl);
if FAILED(Result) then EXIT;

// Запускаем граф
Result := FMediaControl.Run();
end;
Велкам! :D http://radiomedtech.ucoz.ru

Последний раз редактировалось 100GRamm; 27.04.2012 в 02:40.
100GRamm вне форума Ответить с цитированием
Старый 27.04.2012, 02:37   #3
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
По умолчанию

Получается, что как бы и нет то в буфере никокого изображения!
Подскахите, пжлст, где возможна ошибка?
Велкам! :D http://radiomedtech.ucoz.ru
100GRamm вне форума Ответить с цитированием
Старый 29.04.2012, 08:43   #4
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
По умолчанию

это значит что никто с этим не сталкивался?
Велкам! :D http://radiomedtech.ucoz.ru
100GRamm вне форума Ответить с цитированием
Старый 29.04.2012, 09:14   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

http://programmersforum.ru/showthread.php?t=106352
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
8 бит видео.DirectShow yarik32 Мультимедиа в Delphi 2 14.01.2012 23:37
Вырезать кадр из видео J-Max PHP 0 18.01.2011 19:42
directshow видео из потока Ser-V Общие вопросы C/C++ 0 27.10.2010 22:12
DirectShow, вытащить скрины видео AleD Мультимедиа в Delphi 0 25.07.2010 07:16