Форум   Статьи   Новости   Файлы   Bugtraq   Сниффер   Друзья   О Клубе

Последнее на Форуме

Пожертвования

Liberty Reserve: U9999024
Кошельки WebMoney:
Z583322939655
E121331800314
R274644017049
U349709454906


YM: 410011220120073

Пожертвовать

Контакты

Связь с Администрацией

hpcteam1[@]gmail.com

Статьи rss

[ Добавить Статью на сайт ]

Статьи / Программирование / Delphi

Запись видео с веб-камеры

Здравствуйте, я Yougan, подумал, что программка, записывающая видео с веб-камеры будет очень полезна начинающим программистам, и начинающим хацкерам:)
Это моя первая статья, поэтому прошу не судить строго.

Как вы уже поняли моя программа будет записывать видео с веб камеры (без звука) и сохранять его в файл в формате avi.
Для работы нам потребуется:
1. Delphi 7(писать я буду именно на ней и совместимость кода с 10 не гарантирую)
2. Пакет DSPack(Скачать можно здесь http://sourceforge.net/projects/dspack)
3. Время и терпение
4. Ну и, конечно веб-камера(я использовал MicroSoftLifeCam)

Думаю установить Dspack не проблема, кто знает English, достаточно будет прочитать ReadMe там все очень подробно и ясно описано.
Взять DSPack можно тут www.sourceforge.net/projects/dspack/

Ну что ж, приступим к созданию формы.
Кинем на форму:
2 Listbox'a изменим имена которых на VideoCapFilters И VideoFormats
2 Button'a имена которых мне менять не захотелось совершенно :)
1 VideoWindow со вкладки DSpack имя которому поставим VideoWindow
1 Filter со вкладки DSpack имя которого - VideoSourceFilter
1 FilterGraph оттуда же с именем CaptureGraph

Я раскидал компоненты на форме так
IMG: http://s54.radikal.ru/i145/1101/b1/98a28b614848.jpg
http://s54.radikal.ru/i145/1101/b1/98a28b614848.jpg (Картинка тут)

Теперь с организацией формы покончено и можно приступить соответственно к кодингу.
Обязательно добавьте в uses DSPack,DirectShow9,DSUtil
Псоле объявим глобальные переменные
CapEnuь:TSysDevEnum - Это переменная, для хранения устройств ввода и их опций
VideMediaType:TEnumMediaType - Это переменная , хранящая настройки видео

и CapFile:WideString='Путь к файлу' - Ну тут, я думаю, понятно

Теперь настроим компоненты
У VideoSourceFilter свойству FilterGraph присвоим CaptureGraph
У CaptureGraph свойство Mode поставьте в gmCapture
У VideoWindow свойство FilterGraph поставьте в CaptureGraph

Перейдем непосредственно к кодингу. В обработчике события создания формы напишем следующее

var i:integer;
begin
CapEnum:=tsysdevenum.create(clsid_videoinputdevicecategory);    //Создаем и //инициализируем переменную с устройствами
for i:=0 to CapEnum.CountFilters-1 do                           //Получаем список //устройств в листбокс VideoCapFilters

VideoCapFilters.items.add(capenum.Filters[0].friendlyname);
VideoMediatype:=tenummediatype.create;                          //Инициализируем //переменную, которая будет хранить настройки видео
end;

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

procedure TForm1.FormDestroy(Sender: TObject);
begin
capenum.free;                                        
videomediatype.Free;
end;

Теперь два раза щелкнем на VideoCapFilters и напишем там это

procedure TForm1.VideoCapFiltersClick(Sender: TObject);
var i:integer;
PinList:TPinList;   //Это специальный объект, который будет хранить список с //настройками
begin
CapEnum.SelectGUIDCategory(CLSID_VideoInputDeviceCategory);       //Задаем //категорию устройств ввода, в данном случае это VideoInputDeviceCategory
if VideoCApfilters.itemindex<>-1 then  //Если выбрано устройство
begin
VideoSourcefilter.BaseFilter.Moniker:=capenum.GetMoniker(videocapfilters.ItemIndex);           //Получаем моникер
VideoSourcefilter.filtergraph:=capturegraph;                                  //Инициализируем фильтр с граббером картинок
Capturegraph.Active:=true;                                                    //Включаем граббер
PinList:=tpinlist.create(VideoSourcefilter as IBAseFilter);                 //Заполняем //список настройками VideoSоurceFiltr'a
VideoFormats.Clear;  //От греха подальше очищаем список
VideoMediaType.Assign(PinList.first);                                       //Опять таки //инициализируем переменную типа видео с доступными девайсами
for i:=0 to Videomediatype.Count-1 do
Videoformats.Items.Add(videomediatype.mediadescription[i]);                 ////Добавляем эти девайсы в листбокс
CaptureGraph.Active:=false;  //Отключаем граббер
PinList.Free;          //Освобождаем список PinList
Button1.enabled:=true;         //Включаем кнопку старта
end;
end;

Теперь перейдем к настройке опций будущего видео и его записи :)
В событии нажатия на кнопочку Старт (Button1) напишите следующее

