Recent

Author Topic: Play video from memory  (Read 19731 times)

aradeonas

  • Hero Member
  • *****
  • Posts: 824
Play video from memory
« on: February 10, 2015, 09:43:00 am »
Hi,
Is any one known a library for playing a video from memory?I want to first open the file in memory and then pass it to player.
 

aradeonas

  • Hero Member
  • *****
  • Posts: 824
Re: Play video from memory
« Reply #1 on: February 14, 2015, 09:59:23 am »
I am looking for a way to play 2 video in a row without any delay (or
very tiny delay) when changing files.   
I had 1 mp4 file and with ffmpeg I split it into 2 file and now I want
to add them in playlist and play them but I don't want user feel
changing video but when I test it because of loading file there is a
delay.   
I think about stream second file into memory before first file end.
How can I do this?   
I tested LibVLC and read http://stackoverflow.com/questions/19785254/play-a-video-from-memorystream-using-ffmpeg but still no luck.   
Files are small (less than 5mb).

Here a demo that play first file and then go to second file but there is a delay,How can I pass second file from memory so minimizing the delay.

 
Code: [Select]
   unit MainFormUnit;
   
    {$mode Delphi}{$H+}
   
    interface
   
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus,LCLIntf, LCLType,
      ExtCtrls, StdCtrls,PasLibVlcUnit,PasLibVlcPlayerUnit;
   
    const
      MAX_ARGS = 255;
   
    type
   
      { TMainForm }
   
      TMainForm = class(TForm)
        Button1: TButton;
        MenuFile: TMenuItem;
        MenuFileOpen: TMenuItem;
        MenuFileQuit: TMenuItem;
        Panel1: TPanel;
        Panel2: TPanel;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        p_li: libvlc_instance_t_ptr;
        p_mi: libvlc_media_player_t_ptr;
        argv: packed array[0..MAX_ARGS - 1] of ansistring;
        args: packed array[0..MAX_ARGS - 1] of PAnsiChar;
        argc: integer;
        p_mi_ev_mgr: libvlc_event_manager_t_ptr;
        procedure AddArg(Value: ansistring);
        procedure PlayerInit();
        procedure PlayerPlay(fileName: WideString);
        procedure PlayerStop();
        procedure PlayerDestroy();
        procedure WmMediaPlayerEndReached(var m: TVlcMessage); message WM_MEDIA_PLAYER_END_REACHED;
      public
        { Public declarations }
      end;
   
    var
      MainForm: TMainForm;
   
    procedure lib_vlc_player_event_hdlr(p_event: libvlc_event_t_ptr; Data: Pointer); cdecl;
   
    implementation
   
    {$R *.lfm}
    procedure lib_vlc_player_event_hdlr(p_event: libvlc_event_t_ptr; Data: Pointer); cdecl;
    var
      Form: TMainForm;
    begin
      if (Data = nil) then
        exit;
      Form := TMainForm(Data);
      if not Assigned(Form) then
        exit;
      case p_event^.event_type of
        libvlc_MediaPlayerEndReached:
          PostMessage(Form.Handle, WM_MEDIA_PLAYER_END_REACHED, WPARAM(0), LPARAM(0));
      end;
    end;
   
    { TMainForm }
   
    procedure TMainForm.AddArg(Value: ansistring);
    begin
      if (argc < MAX_ARGS) then
      begin
        argv[argc] := Value;
        args[argc] := PAnsiChar(argv[argc]);
        Inc(argc);
      end;
    end;
   
    procedure TMainForm.PlayerInit();
    begin
      libvlc_dynamic_dll_init();
   
      if (libvlc_dynamic_dll_error <> '') then
      begin
        MessageDlg(libvlc_dynamic_dll_error, mtError, [mbOK], 0);
        exit;
      end;
   
      argc := 0;
      AddArg(libvlc_dynamic_dll_path);
      AddArg('--intf=dummy');
      AddArg('--ignore-config');
      AddArg('--quiet');
      AddArg('--no-video-title-show');
      AddArg('--no-video-on-top');
   
      p_li := libvlc_new(argc, @args);
      p_mi := nil;
    end;
   
    procedure TMainForm.PlayerPlay(fileName: WideString);
    var
      p_md: libvlc_media_t_ptr;
      a_st: ansistring;
      p_st: PAnsiChar;
    begin
      PlayerStop();
   
      a_st := UTF8Encode(fileName);
      p_st := PAnsiChar(@a_st[1]);
   
      p_md := libvlc_media_new_path(p_li, p_st);
   
      if (p_md <> nil) then
      begin
        p_mi := libvlc_media_player_new_from_media(p_md);
        if (p_mi <> nil) then
        begin
          libvlc_video_set_key_input(p_mi, 1);
          libvlc_video_set_mouse_input(p_mi, 1);
          libvlc_media_player_set_display_window(p_mi, SELF.Handle);
          p_mi_ev_mgr := libvlc_media_player_event_manager(p_mi);
          libvlc_event_attach(p_mi_ev_mgr, libvlc_MediaPlayerEndReached, @lib_vlc_player_event_hdlr, SELF);
        end;
        libvlc_media_player_play(p_mi);
        libvlc_media_release(p_md);
      end;
    end;
   
    procedure TMainForm.PlayerStop();
    begin
      if (p_mi <> nil) then
      begin
        libvlc_media_player_stop(p_mi);
        while (libvlc_media_player_get_state(p_mi) = libvlc_Playing) do
        begin
          Sleep(50);
        end;
        libvlc_media_player_release(p_mi);
        p_mi := nil;
      end;
    end;
   
    procedure TMainForm.PlayerDestroy();
    begin
      if (p_li <> nil) then
      begin
        PlayerStop();
        libvlc_release(p_li);
        p_li := nil;
      end;
    end;
   
    procedure TMainForm.WmMediaPlayerEndReached(var m: TVlcMessage);
    begin
     PlayerPlay('C:\ffmpeg\bin\tmp\OUTPUT1.mp4');
    end;
   
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
      p_li := nil;
      p_mi := nil;
      PlayerInit();
   
      Button1.Click;
    end;
   
    procedure TMainForm.Button1Click(Sender: TObject);
    begin
        PlayerPlay('C:\ffmpeg\bin\tmp\OUTPUT0.mp4');
    end;
   
    procedure TMainForm.FormDestroy(Sender: TObject);
    begin
      PlayerDestroy();
    end;
   
    end.

