Что за Именованные каналы(PIPE)? Доступ к видео потоку.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Что за Именованные каналы(PIPE)? Доступ к видео потоку.

Сообщение Alex2013 » 11.08.2019 03:07:29

Суть проблемы :
1 Есть демонстрационная программа WMRViewer для доступа к видео потоку "навигационных видеокамер" WMR-шлема ( новая реализация шлемов вирт реальности )
2 Там сказано что передача данных идет через PIPE канал .
This will open a pipe at \\.\pipe\wmrcam, which local programs can connect to in order to retrieve camera images.
(Это откроет трубу в \\.\pipe\wmrcam, к которому могут подключаться локальные программы для получения изображений с камеры.)
3 Есть пример для дельфи по использованию этой "трубы" Lib.rar

:?: Вопрос: как можно поучить доступ к видео потоку ( видимо несжатое покадровое видео 1280х480 8 бит ) в своей программе на Лазарусе ?
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44


Re: Что за Именованные каналы(PIPE)? Доступ к видео потоку.

Сообщение Alex2013 » 11.08.2019 12:29:12

Спасибо посмотрю... :idea: (Но мне вообще-то больше чтение нужно )
Зы
Вообще-то я пока выкрутился через "захват окна" ...
http://cs5-1.4pda.to/17025923.jpg
Изображение
:arrow: Capture05_0.7z (Собрано в ХайАсме поэтому извиняюсь за некоторый офтоп ... хотя все "кубики" (Открываются в среде HiAsm по Ctl-F ) в этой схеме на паскале и я уже довольно многое из библиотеки элементов ХайАсма в лазарус утягивал )

