fdsink的快速启动:前5 MB异步,跟随字节同步

时间:2011-07-31 16:45:46

标签: c gstreamer http-live-streaming

我使用GStreamer编写了一个小的HTTP视频流服务器。本质上,客户端执行GET请求并接收连续的HTTP流。

应该同步发送流,即以与比特率相同的速度发送。问题是有些玩家(mplayer是一个突出的例子)不能很好地缓冲可变比特率内容,因此缺少其他所有内容。

我想通过立即传输第一个,比如5 MB,忽略管道的时钟来绕过缓冲区欠载。流的其余部分应以适当的速度传输。

我想为前5 MB设置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中实现“快速启动”吗?

1 个答案:

答案 0 :(得分:0)

这不是我想要的解决方案:

  

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

接收器将立即流出前10秒。