当我从命令行 ffmpeg -i img%5d.bmp -r 20 -c:v libx264 -preset slow -crf 22 output.mkv
执行时,我正在尝试从 bmp 图像列表制作视频一切正常,但是当我尝试从 delphi 项目执行时,它不起作用。我试过了:
parameters := '-i img%5d.bmp -r 20 -c:v libx264 -preset slow -crf 22 output.mkv';
ShellExecute(0, nil, PChar('c:\videos\ffmpeg.exe'), PChar(parameters), nil, SW_NORMAL);
我无法使用
TProcess
,必须使用 ShellExecute
请提前帮我解决这个问题 tnx :)
最佳答案
这是我使用的一小段代码。我给你这个代码,但希望你不只是复制和粘贴。请仔细阅读以了解它的作用。
CreateProcess 就是 David 所说的。这是在 Windows 中创建和处理进程的最佳方式。还要注意 WaitForSingleObject。这会导致您的执行在创建进程后返回之前等待 Windows 完成。您当然可以删除等待部分。还要注意创建标志。
它称为 ExecuteAndWait。当您调用它时,它将创建一个进程并等待它完成:
function ExecuteAndWait(AFilename : String; AParameter : string;
ACmdShow : Integer; var AErrorOrExitCode : Cardinal): Boolean;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
S : String;
begin
FillChar(StartupInfo,Sizeof(StartupInfo),0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := ACmdShow;
S := AParameter;
UniqueString(S);
if not CreateProcess(PChar(AFilename),PChar(S),nil,nil,False,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,
StartupInfo,ProcessInfo) then
begin
Result := False;
AErrorOrExitCode := GetLastError;
end
else
begin
Result := True;
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,AErrorOrExitCode);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end;
end;
例子:
var
ErrorOrExitCode : Cardinal;
begin
If not ExecuteAndWait('c:\windows\regedit.exe','"c:\windows\regedit.exe" "c:\test.reg"',SW_SHOWDEFAULT,ErrorOrExitCode) then
Showmessage(Inttostr(ErrorOrExitCode));
这里我告诉 regedit 加载一个导出的 reg 文件。请注意双引号,还要注意我将可执行文件指定为文件名和参数的一部分。
使其适应您的需求。
关于delphi - 使用 shellExecute 从 delphi 执行 ffmpeg.exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28580552/