【问题标题】:FFmpeg progress track visual C++FFmpeg 进度跟踪 Visual C++
【发布时间】:2011-10-03 07:04:57
【问题描述】:

在我的主进程中,我使用 CreateProcess(...) 创建了一个 ffmpeg 子进程。 我需要跟踪转换进度的状态以更新进度条。为此,我从 ffmpeg 输出中读取文本并从中提取进度状态。

我做了一个这样的示例程序:

HANDLE rPipe, wPipe;
CreatePipe(&rPipe,&wPipe,&secattr,0);

STARTUPINFO sInfo; 
ZeroMemory(&sInfo,sizeof(sInfo));
PROCESS_INFORMATION pInfo; 
ZeroMemory(&pInfo,sizeof(pInfo));
sInfo.cb=sizeof(sInfo);
sInfo.dwFlags=STARTF_USESTDHANDLES;
sInfo.hStdInput=NULL; 
sInfo.hStdOutput=wPipe; 
sInfo.hStdError=wPipe;

// pStr contain ffmpeg command
CreateProcess(0,(LPTSTR)pStr,0,0,TRUE,NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW,0,0,&sInfo,&pInfo);
CloseHandle(wPipe);

BOOL ok;
do
{
    memset(buf,0,bufsize);
    ok=::ReadFile(rPipe,buf,100,&reDword,0);
    result += buf;            
}while(ok);

但我无法以交互方式更新“结果”。我的应用程序在转换过程中被保留,并且“结果”字符串仅在 ffmpeg 的进程完成后更新。

如何让我的主进程和 ffmpeg 同时运行,并以交互方式读取/写入 ffmpeg 进程的输出/输入?

感谢您的宝贵时间!

LR

【问题讨论】:

    标签: windows visual-c++ ffmpeg


    【解决方案1】:

    如果 ffmpeg 只使用标准输出而没有显式刷新输出,那么它可能不会被发送到调用进程,直到它结束

    使用诸如 printf() 和 fprintf() 在重定向时可能表现不佳。 C 运行时函数 维护单独的 IO 缓冲区。重定向时,这些缓冲区可能不会 在每次 IO 调用后立即刷新。结果,输出到 printf() 调用的重定向管道或 getch() 的输入 呼叫不会立即刷新和延迟,有时是无限延迟 发生。如果子进程flush IO就可以避免这个问题 每次调用 C 运行时 IO 函数后的缓冲区。只有孩子 进程可以刷新其 C 运行时 IO 缓冲区。一个进程可以刷新它的 C 通过调用 fflush() 函数来缓冲运行时 IO。

    http://support.microsoft.com/kb/190351

    【讨论】:

      【解决方案2】:

      为了在您的子进程运行时(以及完成后)跟踪它的进度,您需要检查该子进程的状态。 进程启动后,使用以下代码定期检查状态。 pi 是PROCESS_INFORMATION:

      PROCESS_INFORMATION pi;
      

      和代码:

      DWORD exitCode = 0;
      success = [GetExitCodeProcess][2](pi.hProcess, &exitCode);
      
      如果进程仍在运行,

      exitCode 将保留值 STILL_ACTIVE。

      如果函数成功,success的返回值非零。

      【讨论】:

        猜你喜欢
        • 2011-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        • 2012-01-01
        • 2011-10-29
        • 1970-01-01
        相关资源
        最近更新 更多