如何从 gstreamer 中的源请求更多缓冲区?

Posted

技术标签:

【中文标题】如何从 gstreamer 中的源请求更多缓冲区?【英文标题】:How to ask for more buffer from source in gstreamer? 【发布时间】:2017-04-24 06:44:47 【问题描述】:

我正在编写一个基于 gstbasesink 的 gstreamer 接收器,它将通过 NTSC 视频编码器包装一个 fpga 播放视频。我有自己的驱动程序,通过 irq 发送帧数据请求(基本上是 vsync 信号)。使用 gstreamer 插件接收器作为用户应用程序,它通过 ioctl 轮询帧数据请求。

vsync 固定为 30fps,需要的数据是 480x720 大小的隔行数据,YUY2。

我使用的源是 videotestsrc,以 60fps 的速度运行。

我是 gstreamer 的初学者,我想做的是在 vsync 之间获得 2 个缓冲区,并将其交错在 render() 方法中。并向设备发送一整帧。

我不知道如何在一个 vsync 中“询问”2 个缓冲区的源。

【问题讨论】:

【参考方案1】:

我感觉你做的工作比你需要的要多,但也许可以创建一个自定义 appsink 并使用 gst_app_sink_pull_sample

https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-appsink.html

【讨论】:

如果我输出 30fps 隔行扫描,我是否应该需要 60fps 逐行才能正确显示 1 帧?一个隔行帧不是由 240 行偶数场和 240 行奇数场在不同时间采样的吗? 我打算为此实现拉模式接收器,使用 queue2 元素,我在某处读到它可以提供拉模式 src 垫。例如videotestsrc ! video/x-raw,format=YUY2,width=720,height=480,framerate=30/1 ! queue2 ! appsink。但是,我似乎无法弄清楚为什么即使我已经实现了必要的功能,basesink 也永远不会激活为拉模式,并将can-activate-pull 设置为 TRUE 我认为这更像是如果您收到 30fps 隔行扫描,您将通过去隔行器运行它并输出 30fps 逐行扫描(或者您可能有一台电视或其他设计为以隔行扫描模式显示的东西,所以不会发生去隔行),它只会降低质量并使用更少的带宽。

以上是关于如何从 gstreamer 中的源请求更多缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

gstreamer 从缓冲区读取分贝

将输出从 rs_get_frame_data() 传递到 GStreamer

是否有命令行命令可以在一行中为 gstreamer 管道测试 appsrc 和 appsink?

Gstreamer应用开发实战指南

使用 (Python) Gstreamer 解码音频(到 PCM 数据)

尝试从帧缓冲区传递纹理会导致 L_INVALID_OPERATION:glDrawArrays:绘制的源纹理和目标纹理相同