c ++ - Omdirigere ffmpeg-rør til børneproces

Indlæg af Hanne Mølgaard Plasc

Problem



Hvordan kan jeg omdirigere et ffmpeg-rør fra en proces til børneprocessen stdin?


Jeg vil opnå det samme som rør i cmd:


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


Jeg forsøgte:


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.


Men jeg ved ærligt ikke, hvad jeg gør.


Er der nogen GetStdHandle, der normalt ikke udskriver til konsollen?

Bedste reference


Du kan prøve at oprette et rør:



  1. Ring CreatePipe () for at oprette et læsehåndtag og et skrivehåndtag [4]

  2. Ring SetStdHandle () for at gøre skrivehåndtaget til røret din nye stdout [5]

  3. Angiv læserhåndtaget på røret som hStdInput to CreateProcess ()



Opdatering:


Hvis din ansøgning bruger printf () til at udskrive til STD-udgangskonsollen, skal du sandsynligvis hakke ind i stdout strukt og udskifte håndtaget der. Prøv under alle omstændigheder at gå ind i et printf () opkald, der ikke omdirigeres korrekt, og se hvilket håndtag det bruger i sidste ende.