2011-07-31 4 views
2

GStreamer를 사용하여 약간의 HTTP 비디오 스트리밍 서버를 작성했습니다. 기본적으로 클라이언트는 GET 요청을 수행하고 연속적인 HTTP 스트림을받습니다.fdsink에 대한 빠른 시작 : 처음 5MB 비동기, 바이트 동기화 후

스트림은 동기식으로, 즉 비트 전송률과 동일한 속도로 전송되어야합니다. 문제는 일부 플레이어 (mplayer가 저명한 예임)가 가변 비트 전송률 콘텐츠를 잘 버퍼링하지 않아 매 초마다 부족하다는 것입니다.

버퍼 언더런을 우회하려면 파이프 라인의 클럭을 무시하고 즉시 5MB를 전송하십시오. 나머지 스트림은 적절한 속도로 전송되어야합니다.

나는 트릭을 할해야에 다음의 첫 번째 5메가바이트에 대한 fdsink sync=TRUEsync=FALSE을 설정 생각하지만, fdsink 끈기 기다립니다 파이프 라인의 시계가 이미 따라 잡을 데이터를 전송하는 즉, 작동하지 않습니다. 매우 낮은 비트 전송률의 테스트에서 꽤 오랜 시간 동안 전송 된 데이터가 없습니다.

내 fdsink 리더 스레드는 현재 다음과 같습니다

static void *readerThreadFun(void*) { 
    int fastStart = TRUE; 
    g_object_set(G_OBJECT(fdsink0), "sync", FALSE, NULL); 
    for(uint64_t position = 0;;) { 
     // (On the other side there is node.js, 
     // that's why I don't do the HTTP chunking here) 
     ssize_t readCount = splice(gstreamerFd, NULL, remoteFd, 
       NULL, 1<<20, SPLICE_F_MOVE|SPLICE_F_MORE); 
     if(readCount == 0) { 
      break; 
     } else if(readCount < 0) { 
      goto error; 
     } 
     position += readCount; 
     if(fastStart && position >= 5*1024*1024) { 
      fastStart = FALSE; 
      g_object_set(G_OBJECT(fdsink0), "sync", TRUE, NULL); 
     } 
    } 
    ... 
} 

가 어떻게 벽 시계 잡기 위해이 기간 "잊지"있는 GStreamer을 할 수? "재설정"기능이 있습니까? 오해 나는 sync일까요? GStreamer에서 "빠른 시작"을 실현하는 또 다른 방법이 있습니까? 내가 찾던 아주 해결책이 아니다

+0

첫 번째 XMB를 보내는 솔루션을 아는 사람은 아무도 없습니다. – kay

답변