c언어 popen 예제

이 예제에서는 두 개의 파이프를 사용 하 여 각 FFmpeg의 자체 인스턴스에 연결 된. 기본적으로 입력 파이프에서 한 번에 하나씩 프레임을 읽고 모든 픽셀의 색상을 반전한 다음 수정된 프레임을 출력 파이프에 씁니다. 내가 사용하고있는 입력 비디오는 내 휴대 전화에 기록 된 teapot.mp4입니다. 수정된 비디오는 두 번째 파일인 output.mp4에 저장됩니다. 비디오 해상도는 1280 × 720이며 FFmpeg와 함께 제공되는 ffprobe 유틸리티를 사용하여 미리 확인했습니다. 여기에 또 다른 접근 방식이 있습니다. 4:2:0과 마찬가지로 x 및 y 차원에서 대체 크로마 샘플을 건너뜁니다. 어느 것이 작동하는지 확실하지 않습니다. 이것은 당신과 V 픽셀이 인접하지 않은 것으로 가정합니다.

궁극적으로 비디오는 VLC에서 재생되어야 합니다. ================================================================================================================================================================================================================ // 테드 버크에 의해 작성된 FFmpeg를 사용하여 // 비디오 처리 예 – 마지막 업데이트 12-2-2017 // 지금 YUV 공간에서 작동 // 프레임 속도 = 29.97 // 컴파일 : gcc clipper.c -o 클리퍼 출구 코드 예를 들어 DOS에서 상속된 오류 수준 용어에서 명령줄 인터프리터 CMD.exe에서 직접 참조됩니다. .NET Framework 프로세스및 Windows PowerShell은 프로세스 개체의 ExitCode 속성이라고 합니다. 부모와 자식은 종료 상태의 의미에 대해 이해할 수 있습니다. 예를 들어 자식 프로세스가 성공을 의미하는 상위 프로세스에 0(종료)하는 것이 일반적인 프로그래밍 방법입니다. 자식의 이 반환 값 외에도 프로세스가 정상적으로 또는 신호에 의해 종료된 방법과 같은 다른 정보도 부모 프로세스에서 사용할 수 있습니다. 출력 popen() 스트림은 기본적으로 완전히 버퍼링됩니다. 읽기를 위해 열린 명령의 표준 입력은 popen()이라고 하는 프로세스와 검색 오프셋을 공유하므로 원래 프로세스가 버퍼링된 읽기를 수행한 경우 명령의 입력 위치가 예상과 다를 수 있습니다. 마찬가지로 쓰기를 위해 열린 명령의 출력은 원래 프로세스의 출력과 혼합될 수 있습니다. 후자는 popen()전에 fflush(3)를 호출하여 피할 수 있습니다.

popen() 함수는 파이프를 만들고, 포쳐를 만들고, 쉘을 호출하여 프로세스를 엽니다. 파이프는 정의단방향이므로 형식 인수는 읽기 또는 쓰기만 지정할 수 있으며 둘 다 지정하지는 않습니다. 결과 스트림은 그에 상응하는 읽기 전용 또는 쓰기 전용입니다. 예, 나타나는 의견에 약간의 지연이있을 수 있습니다, 그래서 당신은 아마 내가 마지막 예를 게시하기 전에이 게시,하지만 난 지금까지 메시지를 볼 수 없습니다. 어쨌든, 내가 위에서 게시 한 예는 내 컴퓨터 (리눅스)에서 완벽하게 작동하고 출력 파일은 VLC에서 아무 문제없이 재생됩니다. popen()에 대한 모드 인수는 I/O 모드를 지정하는 문자열입니다: PIPE_BUF(4096 바이트)까지의 데이터 쓰기는 원자성입니다. 더 많은 양의 데이터를 읽거나 쓰는 것은 원자성일 수 있습니다. 예를 들어 설명자가 공유하는 다른 프로세스의 출력 데이터가 산재될 수 있습니다. 또한 PIPE_BUF 문자가 작성되면 일부 문자가 읽혀질 때까지 추가 쓰기가 차단됩니다popen()의 동작은 r 및 w 모드의 값에 대해 지정됩니다. rb 및 wb와 같은 다른 모드는 특정 구현에서 지원될 수 있지만 이식 가능한 기능은 아닙니다. popen()의 기록 구현은 모드의 첫 번째 문자가 r인지 확인합니다. 따라서 로봇의 로버트 모드는 모드 r로 처리되고 다른 모드는 모드 w로 처리됩니다.

응용 프로그램이 0보다 큰 pid 인수를 사용하여 waitpid() 또는 waitid()를 호출하고 popen() open으로 호출된 스트림이 여전히 있는 경우 pid가 popen()에 의해 시작된 프로세스를 참조하지 않도록 해야 합니다.