如何在VC中获取ffmpeg的输出信息

From Ffmpeg工程组

Jump to: navigation, search

基本思想是通过管道的重定向功能,将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);  
}