delphi - 使用 shellExecute 从 delphi 执行 ffmpeg.exe

标签 delphi ffmpeg shellexecute

当我从命令行 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/

相关文章:

Delphi - 使用 DeviceIoControl 传递 IOCTL_DISK_GET_LENGTH_INFO 来获取闪存介质物理大小(不是分区)

c# - ProcessStartInfo.UseShellExecute = true 并等待进程退出

delphi - 如何通过Delphi 2009打开PDF文件(窗口默认程序Adobe Reader)?

multithreading - 许多执行后,Delphi线程挂起

ffmpeg - 由于每秒的drawtext命令,ffmpeg命令非常长

php - php 应用程序中的 FFMPEG 缩略图未正确旋转

node.js - fulent-ffmpeg 参数输入无效 | Node

php - shell_exec() 超时管理 & exec()

delphi - 使用 shellexecute 命令执行 .reg 文件时如何避免确认消息

lazarus - Lazarus IDE:在项目中导入图像