Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2017, 10:06   #1
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию Проблема с libvlc_video_set_callbacks в LibVlc

Добрый день форумчане!
Делаю программу по работе с изображением с ip камерами в модуле LibVlc и столкнулся с проблемой с обработкой буфера изображения в обратном вызове вызваном функцией libvlc_video_set_callbacks, к камерам подключился без проблем все четко показывает если не вызывать эту функцию

вызываю так
Код:
libvlc_video_set_callbacks(FMediaPlayer,libvlc_video_lock_cb_,libvlc_video_unlock_cb_,libvlc_video_display_cb_RV32_,Self);
FVIDEO_W:= 800;
FVIDEO_H:= 600;
FVIDEO_ByteCount:= 3;
libvlc_video_set_format(FMediaPlayer,'RV24', FVIDEO_W, FVIDEO_H, FVIDEO_W*FVIDEO_ByteCount);
пытаюсь хоть что то получить в обратных вызовах хотя в showmessage получаю в функции libvlc_video_lock_cb_ а потом вот эти ошибки
Код:
function libvlc_video_lock_cb_(opaque: Pointer; var planes : Pointer) : Pointer; cdecl;
procedure libvlc_video_unlock_cb_(opaque: Pointer; picture : Pointer; planes : Pointer); cdecl;
procedure libvlc_video_display_cb_RV32_(opaque: Pointer; picture : Pointer); cdecl;

function libvlc_video_lock_cb_(opaque: Pointer; var planes : Pointer) : Pointer; cdecl;
var
Player: TVideoLibvlc;
begin
Player:= TVideoLibvlc(opaque);
Showmessage(Player.FURLConnect);
//Result:= nil;
end;

procedure libvlc_video_unlock_cb_(opaque: Pointer; picture : Pointer; planes : Pointer); cdecl;
var
Player: TVideoLibvlc;
begin
Player:= TVideoLibvlc(opaque);
Showmessage(Player.FURLConnect);
end;

procedure libvlc_video_display_cb_RV32_(opaque: Pointer; picture : Pointer); cdecl;
var
Player: TVideoLibvlc;
begin
Player:= TVideoLibvlc(opaque);
Showmessage(Player.FURLConnect);
end;
в чем может быть причина, буду благодарен за решение этой проблемы, все делаю как в интернете в примерах написано
Изображения
Тип файла: jpg 1.jpg (101.6 Кб, 145 просмотров)
Тип файла: png 2.png (48.6 Кб, 142 просмотров)

Последний раз редактировалось Aliens_wolfs; 03.03.2017 в 10:22.
Aliens_wolfs вне форума Ответить с цитированием
Старый 25.04.2017, 16:21   #2
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Я все мучаюсь с этим вопросом.
Ошибку исправил но не могу с изображением работать, картинка кривая
Код:
function libvlc_video_lock_cb_(opaque: Pointer; var planes : Pointer) : Pointer; cdecl;
var
Player: TVideoLibvlc;
begin
Player:= TVideoLibvlc(opaque);
planes:= nil;
end;

procedure libvlc_video_unlock_cb_(opaque, picture, planes : Pointer); cdecl;
var
Player: TVideoLibvlc;
begin
Player:= TVideoLibvlc(opaque);
end;

procedure libvlc_video_display_(opaque, picture : Pointer); cdecl;
var
Y, X, I: integer;
Player: TVideoLibvlc;
src: PByte;
VIDEO_ByteWidth: DWORD;
begin
Player:= TVideoLibvlc(opaque);
 VIDEO_ByteWidth := player.FVIDEO_W * player.FVIDEO_ByteCount;
    src:= picture;
    for y := 0 to player.FVIDEO_H-1 do
    begin
      Move(src^, player.FViewBMP.ScanLine[y]^, VIDEO_ByteWidth);
      Inc(src, VIDEO_ByteWidth);
    end;

end;
Задаю вызов так
Код:
FVIDEO_W:= 800;
FVIDEO_H:= 600;
FVIDEO_ByteCount:= 3;

FViewBMP.Width:= FVIDEO_W;
FViewBMP.Height:= FVIDEO_H;
FViewBMP.PixelFormat:=pf24bit;

libvlc_video_set_format(FMediaPlayer, 'RV32', FVIDEO_W, FVIDEO_H, FVIDEO_W * FVIDEO_ByteCount);
libvlc_video_set_callbacks(FMediaPlayer, libvlc_video_lock_cb_, libvlc_video_unlock_cb_, libvlc_video_display_, Self);
Кто подскажет как в PasLib изображение извлекать, голову ломаю уже долго, примеров мало да и все не рабочие, буду благодарен. Обратный вызов работает но изображение кривое.

делаю по примеру от суда http://www.cyberforum.ru/delphi-wina...ad1512508.html пост#17

Последний раз редактировалось Aliens_wolfs; 25.04.2017 в 22:14.
Aliens_wolfs вне форума Ответить с цитированием
Старый 15.10.2017, 12:05   #3
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Кому интересно я решил эту проблему давно, в интернете подсказок мало на этот счет, картинку получаю в DIB

Код:
  type
  PVDByteArray = ^TVDByteArray;
  TVDByteArray = array[0..$FFFF] of byte;

type
PVideoLibvlc = ^TVideoLibvlc;
TVideoLibvlc = record
   VideoLibvlc: PVideoLibvlc;
   TickTimeOut: Dword;
   SrcPlay: String;
   Started: boolean;
   MediaPlayer: libvlc_media_player_t_ptr;
   EventManager: libvlc_event_manager_t_ptr;
   pInst : libvlc_instance_t_ptr;
   pMedia: libvlc_media_t_ptr;
   TimerID: Dword;
   VIDEO_W: Integer;
   VIDEO_H: Integer;
   VIDEO_ByteCount: Integer;
   SrcHDC: HDC;
   SrcBitmap: TBitmap;
   pPixel: PVDByteArray;
