2012-11-30 2 views
1

저는 파이썬의 Twisted.web과 ffmpeg에 대한 콜백을 사용하여 비디오 스 트리머를 만들고 있습니다.파이썬의 Twisted.web에서 트랜스 코딩 된 비디오 파일을 어떻게 보내나요?

'file.read()'를 사용하여 파일을 보내고 있기 때문에 트랜스 폰드 된 출력을 전송할 때 문제가있을 수 있습니다. 전체적으로 읽을 수 없으므로 궁금합니다. 내가 이것을 생각하고 Twisted.web의 낮은 수준의 관리 코드로 모두 관리하고 있습니까, 아니면 내 방법을 다시 생각해야합니까?

또한 내가 버퍼링하지 않은 부분으로 건너 뛰는 사람들을 어떻게 지원할 수 있습니까? 나는 그것이 그것이 정말로 복잡 할 것이기를 기대한다. 그러나 그것을 넣지 않는다.

감사

+0

'return file.read()'라고 할 때, 파일 객체 또는 Popen 객체 또는 다른 것을 파일합니까? 'Popen' 객체 인 경우 트위터의'reactor.spawnProcess()'를 사용하여 스트리밍 읽기를 수행하기 위해 http 핸들러에 연결할 수있는 프로토콜을 고려해야합니다. – fmoo

+0

파일은 파일 객체이므로 Popen과 spawnProcess를 살펴볼 것입니다. 덕분에 – monkeymad2

답변

2

1) 나는 트위스트에 file.read()를 사용할 수 있습니까?

짧은 대답은 "아니오"입니다.

fd에 O_NONBLOCK을 설정하거나이 요청을 별도의 스레드에 명시 적으로 위임 한 것과 같이 비교적 복잡한 작업을 수행하지 않은 한 file.read()은 파일 전체를 메모리로 읽는 차단 호출입니다 돌아 오기 전에.

이 데이터를 디스크에서 동 기적으로 읽는 동안 Twisted의 리액터는 모든 콜백을 호출하거나 모든 FD에서 사용 가능한 데이터를 읽거나 쓸 수 없으므로 보류중인 다른 요청이나 스트리밍 전송이 완료 될 때까지 중단됩니다. 파일을 메모리로 읽는 중입니다.

또한 파일의 원본 볼륨에 부하가 많거나 많은 파일이있는 경우 파일 개체 가져 오기 open() 호출도 상당한 시간 동안 차단 될 수 있습니다. nonblocking이 열려 있지 않으므로 파일 객체가 필요하면 일반 파일 객체를 뒤틀린 상태로 가져와야 할 경우 reactor.deferToThread()을 사용해야합니다. 그래서 여기

당신이해야 할 작업은 다음과 같습니다

트위스트와 파일 시스템에서 파일을 직접 읽어 들어, twisted.web.server.Site 및 twisted.web.static.File으로 보일 것입니다. 그 (것)들에 재미있는 자습서가 here있다. 이러한 호출은 디스크에서 파일 내용을 스트리밍 할뿐만 아니라 HTTP 범위 요청과 같은 정적 파일에 대한 추가 HTTP 기능도 지원합니다.

2) 내가 버퍼링하지 않은 부분으로 건너 뛰는 사람들을 어떻게 지원할 수 있습니까?

이것은 일반적으로 스크러빙이라고하며 기본적으로 두 가지 종류의 스크러빙 : HTML5 스크러빙과 시간 기반 스크러빙이 있습니다.

전 (HTML5 스크러빙)은 "HTTP 범위 요청"을 말하는 멋진 방법이며 Safari Mobile, Quicktime, mplayer 및 html5 태그를 구현하는 모든 브라우저와 같은 기본 브라우저 및 플러그인에서 지원됩니다. 이것은 twisted.web.static.File에 의해 뒷받침됩니다. 첫 번째 질문에 대한 저의 대답에서 언급했습니다.

후자 (시간 기반 스크러빙)는 스크러빙을 지원하는 레거시 방식입니다. 그것은 기본적으로 플레이어 (예 : jwplayer 또는 OSMF)와 특정 쿼리 매개 변수에 지정된 시간 오프셋에서 시작하는 비디오를 플레이어가 요청할 수있게 해주는 서버 간의 계약입니다.

가 필요한 쿼리 매개 변수에서 뽑아 -itsoffset 매개 변수를 사용하여 하위 프로세스에는 FFmpeg를 시작 디스크에서 일부 입력 파일을 사용하거나 a module in your favorite webserver를 사용하여 hackily 수행 할 수 있습니다. 어느 쪽이든 어떤 쿼리 매개 변수를 보낼지 이해하는 플레이어가 필요합니다.

+0

훌륭해, 고마워. 1 클라이언트에서 1 클라이언트의 문제로 인해 어떤 차단에도 빠져들지는 않았지만, 어쨌든 그것을하는 끔찍한 방법이라고 확신했습니다. – monkeymad2

관련 문제