FFmpeg进度跟踪visual C ++

时间:2011-07-12 02:58:38

标签: windows visual-c++ ffmpeg

在我的主要过程中,我使用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进程的输出/输入?

谢谢你的时间!

逻辑资源

2 个答案:

答案 0 :(得分:1)

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

  

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

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

答案 1 :(得分:1)

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

PROCESS_INFORMATION pi;

和代码:

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

exitCode 将保留值STILL_ACTIVE。

如果函数成功,则成功的返回值将为非零。