Ich weiß, daß es prinzipiel über die Befehlszeile möglich ist, z.B. so:
Code: Alles auswählen
adb shell screenrecord --output-format=h264 - | <player>
Code: Alles auswählen
adb shell screenrecord --output-format=h264 - | <player>
Code: Alles auswählen
$ mkfifo buffer.fifo
$ adb shell screenrecord --output-format=h264 - 1> buffer.fifo 2> /dev/null
Code: Alles auswählen
uses BaseUnix, Unix, process, asyncprocess;
procedure TForm1.StartStream;
begin
FAdbProc.Executable:='adb';
// eventuell noch FAdbProc.Paramets füllen
FAdbProc.OnReadData:=@ReadData;
FAdbProc.OnTerminate:=@AdbTerminate;
FAdbProc.Options += [poUsePipes];
// pipe erstellen und öffnen
FpMkfifo('buffer.fifo', &600);
FBufferFile := TFileStream.Create('buffer.fifi', fmOpenWrite);
{$IFDEF LINUX}
// pipe vergrößern
FpFcntl(FBufferFile.Handle, F_SETPIPE_SZ, 1048576);
{$ENDIF}
FAdbProc.Execute;
Player.Play('buffer.fifo')
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FAdbProc := TAsyncProcess.Create(self);
end;
procedure TForm1.StopStream;
begin
FAdbProc.Terminate;
end;
procedure TForm1.ReadData(Sender: TObject);
var buff: array[0..511] of Byte;
len: Integer;
begin
// daten in pipe schreiben
while FAdbProc.Output.NumBytesAvailable > 0 do
begin
len := FAdbProc.Output.Read(buff[0], SizeOf(buff));
FBufferFile.WriteBuffer(buff[0], len);
end;
end;
procedure TForm1.AdbTerminate(Sender: TObject);
begin
// pipe schließen -> EOF in pipe
FBufferFile.Free;
end;
procedure TForm1.Form1Destroy(Sender: TObject);
begin
// fifo freigeben
fpunlink('buff.fifo');
end;
Das macht das ganze sogar noch ne ecke einfacher, denn bei UsePipes ist Output (und input) ein TStream:Adromir hat geschrieben:Ich hab mir gerade oberflächlich PasLibVlc angeschaut. Wenn ich das changelog richtig interpretiere unterstützt das ab der neuesten Version das abspielen eines TStreams.. Vielleicht ist das ne blöde frage, aber könnte das dann gehen? Den Output in einen TStream schreiben und den dann abspielen?
Code: Alles auswählen
FAdbProc := TProcess.Create;
FAdbProc.Executeable := 'adb';
FadbProc.Patameters.Delimiter := ' ';
FAdbProc.Parameters.DelimittedText := 'shell screenrecord --output-format=h264 -';
FadbProc.Options += [poUsePipes];
FadbProc.Execute;
Player.PlayFromStream(FAdbProc.Output);
Aber muss mir da noch den Code genauer anschauen.Add support for media callbacks
new procedure:
procedure Play(stm : TStream, ...); overload;