mercury

  • Full Member
  • ***
  • Posts: 154
Re: Play video from memory
« Reply #2 on: February 15, 2015, 10:24:52 am »
 I want to know, too.
And, I think vlc is too many dll too load.
ffplay is simple, anyway to port it to Lazaru ?

aradeonas

  • Hero Member
  • *****
  • Posts: 824
Re: Play video from memory
« Reply #3 on: March 04, 2015, 05:30:16 pm »
Any one know a library or way to buffer video file into memory and then
pass it to player?
Any simple player do the job but it should support a way to open file
from memory.

metis

  • Sr. Member
  • ****
  • Posts: 302
Re: Play video from memory
« Reply #4 on: March 14, 2015, 02:26:17 pm »
@aradeonas
Just read Your code -> This is toooo sloooow. ;D
Just imagine, what You have to close and reopen this way.

@mercury

Quote
ffplay is simple, anyway to port it to Lazaru ?
Compiled 'ffplay.exe' is simple to use indeed, porting it to Lazarus not that much. ::)
-> see my Thread "NON(!)-EXE FFPlay4Laz"
http://forum.lazarus.freepascal.org/index.php/topic,26666.0.html
-> I'm just on it - appreciate any assistance. :D
Life could be so easy, if there weren't those f*** Details.
My FFmpeg4Lazarus = FFPlay4Laz + FFGrab4Laz + FFInfo4Laz

aradeonas

  • Hero Member
  • *****
  • Posts: 824
