Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.10.2009, 19:54
Аватар для TolAlik
TolAlik TolAlik вне форума
Прохожий
 
Регистрация: 02.10.2009
Сообщения: 41
Репутация: 10
По умолчанию видеоконференция

Hi! Извиняюсь если тема такая есть, но я не нашел ее.
Нарисовалась у меня проблема, получаю видео поток с веб-камеры используя DSPack (рабочий пример ниже), а как послать по сети ума не прилажу. Находил в Инете примеры по данной теме, но там по сети посылались изображения и накладывались друг на друга у получателя, что не очень то хорошо, т.к. при большом числе картинок изображение начинало мерцать. Подскажите, кто сталкивался с этим, как посылать сам видео поток по сети? Заранее спасиб.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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  
Старый 03.10.2009, 23:46
Midmal Midmal вне форума
Прохожий
 
Регистрация: 22.08.2009
Сообщения: 41
Репутация: 10
По умолчанию

Я могу посоветовать тебе вот такой небольшой пример кода, он убирает мерцание при переходе одного изображения на другое:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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  
Старый 04.10.2009, 14:47
Аватар для TolAlik
TolAlik TolAlik вне форума
Прохожий
 
Регистрация: 02.10.2009
Сообщения: 41
Репутация: 10
По умолчанию

Предача картинок и накладывать друг на друг это геморойно, а как передать видеопоток с веб камеры по сети и воспроизвести его у получателя. Может кто сталкивался с этим?

Последний раз редактировалось TolAlik, 04.10.2009 в 14:50.
Ответить с цитированием
  #4  
Старый 05.10.2009, 03:40
Midmal Midmal вне форума
Прохожий
 
Регистрация: 22.08.2009
Сообщения: 41
Репутация: 10
По умолчанию

Цитата:
Сообщение от TolAlik
Предача картинок и накладывать друг на друг это геморойно
А не кто и не говорил что будет легко!
Ну, а если серьёзно то я советую найти в сети информацию по DSPack в оригинале, и переведя на русский язык почитать то что удалось перевести. 89% вероятности что ты найдёшь что ищешь, так как там есть кое какие темы по данному вопросу.
А, в обще все самые лучшие способы естественно держатся в секрете и не один уважающий программист не выложит их на открытый показ.
Ответить с цитированием
  #5  
Старый 05.10.2009, 20:14
Аватар для TolAlik
TolAlik TolAlik вне форума
Прохожий
 
Регистрация: 02.10.2009
Сообщения: 41
Репутация: 10
По умолчанию

Цитата:
Сообщение от Midmal
А, в обще все самые лучшие способы естественно держатся в секрете и не один уважающий программист не выложит их на открытый показ.

Так я не заставляю ни кого силком
Просто, если кто сталкивался с этим, мож поделится опытом
Ответить с цитированием
  #6  
Старый 06.10.2009, 18:02
Аватар для TolAlik
TolAlik TolAlik вне форума
Прохожий
 
Регистрация: 02.10.2009
Сообщения: 41
Репутация: 10
По умолчанию

А где взять описание не подскажешь?
Ответить с цитированием
  #7  
Старый 07.10.2009, 00:04
Midmal Midmal вне форума
Прохожий
 
Регистрация: 22.08.2009
Сообщения: 41
Репутация: 10
По умолчанию

Ок, вот тут можно найти то что ищешь
Код HTML:
http://directshow.wonderu.com/)
и
Код HTML:
http://directshow.wonderu.com/first5
только вот я не знаю работает ли сейчас первая ссылка... А, вот тут можно награбить много хороших исходных кодов с использованием DSPack
Код HTML:
http://code.progler.ru/tags/new/32
А так же можешь зайти сюда
Код HTML:
http://www.vr-online.ru/
и поищи там исходник простой видео конференции.
Ответить с цитированием
  #8  
Старый 07.10.2009, 17:24
Аватар для TolAlik
TolAlik TolAlik вне форума
Прохожий
 
Регистрация: 02.10.2009
Сообщения: 41
Репутация: 10
По умолчанию

Спасиб за ссылки
был на этой ссылке
Код HTML:
http://directshow.wonderu.com/
статья похоже писалась для продвинутых программистов,
из того что там на писанно понял только несколько предложений
Ответить с цитированием
  #9  
Старый 08.10.2009, 01:51
Midmal Midmal вне форума
Прохожий
 
Регистрация: 22.08.2009
Сообщения: 41
Репутация: 10
По умолчанию

Ух... Ну, я тогда не знаю где ещё можно глянуть... Если только периодически пытаться искать в поисковиках, используя разные комбинации запросов...
Ответить с цитированием
  #10  
Старый 08.10.2009, 19:06
Аватар для TolAlik
TolAlik TolAlik вне форума
Прохожий
 
Регистрация: 02.10.2009
Сообщения: 41
Репутация: 10
По умолчанию

Я прочитал статью DirectShow по-русски, которую ты указал . Как я понял из документации видеопоток и аудиопоток берется из класса TFilterGraph или я не так понял? И если так то каким лучше воспользоваться компонентом для их передачи по сети? Не подскажешь
Ответить с цитированием
  #11  
Старый 09.10.2009, 03:50
Midmal Midmal вне форума
Прохожий
 
Регистрация: 22.08.2009
Сообщения: 41
Репутация: 10
По умолчанию

Если у тебе есть в памяти пакет DSPakc, то значит и имеется папка с demo примерами использования данного пакета. Попробуй там поискать, там ты найдёшь то что тебе нужно. Конечно не в одной программе и сразу всё, а в некоторых. Просмотри проекты VideoCap, Filters и PlayVideoCap как только разберёшься с этими demo проектами тебе останется только вытащить от туда нужные тебе участки кода и склеить их в своей программе, ну по желанию можешь конечно добавить что-то своё...
Ответить с цитированием
  #12  
Старый 09.10.2009, 08:42
Аватар для TolAlik
TolAlik TolAlik вне форума
Прохожий
 
Регистрация: 02.10.2009
Сообщения: 41
Репутация: 10
По умолчанию

Да, я уже смотрел примеры, и много чего полезного нашел

Цитата:
Сообщение от Midmal
ну по желанию можешь конечно добавить что-то своё...

а добавлять свое это само собой
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:20.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025