tnd

function libvlc_video_lock_cb_(opaque: Pointer; var planes : Pointer) : Pointer; cdecl;
var
VideoLibvlc: PVideoLibvlc;
begin
VideoLibvlc:= PVideoLibvlc(opaque);
if VideoLibvlc = nil then
exit;
planes:= VideoLibvlc.pPixel;  {PByteArray}
 if (libvlc_media_player_is_playing(VideoLibvlc.MediaPlayer) <> 0) then
 VideoLibvlcCreateDibBitmap(VideoLibvlc, '');
end;

procedure libvlc_video_display_(opaque, picture : Pointer); cdecl;
var
VideoLibvlc: PVideoLibvlc;
begin
VideoLibvlc:= PVideoLibvlc(opaque);
picture:= nil;
end;

procedure libvlc_video_unlock_cb_(opaque, picture, planes : Pointer); cdecl;
var
  VideoLibvlc: PVideoLibvlc;
begin
VideoLibvlc:= PVideoLibvlc(opaque);
picture:= nil;
planes:= nil;
end;

procedure VideoLibvlcCreateDibBitmap(VideoLibvlc: PVideoLibvlc; sTitle: string);
var
pPixel: PVDByteArray;
pBuffer: PVDByteArray;
BitmapInfo : TBitmapInfo;
i, Y, VIDEO_ByteWidth: cardinal;
mainDC, DC: HDC;
InfoSize, biSizeImages: Dword;
HDCBitmap: HBITMAP;
titleBmp: Tbitmap;
begin

  // Создание DIB
    FillChar(BitmapInfo, SizeOf(TBitmapInfo), 0);
  with BitmapInfo.bmiHeader do
  begin
      biSize := sizeof(tagBITMAPINFOHEADER);
      biWidth := VideoLibvlc.VIDEO_W;
      biHeight := VideoLibvlc.VIDEO_H;
      biPlanes := 1;
      if VideoLibvlc.VIDEO_ByteCount = 3 then
      begin
      VideoLibvlc.SrcBitmap.PixelFormat := pf24bit;
      biBitCount := 24;
      end;
      if VideoLibvlc.VIDEO_ByteCount = 4 then
      begin
      VideoLibvlc.SrcBitmap.PixelFormat := pf32bit;
      biBitCount := 32;
      end;
      biCompression := BI_RGB;
      biSizeImage := (((biWidth * biBitCount) + 31) div 32) * 4 * biHeight;
    end;

  mainDC := GetDC( 0 );
  DC:= CreateCompatibleDC(mainDC);
  pBuffer:= VideoLibvlc.pPixel;
  try
  HDCBitmap:= CreateDIBSection(DC, BitmapInfo, DIB_RGB_COLORS, Pointer(pPixel), 0, 0);
  GetDIBSizes(HDCBitmap, InfoSize, biSizeImages);
  if (HDCBitmap <= 0) or (biSizeImages <= 0) or (VideoLibvlc.SrcBitmap = nil) or
  (pBuffer = nil) then
  exit;

  VIDEO_ByteWidth := VideoLibvlc.VIDEO_W * VideoLibvlc.VIDEO_ByteCount;
    for y := 0 to VideoLibvlc.VIDEO_H-1 do
    begin
      Move(pBuffer^, VideoLibvlc.SrcBitmap.ScanLine[y]^, VIDEO_ByteWidth);
      INC(PByte(pBuffer), VIDEO_ByteWidth);
    end;

//Пишем нужную инфу в кадре по середине
if sTitle <> '' then
begin
  titleBmp:= Tbitmap.Create;
  PrepareBitmapBW(VideoLibvlc.SrcBitmap);
  titleBmp.Canvas.Font.Size:= 18;
  titleBmp.Canvas.Font.Style:= [fsBold];
  titleBmp.Height:= 40;
  titleBmp.Width:= Length(sTitle) * titleBmp.Canvas.Font.Size;
  titleBmp.Canvas.Brush.Color:= clBlue;
  titleBmp.Canvas.FillRect(titleBmp.Canvas.ClipRect);
  titleBmp.Canvas.Font.Color:= clRed;
  titleBmp.Canvas.TextOut(2, 0, sTitle);
  titleBmp.Transparent:= true;

  VideoLibvlc.SrcBitmap.Canvas.Draw((VideoLibvlc.SrcBitmap.Width div 2) - (titleBmp.Width div 2), VideoLibvlc.SrcBitmap.Height div 2, titleBmp);
  titleBmp.Free;
end;

 GetDIBits(dc, VideoLibvlc.SrcBitmap.Handle, 0, VideoLibvlc.VIDEO_H, pPixel, BitmapInfo, DIB_RGB_COLORS);

  StretchDIBits(VideoLibvlc.SrcHDC, 0, 0, VideoLibvlc.VIDEO_W, VideoLibvlc.VIDEO_H,
   0, 0, VideoLibvlc.VIDEO_W, VideoLibvlc.VIDEO_H, pPixel, BitmapInfo, DIB_RGB_COLORS, SRCCOPY);

  finally
  DeleteObject( HDCBitmap );
  ReleaseDC( 0, mainDC );
  DeleteDC( DC );
  end;
end;

Последний раз редактировалось Aliens_wolfs; 15.10.2017 в 12:29.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка наличия rtsp-потока для воспроизведения через libvlc Programmer0 Мультимедиа в Delphi 2 25.12.2015 16:16
Неблокирующий сокет Си проблема с закрытием, проблема с закрытием сокетов в цикле mnx_vol C/C++ Сетевое программирование 0 06.11.2012 13:57
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37