Re: Play video from memory
« Reply #5 on: March 14, 2015, 02:34:51 pm »
You are right,But mu other test also didnt work.
This I time I PasLibVLC and made two player and load both file and play both one but after second one finished reading file I stooped it and after first one finished play second,but they cant play in one screen:
Code: [Select]
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, PasLibVlcPlayerUnit, Forms, Controls, Graphics,
  Dialogs, StdCtrls, ExtCtrls,LazLogger,LCLIntf, PasLibVlcUnit;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ListBox1: TListBox;
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    player1: TPasLibVlcPlayer;
    player2: TPasLibVlcPlayer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Panel2Click(Sender: TObject);
    procedure player1MediaPlayerBuffering(Sender: TObject);
    procedure player1MediaPlayerEndReached(Sender: TObject);
    procedure player1MediaPlayerLengthChanged(Sender: TObject; time: Int64);
    procedure player1MediaPlayerMediaChanged(Sender: TObject; mrl: string);
    procedure player1MediaPlayerOpening(Sender: TObject);
    procedure player1MediaPlayerPausableChanged(Sender: TObject; val: Boolean);
    procedure player1MediaPlayerPaused(Sender: TObject);
    procedure player1MediaPlayerPlaying(Sender: TObject);
    procedure player1MediaPlayerPositionChanged(Sender: TObject;
      Aposition: Single);
    procedure player1MediaPlayerStopped(Sender: TObject);
    procedure player1MediaPlayerTimeChanged(Sender: TObject; time: Int64);
    procedure player2MediaPlayerBuffering(Sender: TObject);
    procedure player2MediaPlayerEndReached(Sender: TObject);
    procedure player2MediaPlayerLengthChanged(Sender: TObject; time: Int64);
    procedure player2MediaPlayerMediaChanged(Sender: TObject; mrl: string);
    procedure player2MediaPlayerOpening(Sender: TObject);
    procedure player2MediaPlayerPausableChanged(Sender: TObject; val: Boolean);
    procedure player2MediaPlayerPaused(Sender: TObject);
    procedure player2MediaPlayerPlaying(Sender: TObject);
    procedure player2MediaPlayerPositionChanged(Sender: TObject;
      Aposition: Single);
    procedure player2MediaPlayerStopped(Sender: TObject);
    procedure player2MediaPlayerTimeChanged(Sender: TObject; time: Int64);
  private
    { private declarations }
  public
    needStop : Boolean;
    T1:Cardinal;
    L1,L2:Int64;
    procedure Log(s:string);
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
 T1:=GetTickCount;
 needStop := TRUE;
  player1.Play('C:\ffmpeg\bin\tmp\OUTPUT0.mp4');
  //player1.PlayInWindow(Panel2);
  player2.Play('C:\ffmpeg\bin\tmp\OUTPUT2.mp4');
  //player2.PlayInWindow(Panel2);
  //  player1.Play('C:\ffmpeg\bin\tmp3\OUTPUT214.mp4');
  //  player1.PlayInWindow(Panel2);
  //  player2.Play('C:\ffmpeg\bin\tmp3\OUTPUT215.mp4');

end;

procedure TForm1.Button2Click(Sender: TObject);
begin

end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

procedure TForm1.Panel2Click(Sender: TObject);
begin
 player1.PlayInWindow(Panel3);
end;

procedure TForm1.player1MediaPlayerBuffering(Sender: TObject);
begin
  Log('player1MediaPlayerBuffering');
end;

procedure TForm1.player1MediaPlayerEndReached(Sender: TObject);
begin
  Log('player1MediaPlayerEndReached');
 { player1.Visible:=False;
  player2.Resume();}
end;


procedure TForm1.player1MediaPlayerLengthChanged(Sender: TObject; time: Int64);
begin
 Log('player1MediaPlayerLengthChanged'+ ' ' + IntToStr(time));
 L1:=time;
end;

procedure TForm1.player1MediaPlayerMediaChanged(Sender: TObject; mrl: string);
begin
  Log('player1MediaPlayerMediaChanged' + ' ' +mrl);
end;

procedure TForm1.player1MediaPlayerOpening(Sender: TObject);
begin
  Log('player1MediaPlayerOpening');
end;

procedure TForm1.player1MediaPlayerPausableChanged(Sender: TObject; val: Boolean
  );
begin
  Log('player1MediaPlayerPausableChanged');
end;

procedure TForm1.player1MediaPlayerPaused(Sender: TObject);
begin
  Log('player1MediaPlayerPaused');
end;

procedure TForm1.player1MediaPlayerPlaying(Sender: TObject);
begin
 Log('player1MediaPlayerPlaying');
end;

procedure TForm1.player1MediaPlayerPositionChanged(Sender: TObject;
  Aposition: Single);
begin
  Log('player1MediaPlayerPositionChanged' + FloatToStr(Aposition));
end;


