2012-04-01 2 views
1

프로세스에서 ffmpeg 파이프를 자식 프로세스 stdin으로 리디렉션하려면 어떻게해야합니까?ffmpeg 파이프를 자식 프로세스로 리디렉션

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. 

을하지만 솔직히 내가 뭘하는지 모르는

나는 cmd를 배관과 같은 일을 달성하고 싶다.

일반적으로 콘솔에 인쇄하지 않는 GetStdHandle이 있습니까?

+0

GetStdHandle을 사용하여 부모의 출력 핸들을 캡쳐 한 후 자식을 분기하는 경우, 거기에있는 것이 작동 할 수 있습니다. 하지만 코드의 입술은 어떻게 작동합니까? –

+0

John Zwinck : 더 많은 코드가 추가되었으므로 알아 두어야 할 사항이 있습니까? – ronag

+0

이제 'si'변수의 유형을 숨 겼습니다 (편집 전에 표시됨). 나는 당신의 문제를 본질적으로 해결할 수 있을지 모르지만, 당신이 당신의 질문을 더 잘 할 수 있고, 다른 사람들이 당신을 도울 수 있다고 생각합니다. –

답변

1

당신은 파이프 만드는 시도 할 수 있습니다 : 파이프 새로운 표준 출력의 쓰기 핸들을 만들기 위해 읽기 핸들과 쓰기 핸들

  • 전화 SetStdHandle()을 만들

    1. 전화 CreatePipe()

    2. CreateProcess()에 대한 hStdInput으로 파이프의 읽기 핸들을 지정하십시오.

    ,

    업데이트 : 응용 프로그램의 printf를 사용

    경우()에 STD 출력 콘솔에 인쇄, 당신은 아마도 표준 출력 구조체에 해킹이 핸들을 교체해야합니다. 어떤 경우에는 올바르게 리디렉션되지 않은 printf() 호출로 이동하여 끝에 사용되는 핸들을 확인하십시오.

  • +0

    시도해 보았습니다. 작동하지 않았습니다. 업데이트 된 질문보기 – ronag

    +0

    이상한 점은 STD_OUTPUT_HANDLE을 리디렉션 했음에도 불구하고 메인 콘솔에 많은 노이즈가 계속 출력된다는 것입니다. – ronag

    +0

    자식 프로세스가 더 이상 파이프를 열 수 없다는 불평을하지 않습니다. 문제는 내 앱이 파이프에 쓰는 것이 아니라 콘솔로 쓰는 웬일인지 리디렉션되었다고 생각하는 것입니다. – ronag

    관련 문제