Seite 1 von 2
[FFMPEG] Wie bekomme ich die Programm Ausgabe?
Verfasst: 09.12.2018 17:08
von Mijikai
Ich würde gerne die Programm Aisgabe von FFMPEG einlesen.
Leider funktioniert es noch nicht

Wo liegt das Problem?
Code: Alles auswählen
;PB v.5.62 x64 (Windows 7)
EnableExplicit
Procedure.i FFMPEG(Video.s,Audio.s,File.s)
Protected Handle.i
Protected Parameter.s
If Video And Audio And File
Parameter + "-i " + #DQUOTE$ + Video + #DQUOTE$
Parameter + " -i " + #DQUOTE$ + Audio + #DQUOTE$
Parameter + " -vcodec h264 "
Parameter + #DQUOTE$ + File + #DQUOTE$
Debug Parameter
Handle = RunProgram("ffmpeg.exe",Parameter,#Null$,#PB_Program_Open|#PB_Program_Read|#PB_Program_Error)
If Handle
Debug Handle
While ProgramRunning(Handle)
If AvailableProgramOutput(Handle)
Debug ReadProgramError(Handle,#PB_Program_Ascii)
Debug ReadProgramString(Handle,#PB_Program_Ascii)
Debug ReadProgramError(Handle,#PB_Program_Unicode)
Debug ReadProgramString(Handle,#PB_Program_Unicode)
Debug ReadProgramError(Handle,#PB_Program_UTF8)
Debug ReadProgramString(Handle,#PB_Program_UTF8)
Debug "LOOP"
EndIf
Wend
Debug "EXIT"
Debug ProgramExitCode(Handle)
CloseProgram(Handle)
EndIf
EndIf
EndProcedure
FFMPEG("test.webm","test.weba","test.mp4")
End
Re: [FFMPEG] Wie bekomme ich die Programm Ausgabe?
Verfasst: 09.12.2018 18:24
von NicTheQuick
Gute Frage. Ich bekomme es auch nicht hin. ffmpeg scheint aber alles nach stderr zu schreiben. Dummerweise reagiert AvailableProgramOutput() nur auf stdout. Das ist wohl wieder mal ein Fall für eine nicht ganz durchdachte Purebasic-Bibliothek.

Re: [FFMPEG] Wie bekomme ich die Programm Ausgabe?
Verfasst: 09.12.2018 18:36
von Mijikai
Bleibt wohl nur der Weg über WinApi oder den Output mit TCP abzufangen...

Re: [FFMPEG] Wie bekomme ich die Programm Ausgabe?
Verfasst: 09.12.2018 18:37
von #NULL
Ich bekomme unter Linux die Error-Ausgabe wenn außerhalb von AvailableProgramOutput(). Vielleicht meinte NicTheQuick das aber auch.
Code: Alles auswählen
While ProgramRunning(Handle)
Define err.s = ReadProgramError(Handle)
If err
Debug "ERR: " + err
EndIf
If AvailableProgramOutput(Handle)
[...]
Re: [FFMPEG] Wie bekomme ich die Programm Ausgabe?
Verfasst: 09.12.2018 18:39
von Kiffi
NicTheQuick hat geschrieben:Gute Frage. Ich bekomme es auch nicht hin. ffmpeg scheint aber alles nach stderr zu schreiben. Dummerweise reagiert AvailableProgramOutput() nur auf stdout. Das ist wohl wieder mal ein Fall für eine nicht ganz durchdachte Purebasic-Bibliothek.

dann einfach AvailableProgramOutput() entfernen und die zurückgegebenen Strings nur dann beachten, wenn sie nicht leer sind.
Code: Alles auswählen
;PB v.5.62 x64 (Windows 7)
EnableExplicit
Procedure.i FFMPEG(Video.s,Audio.s,File.s)
Protected Handle.i
Protected Parameter.s
Protected RPE.s ; ReadProgramError
Protected RPS.s ; ReadProgramString
If Video And Audio And File
Parameter + "-i " + #DQUOTE$ + Video + #DQUOTE$
Parameter + " -i " + #DQUOTE$ + Audio + #DQUOTE$
Parameter + " -vcodec h264 "
Parameter + #DQUOTE$ + File + #DQUOTE$
Debug Parameter
Handle = RunProgram("ffmpeg.exe",Parameter,#Null$,#PB_Program_Open|#PB_Program_Read|#PB_Program_Error)
If Handle
Debug Handle
While ProgramRunning(Handle)
RPE = ReadProgramError(Handle)
If RPE
Debug "RPE: " + RPE
EndIf
RPS = ReadProgramString(Handle)
If RPS
Debug "RPS: " + RPS
EndIf
Wend
Debug "EXIT"
Debug ProgramExitCode(Handle)
CloseProgram(Handle)
EndIf
EndIf
EndProcedure
FFMPEG("test.webm","test.weba","test.mp4")
End
Grüße ... Peter
Edit:
#NULL hat geschrieben:Ich bekomme unter Linux die Error-Ausgabe wenn außerhalb von AvailableProgramOutput().
oha, das habe ich jetzt nicht testen können.
Re: [FFMPEG] Wie bekomme ich die Programm Ausgabe?
Verfasst: 09.12.2018 18:43
von ccode_new
Oh Kiffi du wars schneller.
funktionierendes Beispiel (getestet unter Linux):
Code: Alles auswählen
EnableExplicit
Global param.s = "-i"
Global prog.i
Global retstr.s
prog = RunProgram("ffmpeg",param,"",#PB_Program_Open| #PB_Program_Error)
If prog
Debug "ok"
While ProgramRunning(prog)
retstr = ReadProgramError(prog)
If retstr <> ""
Debug retstr
EndIf
Wend
EndIf
Debug "Exitcode " + ProgramExitCode(prog)
KillProgram(prog)
CloseProgram(prog)
"ffmpeg" schreibt auf beiden Kanälen (stdout,stderr)
Code: Alles auswählen
EnableExplicit
Global param.s = "-h"
Global prog.i
Global retstr.s
prog = RunProgram("ffmpeg",param,"",#PB_Program_Open| #PB_Program_Read)
If prog
Debug "ok"
While ProgramRunning(prog)
retstr = ReadProgramString(prog)
If retstr <> ""
Debug retstr
EndIf
Wend
EndIf
Debug "Exitcode " + ProgramExitCode(prog)
KillProgram(prog)
CloseProgram(prog)
Re: [FFMPEG] Wie bekomme ich die Programm Ausgabe?
Verfasst: 09.12.2018 20:31
von Mijikai
Kiffi hat geschrieben:
dann einfach AvailableProgramOutput() entfernen und die zurückgegebenen Strings nur dann beachten, wenn sie nicht leer sind.
Code: Alles auswählen
;PB v.5.62 x64 (Windows 7)
EnableExplicit
Procedure.i FFMPEG(Video.s,Audio.s,File.s)
Protected Handle.i
Protected Parameter.s
Protected RPE.s ; ReadProgramError
Protected RPS.s ; ReadProgramString
If Video And Audio And File
Parameter + "-i " + #DQUOTE$ + Video + #DQUOTE$
Parameter + " -i " + #DQUOTE$ + Audio + #DQUOTE$
Parameter + " -vcodec h264 "
Parameter + #DQUOTE$ + File + #DQUOTE$
Debug Parameter
Handle = RunProgram("ffmpeg.exe",Parameter,#Null$,#PB_Program_Open|#PB_Program_Read|#PB_Program_Error)
If Handle
Debug Handle
While ProgramRunning(Handle)
RPE = ReadProgramError(Handle)
If RPE
Debug "RPE: " + RPE
EndIf
RPS = ReadProgramString(Handle)
If RPS
Debug "RPS: " + RPS
EndIf
Wend
Debug "EXIT"
Debug ProgramExitCode(Handle)
CloseProgram(Handle)
EndIf
EndIf
EndProcedure
FFMPEG("test.webm","test.weba","test.mp4")
End
Bin auch auf Win7 x64 aber der Code tut leider auch nicht...
Re: [FFMPEG] Wie bekomme ich die Programm Ausgabe?
Verfasst: 09.12.2018 20:37
von #NULL
Was sagen denn die ersten beiden Ifs?
Re: [FFMPEG] Wie bekomme ich die Programm Ausgabe?
Verfasst: 09.12.2018 20:40
von Mijikai
Danke für die Vielen Beiträge
#NULL hat geschrieben:Was sagen denn die ersten beiden Ifs?
Was ist
lf?
___________________________________________________________________
Hab jetzt mal ein Modul dafür geschrieben das zumindest mal grundlegend funktioniert.
Bin für jeden Verbesserungsvorschlag dankbar.
-> Vorallem bei ExitCode() ob das so richtig ist ?
(GetExitProcess oder GetExitThread?)
Code:
Code: Alles auswählen
DeclareModule PROCESS
Declare.i Create(File.s,Parameter.s)
Declare.i Running(*Process)
Declare.i DataAvailable(*Process)
Declare.s DataRead(*Process)
Declare.s File(*Process)
Declare.s Parameter(*Process)
Declare.i ExitCode(*Process)
Declare.i Close(*Process)
EndDeclareModule
Module PROCESS
EnableExplicit
;Module PROCESS
;By Mijikai
;Version: draft
;PB v.5.62 x64 (Win7)
Structure PROCESS_STRUCT
Exe.s
Parameter.s
PipeRead.i
PipeWrite.i
Security.SECURITY_ATTRIBUTES
Startup.STARTUPINFO
Info.PROCESS_INFORMATION
BytesAvailable.i
EndStructure
Procedure.i Create(File.s,Parameter.s)
Protected *Process.PROCESS_STRUCT
*Process = AllocateStructure(PROCESS_STRUCT)
If *Process
With *Process
\Security\bInheritHandle = #True
If CreatePipe_(@\PipeRead,@\PipeWrite,@\Security,#Null)
\Startup\cb = SizeOf(STARTUPINFO)
\Startup\dwFlags = #STARTF_USESTDHANDLES
\Startup\hStdInput = \PipeRead
\Startup\hStdOutput = \PipeWrite
\Startup\hStdError = \PipeWrite
If CreateProcess_(File,Parameter,@\Security,@\Security,#True,#Null,#Null,#Null,@\Startup,@\Info)
ProcedureReturn *Process
EndIf
CloseHandle_(\PipeRead)
CloseHandle_(\PipeWrite)
EndIf
EndWith
FreeStructure(*Process)
EndIf
EndProcedure
Procedure.i Running(*Process.PROCESS_STRUCT)
With *Process
ProcedureReturn Bool(WaitForSingleObject_(\Info\hProcess,10) <> #WAIT_TIMEOUT)
EndWith
EndProcedure
Procedure.i DataAvailable(*Process.PROCESS_STRUCT)
With *Process
PeekNamedPipe_(\PipeRead,#Null,#Null,#Null,@\BytesAvailable,#Null)
ProcedureReturn \BytesAvailable
EndWith
EndProcedure
Procedure.s DataRead(*Process.PROCESS_STRUCT)
Protected *Buffer
Protected BufferSize.i
Protected Result.s
With *Process
If \BytesAvailable > #Null
*Buffer = AllocateMemory(\BytesAvailable)
If *Buffer
If ReadFile_(\PipeRead,*Buffer,\BytesAvailable,@BufferSize,#Null)
If BufferSize
Result = PeekS(*Buffer,BufferSize,#PB_Ascii)
EndIf
EndIf
FreeMemory(*Buffer)
EndIf
EndIf
EndWith
ProcedureReturn Result
EndProcedure
Procedure.s File(*Process.PROCESS_STRUCT)
With *Process
ProcedureReturn \Exe
EndWith
EndProcedure
Procedure.s Parameter(*Process.PROCESS_STRUCT)
With *Process
ProcedureReturn \Parameter
EndWith
EndProcedure
Procedure.i ExitCode(*Process.PROCESS_STRUCT)
Protected Code.i
With *Process
GetExitCodeThread_(\Info\hThread,@Code)
ProcedureReturn Code
EndWith
EndProcedure
Procedure.i Close(*Process.PROCESS_STRUCT)
With *Process
CloseHandle_(\Info\hProcess)
CloseHandle_(\Info\hThread)
CloseHandle_(\PipeRead)
CloseHandle_(\PipeWrite)
EndWith
FreeStructure(*Process)
EndProcedure
EndModule
EnableExplicit
Global Handle.i
Procedure.s FFMPEG(Video.s,Audio.s,File.s)
Video = " -i " + #DQUOTE$ + Video + #DQUOTE$
Video + " -i " + #DQUOTE$ + Audio + #DQUOTE$
Video + " -vcodec h264 " + #DQUOTE$ + File + #DQUOTE$
ProcedureReturn Video
EndProcedure
DeleteFile("test.mp4")
Handle = PROCESS::Create("ffmpeg.exe",FFMPEG("test.webm","test.weba","test.mp4"))
If Handle
Repeat
If PROCESS::DataAvailable(Handle)
Debug PROCESS::DataRead(Handle)
EndIf
Until PROCESS::Running(Handle)
Debug PROCESS::ExitCode(Handle);<- immer Null !?
PROCESS::Close(Handle)
EndIf
Repeat:Delay(100):ForEver
End
Re: [FFMPEG] Wie bekomme ich die Programm Ausgabe?
Verfasst: 09.12.2018 23:59
von #NULL
Mijikai hat geschrieben:#NULL hat geschrieben:Was sagen denn die ersten beiden Ifs?
Was ist
lf?
Na die Ifs die nur ein EndIf haben aber kein Else mit Rückmeldung. Ich frage das nur weil ich zuerst rein gar keine Ausgabe hatte da es ffmpeg.exe bei mir unter Linux ja als solche nicht gibt

und wollte wissen ob er überhaupt im jeweiligen If-Zweig ankommt.