<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div>Hi.<br></div>
<div>Silvio you are right,That is a miss understanding.<br></div>
<div>Here another test with DelphiFFmpeg,I don't have full version and I can test it with Delphi.<br></div>
<div>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?<br></div>
<div>My goal is buffer second one before first one and after first one finished play second almost imminently.<br></div>
<div>I also attached Delphi project.<br></div>
<div> </div>
<blockquote><pre><code class="bbc_code">unit Unit2;<br><br>interface<br><br>uses<br>  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,<br>  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, FFBaseComponent, MemoryProtocol,<br>  Vcl.FFPlay, Vcl.StdCtrls, Vcl.MemoryAccess;<br><br>type<br>  TForm2 = class(TForm)<br>    FFPlayer: TFFPlayer;<br>    Panel1: TPanel;<br>    Button1: TButton;<br>    MAA: TMemoryAccessAdapter;<br>    ListBox1: TListBox;<br>    Timer1: TTimer;<br>    procedure FormCreate(Sender: TObject);<br>    procedure Button1Click(Sender: TObject);<br>    procedure MAAClose(Sender: TObject);<br>    function MAAOpen(Sender: TObject; AURLContext: Pointer; const APrivateData: string; AFlags: Integer): Boolean;<br>    function MAARead(Sender: TObject; var Buffer; Count: Integer): Integer;<br>    function MAASeek(Sender: TObject; const Offset: Int64; Origin: TSeekOrigin): Int64;<br>    function MAAWrite(Sender: TObject; const Buffer; Count: Integer): Integer;<br>    procedure FFPlayerState(Sender: TObject; APlayState: TPlayState);<br>    procedure Timer1Timer(Sender: TObject);<br>  private<br>    { Private declarations }<br>  public<br>    FStream: TStream;<br>    LFileName: string;<br>    ci: Integer;<br>    changing: Boolean;<br>    l1,l2:Integer;<br>    n1,n2:Integer;<br>    nn:Boolean;<br>    procedure AddMsgLog(AMsg: string);<br>    procedure PlayNext(ADelta: Integer = 1);<br>    procedure TryPlay(AIsDiskFile: Boolean);<br>  end;<br><br>var<br>  Form2: TForm2;<br><br>implementation<br><br>{$R *.dfm}<br><br>procedure TForm2.AddMsgLog(AMsg: string);<br>begin<br>  ListBox1.Items.Add(AMsg);<br>  ListBox1.TopIndex := ListBox1.Items.Count - 1;<br>end;<br><br>procedure TForm2.Button1Click(Sender: TObject);<br>begin<br>  FFPlayer.TryOpen(Format('memory:%d', [Integer(MAA.Stream)]), Panel1.Handle, False);<br>end;<br><br>procedure TForm2.FFPlayerState(Sender: TObject; APlayState: TPlayState);<br>const<br>  CPlayState: array [TPlayState] of string = ('Play', 'Pause', 'Resume', 'Step', 'Stop', 'End');<br>begin<br>  // OnState event handler<br><br>  // show state<br>  AddMsgLog(CPlayState[APlayState]);<br><br>  case APlayState of<br>  psPlay:<br>  begin<br>    l2:=GetTickCount;<br>       AddMsgLog('---Play time: ' + inttostr(l2 - l1));<br>  end;<br>  psStop:<br>  begin<br>      n2:=GetTickCount;<br>       AddMsgLog('---Stop time: ' + inttostr(n2 - n1));<br>  end;<br>    psEnd:<br>      begin<br>      l1:=GetTickCount;<br>      n1:=GetTickCount;<br>        FFPlayer.Pause;<br>        if ci < 2 then<br>          if not changing then<br>            PlayNext;<br>        // FFPlayer.Seek(0, [sfBackward]);<br>        // LFileName := 'C:\ffmpeg\bin\tmp\OUTPUT1.mp4';<br>        // FFPlayer.TryOpen(Format('memory:%d', [Integer(MAA.Stream)]), Panel1.Handle, False);<br>        // FFPlayer.Resume;<br>      end;<br>  end;<br>end;<br><br>procedure TForm2.FormCreate(Sender: TObject);<br>begin<br>  ci := 0;<br>  changing := False;<br>  FFPlayer.SetLicenseKey('FSXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX');<br>  FStream := nil;<br>  if not FFPlayer.AVLibLoaded then<br>  begin<br>    if not FFPlayer.LoadAVLib(ExtractFilePath(Application.ExeName) + 'LibAV') then<br>    begin<br>      ShowMessage('h');<br>    end;<br>    register_memory_protocol;<br>  end;<br><br>end;<br><br>procedure TForm2.MAAClose(Sender: TObject);<br>begin<br>  if FStream <> nil then<br>    FreeAndNil(FStream);<br>end;<br><br>function TForm2.MAAOpen(Sender: TObject; AURLContext: Pointer; const APrivateData: string; AFlags: Integer): Boolean;<br><br>  function GetFileSize(const FileName: String): Int64;<br>  var<br>    SearchRec: TSearchRec;<br>  begin<br>    if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then<br>      Result := SearchRec.Size<br>    else<br>      Result := -1;<br>  end;<br><br>var<br>  LFileSize: Int64;<br>  t1, t2: Integer;<br>begin<br>  t1 := GetTickCount;<br>  Result := False;<br><br>  if FStream <> nil then<br>    FreeAndNil(FStream);<br><br>  LFileName := 'C:\ffmpeg\bin\tmp\OUTPUT' + inttostr(ci) + '.mp4';<br>  LFileSize := GetFileSize(LFileName);<br>  if LFileSize <= 0 then<br>    AddMsgLog('file error')<br>  else if LFileSize < 1024 * 1024 * 10 then<br>  begin<br>    // less than 10 MB, use TMemoryStream<br>    FStream := TMemoryStream.Create;<br>    (FStream as TMemoryStream).LoadFromFile(LFileName);<br>  end<br>  else<br>    // for large file, use TFileStream<br>    FStream := TFileStream.Create(LFileName, fmOpenRead);<br><br>  Result := FStream <> nil;<br>  t2 := GetTickCount;<br>  AddMsgLog('Open time: ' + inttostr(t2 - t1));<br>end;<br><br>function TForm2.MAARead(Sender: TObject; var Buffer; Count: Integer): Integer;<br>var<br>  t1, t2: Integer;<br>begin<br>  t1 := GetTickCount;<br>  if not Assigned(FStream) then<br>  begin<br>    Result := -1;<br>    Exit;<br>  end;<br>  Result := FStream.Read(Buffer, Count);<br>  AddMsgLog(Format('MAA read from input stream %d -> %d', [Count, Result]));<br>  t2 := GetTickCount;<br>  AddMsgLog('Reed time: ' + inttostr(t2 - t1));<br>end;<br><br>function TForm2.MAASeek(Sender: TObject; const Offset: Int64; Origin: TSeekOrigin): Int64;<br>var<br>  t1, t2: Integer;<br>begin<br>  t1 := GetTickCount;<br>  if not Assigned(FStream) then<br>  begin<br>    Result := -1;<br>    Exit;<br>  end;<br>  Result := FStream.Seek(Offset, Origin);<br>  AddMsgLog(Format('MAA seek input stream [whence: %d] %d -> %d', [Ord(Origin), Offset, Result]));<br>  t2 := GetTickCount;<br>  AddMsgLog('Seek time: ' + inttostr(t2 - t1));<br>end;<br><br>function TForm2.MAAWrite(Sender: TObject; const Buffer; Count: Integer): Integer;<br>begin<br>  Result := -1;<br>end;<br><br>procedure TForm2.PlayNext(ADelta: Integer);<br>begin<br>  changing := True;<br>  Timer1.Interval := 1;<br>  AddMsgLog('Run timer');<br>  Timer1.Enabled := True;<br>end;<br><br>procedure TForm2.Timer1Timer(Sender: TObject);<br>begin<br>  Timer1.Enabled := False;<br>  AddMsgLog('Play next');<br>  TryPlay(True);<br>end;<br><br>procedure TForm2.TryPlay(AIsDiskFile: Boolean);<br>begin<br>  ci := ci + 1;<br>  FFPlayer.TryOpen(Format('memory:%d', [Integer(MAA.Stream)]), Panel1.Handle, False);<br>  changing := False;<br>end;<br><br>end.</code></pre></blockquote><div> </div>
<div>Regards,<br></div>
<div id="sig12586409"><div class="signature">Ara<br></div>
</div>
<div> </div>
<div> </div>
<pre>
-- 
http://www.fastmail.com - Does exactly what it says on the tin
</pre>
</body>
</html>