 |  | |  | |
IMediaDet — интерфейс для захвата видео и аудио информации | Полный текст материала
Другие публикации автора: Александр Бусаров
Цитата или краткий комментарий: «... В данной статье я хочу рассмотреть интерфейс IMediaDet, который нам любезно предоставил DirectShow.
Интерфейс специально разработан для того, чтобы захватить часть видео или аудио информации.
...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
Всего проголосовали: 0 | Всего проголосовали: 0 |
[DirectShow]
Отслеживать это обсуждение 
Всего сообщений: 609-05-2011 06:49"Еще нужно подключить модуль ActiveX." какой конкретно модуль?
и если у кого-нибудь ксть готовое приложение выложите пож-ста |
|
12-03-2007 02:45Спасибо всем, сам нашел ошибку, вместо аrray of byte почему то написал array of pchar из-за этого получался сдвиг. Дописал тут кое что еще на основе своих разработок еще под VFW в частности определения кодека компрессии и т.п. инфы (как в LA)
Добавил информацию о кодерах и потоках, а также грабку в image
Вот что получилось
если кому интересно, готовое приложение на основе статьи
http://rapidshare.com/files/20627234/DirectShowGrabAVI.rar.html
так как автор к сожалению не привел пример, привожу за него с небольшими дополнениями
|
|
09-03-2007 07:23сообщение от автора материала не знаю.
Вот этот код дал мне абсолютно нормальную картинку:
procedure TForm1.Button1Click(Sender: TObject);
var buffer:array of byte;
buffsize:longint;
Detector:IMediaDet;
info:_AMMediaType;
height, width:word;
time:double;
initinfo:TBITMAPINFO;
infoheader:TBITMAPINFOHEADER;
hdcDest:HDC;
bitmap:HBITMAP;
begin
CoCreateInstance (CLSID_MediaDet,nil, CLSCTX_INPROC_SERVER, IID_IMediaDet, Detector);
Detector.put_Filename('c:\qwe.avi');
DEtector.get_StreamMediaType(info);
Width:=VIDEOINFOHEADER(info.pbFormat^).bmiHeader.biWidth;
Height:=VIDEOINFOHEADER(info.pbFormat^).bmiHeader.biHeight;
BuffSize:=0;
time:=4;
Detector.GetBitmapBits(time, @BuffSize, nil, Width, Height);
ShowMessage(IntToStr(BuffSize));
SetLength(Buffer, BuffSize);
Detector.GetBitmapBits(Time, nil, @Buffer[0], Width, Height);
ZeroMemory(@InitInfo, SizeOf(TBITMAPINFO));
CopyMemory(@InfoHeader, @Buffer[0], SizeOf(TBITMAPINFOHEADER));
CopyMemory(@InitInfo.bmiHeader, @InfoHeader, SizeOf(TBITMAPINFOHEADER));
hdcDest := GetDC(0);
Bitmap := CreateDIBitmap(hdcDest, InfoHeader, CBM_INIT, @Buffer[SizeOf(TBITMAPINFOHEADER)], InitInfo, DIB_RGB_COLORS);
image1.Width := width;
image1.Height := height;
image1.Picture.Bitmap.Handle := Bitmap;
end;
На форме только кнопка (Button1:TButton) и имейдж (Image1:TImage).
Код твой, немного дополненый. Но не измененный. |
|
09-03-2007 06:44Все понятно но картинка почемуто сдвинута получается
вот код -
// получаем размер в BuffSize
Detector.GetBitmapBits(Time, @BuffSize, nil, Width, Height);
// выделяем память
SetLength(Buffer, BuffSize);
// в выделенную память копируем картинку
// DirectShow возвращает картинку всегда в 24-битном формате цвета. По байту на каждый канал RGB.
Detector.GetBitmapBits(Time, nil, @Buffer[0], Width, Height);
// Чистим память
ZeroMemory(@InitInfo, SizeOf(TBITMAPINFO));
// Копируем BITMAPINFOHEADER в полученный буфер
CopyMemory(@InfoHeader, @Buffer[0], SizeOf(TBITMAPINFOHEADER));
CopyMemory(@InitInfo.bmiHeader, @InfoHeader, SizeOf(TBITMAPINFOHEADER));
// Создаем DIB Bitmap
hdcDest := GetDC(0);
Bitmap := CreateDIBitmap(hdcDest, InfoHeader, CBM_INIT, @Buffer[SizeOf(TBITMAPINFOHEADER)], InitInfo, DIB_RGB_COLORS);
// отображаем
image1.Width := width;
image1.Height := height;
image1.Picture.Bitmap.Handle := Bitmap;
|
|
04-03-2007 07:25сообщение от автора материала Нет, к сожалению это не пригодно для захвата с вебкамеры.
Для захвата с вебкамеры можно использовать ISampleGrabber.
Для того чтобы найти камеру нужно создать ICreateDevEnum, от него IEnumMoniker, из него ты можешь получить все моникеры системы на данный момент. Среди них тебе нужно выбрать твою камеру, передать этот моникер ISampleGrabber-у, от ISampleGrabber-а получить IMediaSample, а у IMediaSample-а вызвать GetPointer. Это и будет твой "скриншот" с камеры.
Это все в кратце, более подробно на msdn2 |
|
04-03-2007 05:14Это пригодно для захвата с вебкамеры? И если да -как ее найти в проге? |
|
|
|