![]() |
|
|
#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
|
||||
|
||||
|
А где взять описание не подскажешь?
|
|
#7
|
|||
|
|||
|
Ок, вот тут можно найти то что ищешь
Код HTML:
Код HTML:
Код HTML:
Код HTML:
![]() |
|
#8
|
||||
|
||||
|
Спасиб за ссылки
![]() был на этой ссылке Код HTML:
из того что там на писанно понял только несколько предложений ![]() |
|
#9
|
|||
|
|||
|
Ух... Ну, я тогда не знаю где ещё можно глянуть... Если только периодически пытаться искать в поисковиках, используя разные комбинации запросов...
![]() |
|
#10
|
||||
|
||||
|
Я прочитал статью DirectShow по-русски, которую ты указал
. Как я понял из документации видеопоток и аудиопоток берется из класса TFilterGraph или я не так понял? И если так то каким лучше воспользоваться компонентом для их передачи по сети? Не подскажешь ![]() |
|
#11
|
|||
|
|||
|
Если у тебе есть в памяти пакет DSPakc, то значит и имеется папка с demo примерами использования данного пакета. Попробуй там поискать, там ты найдёшь то что тебе нужно. Конечно не в одной программе и сразу всё, а в некоторых. Просмотри проекты VideoCap, Filters и PlayVideoCap как только разберёшься с этими demo проектами тебе останется только вытащить от туда нужные тебе участки кода и склеить их в своей программе, ну по желанию можешь конечно добавить что-то своё...
|
|
#12
|
||||
|
||||
|
Да, я уже смотрел примеры, и много чего полезного нашел
Цитата:
а добавлять свое это само собой ![]() |