2012-04-01 65 views
1

如何将ffmpeg管道从进程重定向到子进程stdin?将ffmpeg管道重定向到子进程

我想达到同样的事情,管道在CMD:

ffmpeg -i test.mov pipe:1 | vlc - 

我想:

avio_open("pipe:1"); // ffmpeg open pipe to STD_OUTPUT_HANDLE. 

// lots of code 

STARTUPINFO si; 
PROCESS_INFORMATION pi; 

SECURITY_ATTRIBUTES saAttr = {0}; 
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
saAttr.bInheritHandle = TRUE; 
saAttr.lpSecurityDescriptor = NULL; 

CreatePipe(&hReadPipe, &hWritePipe, &saAttr, 0); 

SetStdHandle(STD_OUTPUT_HANDLE, hWritePipe); 

ZeroMemory(&si, sizeof(si)); 
ZeroMemory(&pi, sizeof(pi)); 

si.cb = sizeof(si); 
si.dwFlags = STARTF_USESTDHANDLES; 
si.hStdInput = hReadPipe; 

CreateProcess(NULL, // No module name (use command line) 
    L"C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc -vv --demux ffmpeg -",  // Command line 
    NULL,   // Process handle not inheritable 
    NULL,   // Thread handle not inheritable 
    TRUE,   // Set handle inheritance to FALSE 
    0,    // No creation flags 
    NULL,   // Use parent's environment block 
    NULL,   // Use parent's starting directory 
    &si,   // Pointer to STARTUPINFO structure 
    &pi)   // Pointer to PROCESS_INFORMATION structure 

// start ffmpeg write to file. 

但我真的不知道我在做什么。

是否有任何GetStdHandle通常不会打印到控制台?

+0

如果您在使用GetStdHandle捕获父级的输出句柄之后分支子元素,那么您可能会有什么工作。但是,代码的res如何工作? – 2012-04-01 18:06:10

+0

John Zwinck:添加了更多代码,您需要知道的任何特定内容? – ronag 2012-04-01 18:12:24

+0

现在你已经隐藏了变量'si'的类型(在编辑之前显示)!我不知道我是否能够解决您的问题本身,但我认为您可以更好地提出您的问题,这将有助于其他人帮助您。 – 2012-04-01 18:18:54

回答

1

你可以尝试创建一个管道:

  1. 呼叫CreatePipe()创建一个读句柄和写句柄

  2. 呼叫SetStdHandle()使管道新标准输出的写句柄

  3. 指定读取的管道句柄为hStdInput到CreateProcess()

更新:

如果应用程序使用的printf()打印到STD输出控制台,你可能需要攻入标准输出结构并更换手柄那里。在任何情况下,尝试进入一个printf()调用,该调用没有正确重定向,并最终查看它使用哪个句柄。

+0

试过了,没有工作。查看更新的问题。 – ronag 2012-04-01 18:35:57

+0

奇怪的是,即使我重定向了STD_OUTPUT_HANDLE,它仍然向主控制台输出大量噪音。 – ronag 2012-04-01 18:38:19

+0

子进程似乎没有抱怨说至少不能打开管道。我认为问题在于我的应用程序没有写入管道,但出于某种原因写入控制台,即使它被重定向。 – ronag 2012-04-01 18:39:44