[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Обменик » Разное » Запись видео с веб-камеры
Запись видео с веб-камеры
SeMДата: Воскресенье, 20.03.2011, 17:22 | Сообщение # 1
Лейтенант
Группа: Администраторы
Сообщений: 62
Награды: 0
Репутация: 100
Статус: Offline
Здравствуйте, я 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 имена которых мне менять не захотелось совершенно smile
1 VideoWindow со вкладки DSpack имя которому поставим VideoWindow
1 Filter со вкладки DSpack имя которого - VideoSourceFilter
1 FilterGraph оттуда же с именем CaptureGraph

Я раскидал компоненты на форме так

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;

Теперь перейдем к настройке опций будущего видео и его записи smile
В событии нажатия на кнопочку Старт (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. Это моя первая статья, поэтому прошу не судить строго smile
Статья участвует в конкурсе статей Winter 2011

Автор: Yougan

Источник: hacker-pro.net

Прикрепления: DSPACK231.zip (1.72 Mb)
 
Форум » Обменик » Разное » Запись видео с веб-камеры
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2024