将ffmpeg管道重定向到子进程

时间:2012-04-01 17:52:23

标签: c++ windows

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

我希望在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

1 个答案:

答案 0 :(得分:1)

您可以尝试创建管道:

  1. 调用CreatePipe()创建一个读句柄和一个写句柄

  2. 调用SetStdHandle()使新标准输出管道的写入句柄

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

  4. 更新

    如果您的应用程序使用printf()打印到STD输出控制台,您可能需要入侵stdout结构并替换那里的句柄。在任何情况下,请尝试单步执行未正确重定向的printf()调用,并查看它最终使用的句柄。