<!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>