如何在VC中获取ffmpeg的输出信息
From Ffmpeg工程组
基本思想是通过管道的重定向功能,将ffmpeg的输出信息重定向到一个管道,然后在VC程序中读取该管道的信息即可,下面是源代码
#include <signal.h>
void function()
{
HANDLE hSTDINWrite, hSTDINRead; // 用于重定向子进程输入的句柄
HANDLE hSTDOUTWrite, hSTDOUTRead; // 用于重定向子进程输出的句柄
HANDLE hSTDERRWrite, hSTDERRRead; // 用于重定向子进程输出的句柄
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(sa);
// 创建子进程输出匿名管道
if( !CreatePipe(&hSTDOUTRead, &hSTDOUTWrite, &sa, 0) )
{
//AfxMessageBox("Create STDOUT pipe failed");
return;
}
// 创建子进程输入匿名管道
if( !CreatePipe(&hSTDINRead, &hSTDINWrite, &sa, 0) )
{
// AfxMessageBox("Create STDIN pipe failed");
return;
}
// 创建子进程出错匿名管道
/* if( !CreatePipe(&hSTDERRRead, &hSTDERRWrite, &sa, 0) )
{
AfxMessageBox("Create STDIN pipe failed");
return;
} */
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
STARTUPINFO si;
GetStartupInfo(&si);
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;//SW_HIDE;
si.hStdInput = hSTDINRead; //重定向子进程输入
si.hStdOutput = hSTDOUTWrite; //重定向子进程输入
si.hStdError = hSTDOUTWrite; //GetStdHandle( STD_ERROR_HANDLE );
char cmd[256] = {0, };
//::strcpy(cmd, "d:\\mencoder -oac copy -ovc copy -o d:\\aaa3.mpg d:\\2.mpg");
::strcpy(cmd, "e:\\ffmpeg\\trunk\\ffmpeg -i d:\\1.mpg d:\\1.avi");
//if( !::CreateProcess(NULL, cmd, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW, NULL, NULL, &si, &pi) )
if( !::CreateProcess(NULL, cmd, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi) )
{
int errorNo = ::GetLastError();
// AfxMessageBox("create process failed");
return;
}
::CloseHandle(hSTDOUTWrite);
::CloseHandle(hSTDINRead);
char strData[1024] = {0, };
DWORD dwBytes;
while(::ReadFile(hSTDOUTRead, strData, sizeof(strData), &dwBytes, NULL))
{
ProcessMessage();
strData[dwBytes] = '\0';
//SetMessage(strData);
if(m_bCancel)
{
//::WriteFile(hSTDOUTWrite, "q", 2, &dwBytes, NULL);
break;
}
}
DWORD uExitCode ;
::TerminateProcess(pi.hProcess,uExitCode);
//raise(3);
//abort();
// ::WaitForSingleObject(pi.hProcess, INFINITE);
::CloseHandle(hSTDOUTRead);
::CloseHandle(hSTDINWrite);
::CloseHandle(pi.hProcess);
::CloseHandle(pi.hThread);
}