procedure TForm1.Button1Click(Sender: TObject);
var multiplexer:Ibasefilter;                 //Переменная, имеющая отношение к //базовому фильтру
writer:Ifilesinkfilter;             //Переменная, которая поучаствует в записи видео в //файл
Pinlist:tpinlist;         //Уже знакомый нам список я-параметров
i:integer;
begin
CaptureGraph.Active:=true;                                     //Включаем граббер
if VideoSourceFilter.FilterGraph<>nil then                 //Если фильтр доступен(или //формат видео, как вам удобно)
begin
PinList:=tpinlist.create(Videosourcefilter as ibasefilter);                               ////Заполним список уже настройками этих самых фильтор
if VideoFormats.Itemindex<>-1 then
with (Pinlist.first as Iamstreamconfig) do
setformat(VideoMediaType.items[VideoFormats.itemindex].ammediatype^);                         //Если у нас выбраны опции видео получаемого с веб ки, то настроим //записываемое в файл
Pinlist.free;  //Освободим объект, дабы он не занимал в памяти лишнее место
end;

//Т.к. запись видео производится в потоках, то здесь происходит их //инициализация

with CaptureGraph as IcaptureGraphBuilder2 do
begin
setoutputfilename(MediaSubType_Avi,pwidechar(capfile),multiplexer,writer);               //Задаем имя файла и настройки выдео записываемого
if videosourcefilter.basefilter.DataLength>0 then                                        //Если //грабится не пустые картинки, то
renderstream(@Pin_category_preview, nil, Videosourcefilter as ibasefilter,nil,             
 videowindow as ibasefilter); //Процедура инициализации записывающего потока

if videosourcefilter.filtergraph<>nil then
renderstream(@pin_category_capture,nil,videosourcefilter as ibasefilter,nil,multiplexer as ibasefilter);   //Тут такая же процедура, если //присмотреться то совсем не такая же))Вобщем тут тоже инициализация потока 

CaptureGraph.Play;                //Наконец-то!!Тут начинаем записывать
  Button2.Enabled := true;            //Включаем\выключаем кнопочки, девайсы
  Button1.Enabled := false;
  VideoFormats.Enabled := false;
  VideoCapFilters.Enabled := false;

end;

И последний маленький штрих, так, для красоты
{Обработчик кнопочки стоп}

procedure TForm1.Button2Click(Sender: TObject);
begin
Button2.Enabled := false;                                   
  button1.Enabled := true;
  CaptureGraph.Stop;
  CaptureGraph.Active := False;
  VideoFormats.Enabled := true;
  VideoCapFilters.Enabled := true;
end;

Теперь запускаем и улыбаемся сами себе:)
Все, ваша программка готова. Надеюсь я понятно изложил материал. Если вы не вникли в суть кода, прочитайте его ещё раз, код несколько сложен, но если проштудировать его тщательнее, все становится просто и понятно.

Если чего-то не получилось исходник тут.
http://zalil.ru/30389785
P.S. Это моя первая статья, поэтому прошу не судить строго :)
Статья участвует в конкурсе статей Winter 2011

Автор: Yougan

Источник: hpc.name

Материал добавил Yougan


Комментарии(0)

Дата: 2011-01-24 23:21:15

Добавить Комментарий к Материалу

Вы должны быть авторизованы на форуме чтобы добавлять комментарии. Регистрация Уже авторизованы?

Комментариев к материалу пока нет.

Последнее на Сайте

Новости

Статьи

Bugtraq

Файлы

Copyright © 2008 - 2017 «HPC». При копировании материалов ставьте ссылку на источник.
Все материалы представлены только в ознакомительных целях, администрация за их использование ответственности не несет.
Пользовательское соглашение Реклама на сайте