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

Delphi Sources



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

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

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  
Старый 03.10.2009, 23:46
Midmal Midmal вне форума
Прохожий
 
Регистрация: 22.08.2009
Сообщения: 41
Репутация: 10
По умолчанию

Я могу посоветовать тебе вот такой небольшой пример кода, он убирает мерцание при переходе одного изображения на другое:
Код:
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
По умолчанию

А где взять описание не подскажешь?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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