FFmpeg прогресс трек визуальный C ++ - PullRequest
0 голосов
/ 12 июля 2011

В моем основном процессе я создаю дочерний процесс ffmpeg, используя CreateProcess (...). Мне нужно отслеживать статус преобразования прогресса, чтобы обновить индикатор выполнения. Для этого я читаю текст из вывода 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?

Спасибо за ваше время!

LRS

1 Ответ

1 голос
/ 12 июля 2011

Если ffmpeg просто использует stdout без явной очистки вывода, то он может не быть отправлен вызывающему процессу до тех пор, пока он не завершится

Дочерние процессы, которые используют такие функции времени выполнения C, как printf ()и fprintf () может плохо работать при перенаправлении.Функции времени выполнения C поддерживают отдельные буферы ввода-вывода.При перенаправлении эти буферы могут не сбрасываться сразу после каждого вызова ввода-вывода.В результате вывод в канал перенаправления вызова printf () или ввод вызова getch () не сбрасывается немедленно и задерживается, иногда возникают бесконечные задержки.Этой проблемы можно избежать, если дочерний процесс сбрасывает буферы ввода-вывода после каждого вызова функции ввода-вывода C во время выполнения.Только дочерний процесс может очищать свои буферы ввода-вывода C во время выполнения.Процесс может очистить свои буферы ввода-вывода C во время выполнения, вызвав функцию fflush ().

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...