2011-02-10 2 views
1

ffmpeg에서 입력 한 바이트가 있습니다. 이 출력물을 다른 여러 ffmpeg 프로세스로 보내고 싶습니다. Unix Pipe, Socket, ..을 사용할 수 없기 때문에 파이썬을 파이프의 수신단으로 사용하고 있습니다. 서브 루틴은 이전에 등록 된 모든 콘센트에 수신 된 데이터를 복사합니다.여러 콘센트가있는 파이프를 에뮬레이트하십시오. 파이썬은 충분히 빠르지?

잘못된 느낌입니다.

특히 이것은 많은 메모리 복사를 의미한다는 느낌이 들었습니다. 바로 지금 작동합니다. 그러나 나는 이것을하기의 "옳은 길"에 대해 머리를 쓰는 것을 진지하게 좋아한다.

def writeData(self,data): 
    """Write 'data' to all outputs""" 
    if len(self.outlets) > 0: 
     for outlet in self.outlets: 
      outlet.writeData(data) 
    else: 
     self.logger.warn("Received data but no outlets registred (yet?)") 

답변

1

특히 지금 압축 비디오 데이터의 상대적으로 낮은 대역폭에 비해 CPU의 속도, 충분히 빨리 될 가능성이 높습니다.

항상 그렇듯이 솔루션을 테스트하고 벤치마킹하여 성능 요구 사항을 충족하는지 확인해야합니다.

2

EDIT : 덕분에 Phil은 이전 버전에서 오류를 수정 (의견보기).

bash 사용하여, 당신은 세 가지 다른 사람들이 의지 파이프를

ffmpeg ... | tee >(ffmpeg ...) >(ffmpeg ...) >(ffmepg ...) > /dev/null 

ffmpeg의 출력을 할 수 있습니다. 당신이 bash를 사용하지 않는 경우

수동으로 명명 된 파이프에 ffmpeg 프로세스에 연결하고 파이프에 tee를 사용하여 명명 된 파이프를 만들 수 있습니다

mkfifo pipe1 pipe2 
ffmpeg ... < pipe1 
ffmpeg ... < pipe2 
ffmpeg ... | tee pipe1 pipe2 | ffmpeg ... 
rm pipe1 pipe2 

bash 코드는 기본적으로 동일 않습니다. 명명 된 파이프의 생성 및 제거는 투명하게 발생합니다.

+0

티는 기본적으로 위의 파이썬 물건과 같은 일을하고, 오른쪽 : 그것은 당신이 설명하는지 만합니까? 파이썬 방법이 상당히 느린 지 궁금 해서요. 내가 융통성있게 파이썬을 선호하기 때문에 나는 묻는다. – Thorsten

+0

@ 토르 스텐 : 저는 Greg를 따릅니다. 아마도 이것이 병목 현상이되지는 않을 것이지만, 정말로 확신하기 위해서 스스로 시도해야 할 것입니다. I/O는 대개 더 큰 덩어리로 이루어지기 때문에 파이썬이 많은 오버 헤드를 구성하지는 않을 것이라고 생각합니다. –

+1

조심해서, 이것은 첫 번째, 두 번째 및 세 번째 ffmpeg의 출력을 네 번째 파이프로 파이프합니다. 더 나은 패턴은 "a | tee> (b)> (c)> (d)>/dev/null" – Phil

1

moreutils 패키지에서 "오줌가락"유틸리티를 보았습니까?

ffmpeg | pee 'ffmpeg -stuff1' 'ffmpeg -stuff2' 'ffmpeg -stuff3'