首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FFmpeg进度跟踪visual C++

FFmpeg进度跟踪visual C++
EN

Stack Overflow用户
提问于 2011-07-12 10:58:38
回答 2查看 1.3K关注 0票数 0

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

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

代码语言:javascript
复制
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);

但是我不能交互地更新“结果”。我的应用程序在转换过程中被挂起,"result“字符串只有在ffmpeg的进程完成后才会更新。

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

耽误您时间,实在对不起!

LRs

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-12 11:56:05

如果ffmpeg只使用stdout而没有显式刷新输出,则在结束之前可能不会将其发送到调用进程。

使用诸如printf()和

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

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

票数 1
EN

Stack Overflow用户

发布于 2019-08-16 02:06:42

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

代码语言:javascript
复制
PROCESS_INFORMATION pi;

和代码:

代码语言:javascript
复制
DWORD exitCode = 0;
success = [GetExitCodeProcess][2](pi.hProcess, &exitCode);

如果进程仍在运行,则exitCode将保存值STILL_ACTIVE。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6659037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档