GStreamer를 사용하여 약간의 HTTP 비디오 스트리밍 서버를 작성했습니다. 기본적으로 클라이언트는 GET 요청을 수행하고 연속적인 HTTP 스트림을받습니다.fdsink에 대한 빠른 시작 : 처음 5MB 비동기, 바이트 동기화 후
스트림은 동기식으로, 즉 비트 전송률과 동일한 속도로 전송되어야합니다. 문제는 일부 플레이어 (mplayer가 저명한 예임)가 가변 비트 전송률 콘텐츠를 잘 버퍼링하지 않아 매 초마다 부족하다는 것입니다.
버퍼 언더런을 우회하려면 파이프 라인의 클럭을 무시하고 즉시 5MB를 전송하십시오. 나머지 스트림은 적절한 속도로 전송되어야합니다.
나는 트릭을 할해야에 다음의 첫 번째 5메가바이트에 대한fdsink sync=TRUE
및
sync=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에서 "빠른 시작"을 실현하는 또 다른 방법이 있습니까? 내가 찾던 아주 해결책이 아니다
첫 번째 XMB를 보내는 솔루션을 아는 사람은 아무도 없습니다. – kay