procedure TForm1.player1MediaPlayerStopped(Sender: TObject);
begin
  Log('player1MediaPlayerStopped');
end;

procedure TForm1.player1MediaPlayerTimeChanged(Sender: TObject; time: Int64);
begin
   Log('player1MediaPlayerTimeChanged'+ ' ' + IntToStr(time));
   if time>=l1-50 then
   begin
     Log('should stop');
     player1.Stop();
     //player1.Visible:=False;
     player1.Free;
     //player1.PlayInWindow(Panel3);
     //player2.PlayInWindow(Panel2);
     player2.Resume();
   end;
end;

procedure TForm1.player2MediaPlayerBuffering(Sender: TObject);
begin
  Log('player2MediaPlayerBuffering');
end;

procedure TForm1.player2MediaPlayerEndReached(Sender: TObject);
begin
  Log('player2MediaPlayerEndReached');
end;

procedure TForm1.player2MediaPlayerLengthChanged(Sender: TObject; time: Int64);
begin
   Log('player2MediaPlayerLengthChanged'+ ' ' + IntToStr(time));
 L2:=time;
end;

procedure TForm1.player2MediaPlayerMediaChanged(Sender: TObject; mrl: string);
begin
    Log('player2MediaPlayerMediaChanged' + ' ' +mrl);
end;

procedure TForm1.player2MediaPlayerOpening(Sender: TObject);
begin
  Log('player2MediaPlayerOpening');
end;

procedure TForm1.player2MediaPlayerPausableChanged(Sender: TObject; val: Boolean
  );
begin
  Log('player2MediaPlayerPausableChanged');
end;

procedure TForm1.player2MediaPlayerPaused(Sender: TObject);
begin
  Log('player2MediaPlayerPaused');
end;

procedure TForm1.player2MediaPlayerPlaying(Sender: TObject);
begin
   Log('player2MediaPlayerPlaying');
end;

procedure TForm1.player2MediaPlayerPositionChanged(Sender: TObject;
  Aposition: Single);
begin
  Log('player2MediaPlayerPositionChanged' + FloatToStr(Aposition));
end;

procedure TForm1.player2MediaPlayerStopped(Sender: TObject);
begin
   Log('player2MediaPlayerStopped');
end;

procedure TForm1.player2MediaPlayerTimeChanged(Sender: TObject; time: Int64);
begin
   Log('player2MediaPlayerTimeChanged'+ ' ' + IntToStr(time));
    if (needStop) and (time > 1) then
  begin
    needStop := FALSE;
    Log('player2FirstFrame');
    player2.Pause();
  end;
end;

procedure TForm1.Log(s: string);
begin
 DebugLn(IntToStr(GetTickCount-T1)+' ' + s);
end;

end.


aradeonas

  • Hero Member
  • *****
  • Posts: 824
Re: Play video from memory
« Reply #6 on: March 15, 2015, 12:40:20 am »
Here another test with DelphiFFmpeg,I don't have full version and I can test it with Delphi.
I made a test that play video from memory but there is a delay between changing files,Can any one test this demo and help me with this?
My goal is buffer second one before first one and after first one finished play second almost imminently.

Code: [Select]
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, FFBaseComponent, MemoryProtocol,
  Vcl.FFPlay, Vcl.StdCtrls, Vcl.MemoryAccess;

type
  TForm2 = class(TForm)
    FFPlayer: TFFPlayer;
    Panel1: TPanel;
    Button1: TButton;
    MAA: TMemoryAccessAdapter;
    ListBox1: TListBox;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure MAAClose(Sender: TObject);
    function MAAOpen(Sender: TObject; AURLContext: Pointer; const APrivateData: string; AFlags: Integer): Boolean;
    function MAARead(Sender: TObject; var Buffer; Count: Integer): Integer;
    function MAASeek(Sender: TObject; const Offset: Int64; Origin: TSeekOrigin): Int64;
    function MAAWrite(Sender: TObject; const Buffer; Count: Integer): Integer;
    procedure FFPlayerState(Sender: TObject; APlayState: TPlayState);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    FStream: TStream;
    LFileName: string;
    ci: Integer;
    changing: Boolean;
    l1,l2:Integer;
    n1,n2:Integer;
    nn:Boolean;
    procedure AddMsgLog(AMsg: string);
    procedure PlayNext(ADelta: Integer = 1);
    procedure TryPlay(AIsDiskFile: Boolean);
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.AddMsgLog(AMsg: string);
begin
  ListBox1.Items.Add(AMsg);
  ListBox1.TopIndex := ListBox1.Items.Count - 1;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  FFPlayer.TryOpen(Format('memory:%d', [Integer(MAA.Stream)]), Panel1.Handle, False);
