Быстрый запуск для fdsink: первые 5 МБ асинхронно, синхронно следующие байты - PullRequest
2 голосов
/ 31 июля 2011

Я написал небольшой сервер потокового видео 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?

1 Ответ

0 голосов
/ 08 августа 2011

Это не совсем то решение, которое я искал:

gst_base_sink_set_ts_offset(GST_BASE_SINK(fdsink0), -10ll*1000*1000*1000);

Раковина будет передавать первые 10секунд немедленно.

...