Изображение
(Это я уже "отэкспортировал" изображение в свою "Подзорную трубу" + вид из моей "Виртуальной дачи" (Cliff House)


Но как-то это э... в стиле "чукчи и лампочка" ... :wink:

Добавлено спустя 1 час 38 минут 10 секунд:
Но вернусь к "именованным каналам" ...
В папке Lazarusfpc3.0.4sourcepackagesfcl-processsrc
Лежат модули (pipes.pp и pipesipc.pp ) но примеров я не нашел.

Добавлено спустя 1 час 3 минуты 20 секунд:
Как хорошо что веб ""злопамятный "
https://web.archive.org/web/20190103042 ... index.html

Добавлено спустя 6 часов 7 минут 43 секунды:
Брр...
Попытался адаптировать под Лазарус этот модуль ( Если кто то будет возится пусть переименует "pipes.pas" в например
https://micksmix.wordpress.com/2011/06/ ... or-delphi/
"test_pipes.pas" об если отстать как есть хлопот не оберетесь ! )

А возится я начал по причине наличия готового примера ...
https://r3code.livejournal.com/117012.html
(Увы пока не работает )
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Что за Именованные каналы(PIPE)? Доступ к видео потоку.

Сообщение olegy123 » 11.08.2019 23:03:27

https://github.com/dezlov/NamedPipesFPC

по исходникам там 640х480
Код: Выделить всё
struct CameraFrameInfo
{
   uint32_t unknown1; //always 0
   uint16_t stride; //always 640
   uint16_t unknown2; //0 for streams 1/2, 2 for streams 3/4
   uint64_t timestamp; //Probably 100ns steps
};


Добавлено спустя 3 минуты 39 секунд:
NamedPipes - похожи на Com-порты.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Что за Именованные каналы(PIPE)? Доступ к видео потоку.

Сообщение Alex2013 » 12.08.2019 01:36:36

olegy123 писал(а):https://github.com/dezlov/NamedPipesFPC

по исходникам там 640х480
Код: Выделить всё
struct CameraFrameInfo
{
   uint32_t unknown1; //always 0
   uint16_t stride; //always 640
   uint16_t unknown2; //0 for streams 1/2, 2 for streams 3/4
   uint64_t timestamp; //Probably 100ns steps
};


Да все верно но там ДВЕ КАМЕРЫ!

ИзображениеИзображение

Добавлено спустя 3 минуты 39 секунд:
NamedPipes - похожи на Com-порты.

Ну если были бы похожи если бы там шел сплошной поток (впрочем возможно я пока просто что-то не понял ) и не требовалось бы такая сложная процедура открытия канала ...
Зы
За ссылку и пример спасибо ! Сейчас проверю .... :idea:
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Что за Именованные каналы(PIPE)? Доступ к видео потоку.

Сообщение serbod » 12.08.2019 11:29:24

Самый простой способ использовать Named pipes через компонент DataPort (доступен через Online package manager).

Описания протокола нет, придется самому восстанавливать по исходнику: https://github.com/Triplesalt/WMRSensor ... Client.cpp
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Что за Именованные каналы(PIPE)? Доступ к видео потоку.

Сообщение Alex2013 » 12.08.2019 12:25:25

NamedPipesFPC (https://github.com/dezlov/NamedPipesFPC) от Дезлова заработал ... И даже влез на канал wmrcam (программа WMRViewer и example могут как то ""мешать друг другу" ) но предать и принять что-то кроме строк пока не выходит ...

Код: Выделить всё
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls,NamedPipes;
...

Const
ServerInstances = 5;
ClientInstances = 20;
ClientDelayMin = 100;
ClientDelayMax = 500;
ClientNumMessages = 3;
ServerIdleTimeout = 5000;
UniquePipeName = 'wmrcam';

function GetInstanceInfo: String;
begin
  Result := Format('$%x:$%x', [GetProcessID, GetThreadID]);
end;
...
procedure TForm1.Button3Click(Sender: TObject);
var
  Server: TNamedPipeServerStream;
  Client: TNamedPipeClientStream;
  PB,PB2:Pointer;
  BB,B1,b2:tBitmap ;

  PBB^:Array[1..2] of byte;
  begin
  // На форму закинуты Image1 и Image2 , Image1 пустой
  B1:=Image1.Picture.Bitmap ;b1.SetSize(640,480);
//... а в Image2 лежит тестовая картинка 640,480....
  B2:=Image2.Picture.Bitmap ;

// Конверсия ( просто картинка попалась 32 бита ) 
  bb:=tBitmap.Create; bb.SetSize(640,480);bb.PixelFormat:=pf24bit;;  bb.Canvas.Draw(0,0,b2);
 
// Создаю сервер
  Server := TNamedPipeServerStream.Create(UniquePipeName);
  try
    Server.Open; //Открываю канал на сервере ...
  // Создаю клиент
    Client := TNamedPipeClientStream.Create(UniquePipeName);
    try
      Client.Open; //Открываю канал на  клиенте
// Тест передачи строк. Server-> Client
      Server.WriteAnsiString('Server ->TEST');
      Memo1.Lines.Add (Client.ReadAnsiString);

// Тест передачи строк. Client ->Server       
      Client.WriteAnsiString('Client -> Test message at ' + DateTimeToStr(Now));
      Memo1.Lines.Add (Server.ReadAnsiString);

// Пытаюсь предать картину
     B1.BeginUpdate;
      PB:=B1.RawImage.Data;
      PB2:=Bb.RawImage.Data;
      GetMem(PBB,Bb.RawImage.DataSize);


       move (pb2^,PBB^,Bb.RawImage.DataSize);
       Server.WriteBuffer(pbb^ ,Bb.RawImage.DataSize ); // Весит тут!

      FillChar(PBB^,Bb.RawImage.DataSize,0);

      Client.ReadBuffer( pbb^,Bb.RawImage.DataSize);
      move (PBB^,pb^,Bb.RawImage.DataSize);

      FreeMem(PBB,Bb.RawImage.DataSize);
      B1.EndUpdate;
       bb.Free;
       Image1.Refresh;
    finally
      Client.Free;
    end;
  finally
    Server.Free;
  end;
  form1.Memo1.Lines.Add ('Finished. Press enter key...');
end;


На этапе Server.WriteBuffe прога вешается ...
(Кстати интересно то что канал двухсторонний передача идет как в строну Server-> Client так и Client ->Server )
Зы
Есть идея что нужно сделать два разных параллельных потока, но со строками все работает и так...

Добавлено спустя 37 минут 14 секунд:
serbod писал(а):Самый простой способ использовать Named pipes через компонент DataPort (доступен через Online package manager).

Это он ?
https://github.com/serbod/dataport
(Полезная штука, спасибо ! Но сомневаюсь, что она проще чем модуль NamedPipesFPC от Дезлова )
Описания протокола нет, придется самому восстанавливать по исходнику:
https://github.com/Triplesalt/WMRSensor ... Client.cpp

Ну до собственно чтения графических данных из WMRViewer-а я пока не добрался ...
Как я понял передача идет четырьмя протоками и из них два текстовые ... так что пока задача прочитать хотя-бы их (ну и разобраться с передачей "абстрактной картинки" ).

Добавлено спустя 54 минуты 36 секунд:
Вообще, использование "трубо каналов" это личный заскок хука WMRInterceptHost.dll и по идее можно обойтись без них ...
Но сам хук зараза мрачная .... :evil: Копнул исходники и тут-же получил весьма мрачную головную боль
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Что за Именованные каналы(PIPE)? Доступ к видео потоку.

Сообщение olegy123 » 13.08.2019 01:21:25

Alex2013 писал(а):На этапе Server.WriteBuffe прога вешается ...
(Кстати интересно то что канал двухсторонний передача идет как в строну Server-> Client так и Client ->Server )


вообще сейчас Сом поты в винде идут как именованные каналы. Лично работал с Ком портом, там аналогично с TCP - есть буфера чтения и записи, если программ не "хелло мир" то желательно подвесить на отдельный поток, который будет сигнализировать о наличии в буфере новых данных.

Добавлено спустя 4 минуты 27 секунд:
Alex2013 писал(а):Ну до собственно чтения графических данных из WMRViewer-а я пока не добрался ...

желательно прочитать техдокументацию, где расписывают что в трубе течет. Плохо когда нет описательной части - тогда нужно изучать исходники.
По опыту знаю что производитель может по всякому такое напридумать.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 27

Рейтинг@Mail.ru