end;

procedure TForm2.FFPlayerState(Sender: TObject; APlayState: TPlayState);
const
  CPlayState: array [TPlayState] of string = ('Play', 'Pause', 'Resume', 'Step', 'Stop', 'End');
begin
  // OnState event handler

  // show state
  AddMsgLog(CPlayState[APlayState]);

  case APlayState of
  psPlay:
  begin
    l2:=GetTickCount;
       AddMsgLog('---Play time: ' + inttostr(l2 - l1));
  end;
  psStop:
  begin
      n2:=GetTickCount;
       AddMsgLog('---Stop time: ' + inttostr(n2 - n1));
  end;
    psEnd:
      begin
      l1:=GetTickCount;
      n1:=GetTickCount;
        FFPlayer.Pause;
        if ci < 2 then
          if not changing then
            PlayNext;
        // FFPlayer.Seek(0, [sfBackward]);
        // LFileName := 'C:\ffmpeg\bin\tmp\OUTPUT1.mp4';
        // FFPlayer.TryOpen(Format('memory:%d', [Integer(MAA.Stream)]), Panel1.Handle, False);
        // FFPlayer.Resume;
      end;
  end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  ci := 0;
  changing := False;
  FFPlayer.SetLicenseKey('FSXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX');
  FStream := nil;
  if not FFPlayer.AVLibLoaded then
  begin
    if not FFPlayer.LoadAVLib(ExtractFilePath(Application.ExeName) + 'LibAV') then
    begin
      ShowMessage('h');
    end;
    register_memory_protocol;
  end;

end;

procedure TForm2.MAAClose(Sender: TObject);
begin
  if FStream <> nil then
    FreeAndNil(FStream);
end;

function TForm2.MAAOpen(Sender: TObject; AURLContext: Pointer; const APrivateData: string; AFlags: Integer): Boolean;

  function GetFileSize(const FileName: String): Int64;
  var
    SearchRec: TSearchRec;
  begin
    if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
      Result := SearchRec.Size
    else
      Result := -1;
  end;

var
  LFileSize: Int64;
  t1, t2: Integer;
begin
  t1 := GetTickCount;
  Result := False;

  if FStream <> nil then
    FreeAndNil(FStream);

  LFileName := 'C:\ffmpeg\bin\tmp\OUTPUT' + inttostr(ci) + '.mp4';
  LFileSize := GetFileSize(LFileName);
  if LFileSize <= 0 then
    AddMsgLog('file error')
  else if LFileSize < 1024 * 1024 * 10 then
  begin
    // less than 10 MB, use TMemoryStream
    FStream := TMemoryStream.Create;
    (FStream as TMemoryStream).LoadFromFile(LFileName);
  end
  else
    // for large file, use TFileStream
    FStream := TFileStream.Create(LFileName, fmOpenRead);

  Result := FStream <> nil;
  t2 := GetTickCount;
  AddMsgLog('Open time: ' + inttostr(t2 - t1));
end;

function TForm2.MAARead(Sender: TObject; var Buffer; Count: Integer): Integer;
var
  t1, t2: Integer;
begin
  t1 := GetTickCount;
  if not Assigned(FStream) then
  begin
    Result := -1;
    Exit;
  end;
  Result := FStream.Read(Buffer, Count);
  AddMsgLog(Format('MAA read from input stream %d -> %d', [Count, Result]));
  t2 := GetTickCount;
  AddMsgLog('Reed time: ' + inttostr(t2 - t1));
end;

function TForm2.MAASeek(Sender: TObject; const Offset: Int64; Origin: TSeekOrigin): Int64;
var
  t1, t2: Integer;
begin
  t1 := GetTickCount;
  if not Assigned(FStream) then
  begin
    Result := -1;
    Exit;
  end;
  Result := FStream.Seek(Offset, Origin);
  AddMsgLog(Format('MAA seek input stream [whence: %d] %d -> %d', [Ord(Origin), Offset, Result]));
  t2 := GetTickCount;
  AddMsgLog('Seek time: ' + inttostr(t2 - t1));
