2011-07-12 40 views
0

在我的主進程中,我使用CreateProcess(...)創建了一個ffmpeg子進程。 我需要跟蹤轉換進度以更新進度條的狀態。爲此,我從ffmpeg輸出中讀取文本並從中提取進度狀態。FFmpeg progress track visual C++

我做一個樣品PROGRAMM這樣的:

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進程的輸出/輸入?

謝謝你的時間!

邏輯資源

回答

1

如果ffmpeg的只是使用標準輸出沒有到結束使用這樣的C運行時功能

子進程顯式地刷新輸出,則可能不發送給調用進程printf()和 fprintf()在重定向時可能表現不佳。 C運行時功能 維護單獨的IO緩衝區。重定向時,每次IO調用後都可能不會立即刷新這些緩衝區 。因此,輸出到 printf()調用的重定向管道或來自getch() 調用的輸入不會立即刷新,並且會發生延遲,有時是無限延遲 。如果子進程在每次調用C運行時IO函數後刷新IO 緩衝區,則可避免此問題。只有子進程 可以刷新其C運行時IO緩衝區。進程可以通過調用fflush()函數來刷新其運行時IO緩衝區。

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