![]() |
|
|
#1
|
||||
|
||||
![]() Hi! Извиняюсь если тема такая есть, но я не нашел ее.
Нарисовалась у меня проблема, получаю видео поток с веб-камеры используя DSPack (рабочий пример ниже), а как послать по сети ума не прилажу. Находил в Инете примеры по данной теме, но там по сети посылались изображения и накладывались друг на друга у получателя, что не очень то хорошо, т.к. при большом числе картинок изображение начинало мерцать. Подскажите, кто сталкивался с этим, как посылать сам видео поток по сети? Заранее спасиб. Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DSPack, DSUtil, DirectShow9; type TForm1 = class(TForm) SampleGrabber1: TSampleGrabber; ComboBox1: TComboBox; Button1: TButton; FilterGraph1: TFilterGraph; Filter1: TFilter; VideoWindow1: TVideoWindow; procedure FormCreate(Sender: TObject); procedure ComboBox1Change(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; VideoDevice: TSysDevEnum; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var i: integer; begin VideoDevice:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory); if VideoDevice.CountFilters > 0 then for i := 0 to VideoDevice.CountFilters - 1 do ComboBox1.Items.Add(VideoDevice.Filters[i].FriendlyName); end; procedure TForm1.ComboBox1Change(Sender: TObject); begin FilterGraph1.ClearGraph; FilterGraph1.Active := false; Filter1.BaseFilter.Moniker :=VideoDevice.GetMoniker(ComboBox1.ItemIndex); FilterGraph1.Active := true; with (FilterGraph1 as ICaptureGraphBuilder2) do RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter1 as IBaseFilter, SampleGrabber1 as IBaseFilter, VideoWindow1 as IbaseFilter); FilterGraph1.Play; end; procedure TForm1.Button1Click(Sender: TObject); begin if Button1.Caption='Смотреть видео' then begin FilterGraph1.Play; Button1.Caption:='Остановить видео'; end else begin FilterGraph1.Stop; Button1.Caption:='Смотреть видео'; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin VideoDevice.Destroy; end; end. |
#2
|
|||
|
|||
![]() Я могу посоветовать тебе вот такой небольшой пример кода, он убирает мерцание при переходе одного изображения на другое:
Код:
const count = 100; var i: integer; x, y: integer; bm, bm1, bm2: TBitMap; p1, p2, p: PByteArray; c: integer; k: integer; begin bm := TBitMap.Create; bm1 := TBitMap.Create; bm2 := TBitMap.Create; bm1.LoadFromFile('Bitmap1.bmp'); bm2.LoadFromFile('Bitmap2.bmp'); if bm1.Height < bm2.Height then begin bm.Height := bm1.Height; bm2.Height := bm1.Height; end else begin bm.Height := bm2.Height; bm1.Height := bm2.Height; end; if bm1.Width < bm2.Width then begin bm.Width := bm1.Width; bm2.Width := bm1.Width; end else begin bm.Width := bm2.Width; bm1.Width := bm2.Width; end; bm.PixelFormat := pf24bit; bm1.PixelFormat := pf24bit; bm2.PixelFormat := pf24bit; Form1.Canvas.Draw(0, 0, bm1); for i := 1 to count - 1 do begin for y := 0 to bm.Height - 1 do begin p := bm.ScanLine[y]; p1 := bm1.ScanLine[y]; p2 := bm2.ScanLine[y]; for x := 0 to bm.Width * 3 - 1 do p^[x] := round((p1^[x] * (count - i) + p2^[x] * i) / count); end; Form1.Canvas.Draw(0, 0, bm); Form1.Caption := IntToStr(round(i / count * 100)) + '%'; Application.ProcessMessages; if Application.Terminated then begin break; end; end; Form1.Canvas.Draw(0, 0, bm2); Form1.Caption := 'done'; bm1.Destroy; bm2.Destroy; bm.Destroy; end; |
#3
|
||||
|
||||
![]() Предача картинок и накладывать друг на друг это геморойно, а как передать видеопоток с веб камеры по сети и воспроизвести его у получателя. Может кто сталкивался с этим?
Последний раз редактировалось TolAlik, 04.10.2009 в 14:50. |
#4
|
|||
|
|||
![]() Цитата:
![]() Ну, а если серьёзно то я советую найти в сети информацию по DSPack в оригинале, и переведя на русский язык почитать то что удалось перевести. 89% вероятности что ты найдёшь что ищешь, так как там есть кое какие темы по данному вопросу. А, в обще все самые лучшие способы естественно держатся в секрете и не один уважающий программист не выложит их на открытый показ. ![]() |
#5
|
||||
|
||||
![]() Цитата:
Так я не заставляю ни кого силком ![]() Просто, если кто сталкивался с этим, мож поделится опытом ![]() |
#6
|
||||
|
||||
![]() А где взять описание не подскажешь?
|