end;

function TForm2.MAAWrite(Sender: TObject; const Buffer; Count: Integer): Integer;
begin
  Result := -1;
end;

procedure TForm2.PlayNext(ADelta: Integer);
begin
  changing := True;
  Timer1.Interval := 1;
  AddMsgLog('Run timer');
  Timer1.Enabled := True;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  AddMsgLog('Play next');
  TryPlay(True);
end;

procedure TForm2.TryPlay(AIsDiskFile: Boolean);
begin
  ci := ci + 1;
  FFPlayer.TryOpen(Format('memory:%d', [Integer(MAA.Stream)]), Panel1.Handle, False);
  changing := False;
end;

end.
« Last Edit: March 15, 2015, 12:46:52 am by aradeonas »

aradeonas

  • Hero Member
  • *****
  • Posts: 824
Re: Play video from memory
« Reply #7 on: March 15, 2015, 04:15:30 pm »
Can any one take a look at code and tell me opinion?I think about changing stream middle of playback or end of file but I'm not familiar with this area.

metis

  • Sr. Member
  • ****
  • Posts: 302
Re: Play video from memory
« Reply #8 on: March 17, 2015, 03:10:14 pm »
@aradeonas

Quote
made two player ... cant play in one screen
Your 'player1' and 'player2' ARE the screens, because:
You create them from 'TPasLibVlcPlayer', that is derived from 'TPanel', see:
Unit 'PasLibVlcPlayerUnit.pas' -> "TPasLibVlcPlayer = class(TPanel)"
=> each Player You create this way is nothing else than a 'TPanel' with some Videoplayer-Features added.
-> Maybe Show/Hide or overlap Your PlayerPanels solves Your problem (as long as You go on this way).

Where do You get 'PlayInWindow()' from; can't find its declaration in Your code ?

From which Site did You download this "ffmpegvcl.rar" ?
« Last Edit: March 17, 2015, 04:40:38 pm by metis »
Life could be so easy, if there weren't those f*** Details.
My FFmpeg4Lazarus = FFPlay4Laz + FFGrab4Laz + FFInfo4Laz

aradeonas

  • Hero Member
  • *****
  • Posts: 824
Re: Play video from memory
« Reply #9 on: March 17, 2015, 09:09:05 pm »
Hi dear metis,
Quote
Maybe Show/Hide or overlap Your PlayerPanels solves Your problem (as long as You go on this way).
I tested it and it flicker and its not a good way.
Quote
Where do You get 'PlayInWindow()' from; can't find its declaration in Your code ?
'PlayInWindow()' belong to TPasLibVlcPlayerthat is in PasLibVLC library.
Quote
From which Site did You download this "ffmpegvcl.rar" ?
Its a test project that I made and I attach that if any one like you want to test.


Mike.Cornflake

  • Hero Member
  • *****
  • Posts: 1271
Re: Play video from memory
« Reply #10 on: March 19, 2015, 02:21:11 am »
Quote
Maybe Show/Hide or overlap Your PlayerPanels solves Your problem (as long as You go on this way).
I tested it and it flicker and its not a good way.

Flicker can be solved.

In Delphi, I used to use the forbidden LockWindowUpdate a lot :-)  Bad idea, the better solution is detailed in this Answer:
http://stackoverflow.com/questions/3792217/how-can-i-disable-screen-update-which-updating-a-lot-of-controls

In Lazarus, a solution I use in a fair number of places is: 
Code: [Select]
BeginFormUpdate;
Try
  {Do the code that causes the flicker}
Finally;
  If FormIsUpdating Then
    EndFormUpdate;
End;
Lazarus Trunk/FPC latest fixes on Windows 11
  I'm getting old and stale.  Slowly getting used to git, I'll get there...

aradeonas

  • Hero Member
  • *****
  • Posts: 824
Re: Play video from memory
« Reply #11 on: March 19, 2015, 08:09:56 am »
Thank you Mike,
Its a good point but in this case it seems problem is VLC painting and doest solved with this one you said and if I force it to repaint or something else it get delay.

 

TinyPortal © 2005-2018