2012-04-01 1 views
1

Comment puis-je rediriger un tube ffmpeg d'un processus vers le processus enfant stdin?Rediriger le tube ffmpeg vers le processus enfant

Je veux obtenir la même chose que la tuyauterie dans cmd:

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

J'ai essayé:

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. 

Mais je ne sais pas honnêtement ce que je fais.

Y a-t-il des GetStdHandle qui n'impriment normalement pas sur la console?

+0

Ce que vous avez là pourrait fonctionner si vous trafiquez un enfant après avoir capturé le handle de sortie du parent en utilisant GetStdHandle. Mais comment fonctionne la res de votre code? –

+0

John Zwinck: Ajouté plus de code, quelque chose de spécifique que vous devez savoir? – ronag

+0

Maintenant vous avez caché le type de votre variable 'si' (qui a été montré avant votre édition!). Je ne sais pas si je serai en mesure de résoudre votre problème en soi, mais je pense que vous pouvez améliorer votre question et cela aidera les autres à vous aider. –

Répondre

1

Vous pouvez essayer de créer un tuyau:

  1. Appel CreatePipe() pour créer une poignée de lecture et une poignée d'écriture

  2. Appel SetStdHandle() pour faire la poignée d'écriture du tube de votre nouveau stdout

  3. Spécifiez le handle de lecture du tube en tant que hStdInput to CreateProcess()

Mise à jour:

si votre application utilise printf() pour imprimer sur la console de sortie de STD, vous aurez probablement besoin de pirater le struct stdout et remplacer la poignée là-bas. Dans tous les cas, essayez d'entrer dans un appel printf() qui n'est pas redirigé correctement et de voir quel handle il utilise à la fin.

+0

Essayé, n'a pas fonctionné. Voir la question mise à jour. – ronag

+0

La chose la plus étrange est qu'elle continue d'imprimer beaucoup de bruit sur la console principale, même si j'ai redirigé STD_OUTPUT_HANDLE. – ronag

+0

Le processus enfant ne semble pas se plaindre qu'il ne peut plus ouvrir le tuyau au moins. Je pense que le problème est que mon application n'écrit pas sur le canal, mais pour une raison quelconque, elle écrit sur la console, même si elle a été redirigée. – ronag

Questions connexes