Я написал небольшой сервер потокового видео HTTP, используя GStreamer.По сути, клиент выполняет запрос GET и получает непрерывный поток HTTP.
Поток должен отправляться синхронно, т. Е. С той же скоростью, что и скорость передачи битов.Проблема в том, что некоторые проигрыватели (выдающийся пример - mplayer) плохо буферизуют содержимое с переменным битрейтом, поэтому не хватает каждую секунду.
Я хочу обойти переполнение буфера, передавая первые, скажем, 5 МБ немедленно, игнорируя часы конвейера.Остальная часть потока должна передаваться с соответствующей скоростью.
Я полагал, что установка fdsink sync=TRUE
для первых 5 МБ, и 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);
}
}
...
}
How можно ли заставить GStreamer «забыть» время, которое настенные часы должны догнать?Есть ли какая-нибудь функция «сброса»?Я неправильно понимаю sync
?Есть ли другой способ реализовать «быстрый старт» в GStreamer?