c - 快速启动 fdsink : first 5 MB async, 以下字节同步

标签 c gstreamer http-live-streaming

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

流应该同步发送,即以与比特率相同的速度发送。问题是一些播放器(mplayer 是一个突出的例子)不能很好地缓冲可变比特率内容,因此每隔一秒就会丢失。

我想通过立即传输第一个数据(例如 5 MB)来避免缓冲区溢出,而忽略管道的时钟。流的其余部分应以适当的速度传输。

我想为前 5 MB 设置 fdsink sync=TRUE,从那时起设置 sync=FALSE 应该可以解决问题,但这不起作用,因为fdsink 耐心等待管道时钟 catch 已发送的数据。在我以非常低的比特率进行的测试中,有好几秒钟没有数据传输。

我的 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“忘记”挂钟必须 catch 的持续时间?有一些“重置”功能吗?我误解了 sync 吗? GStreamer有没有其他实现“快速启动”的方法?

最佳答案

这不是我正在寻找的解决方案:

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

接收器将立即流式传输前 10 秒。

关于c - 快速启动 fdsink : first 5 MB async, 以下字节同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6890824/

相关文章:

video-streaming - WOWZA + RTMP 可在多台设备上播放?

c - 这是针对严格别名规则中断的有效代码修复吗?

c - 在 C 中访问大文件

c - 调用数组的特定索引时,打印所有值

c++ - Gstreamer 调试插件多个文件的输出

c++ - 我如何获得 DirectFB 创建的 X Window 的 ID?

校验和与串口通信

gstreamer - 将 Gstreamer SDK 教程 (gstreamer 0.1) 移植到 gstreamer 1.0

c# - 使用 ffmpeg.autogen 将 HLS 视频源重新流式传输到 RTMP

ios - 将外部音轨添加到 HLS 视频