【问题标题】:How to play raw char* buffer with Gstreamer?如何使用 Gstreamer 播放原始 char* 缓冲区?
【发布时间】:2016-04-11 14:01:43
【问题描述】:

我有从 video.mp4 文件中读取的 char* 缓冲区。此缓冲区的大小为 4096。 我试图从 char* 缓冲区创建 GstBuffer

GstBuffer* Buffer = gst_buffer_new_wrapped(data, size);
dataBuffer = gst_buffer_copy(tmpBuf);

然后我将此缓冲区推送到 appsrc

GstElement* source = gst_bin_get_by_name (GST_BIN (consumer), "source");
gst_app_src_push_buffer (GST_APP_SRC (source), dataBuffer);
gst_object_unref (source);

管道consumer是通过以下方式创建的:

gchar* videoConsumerString = g_strdup_printf ("appsrc max-buffers=5 drop=false name=source ! decodebin ! xvimagesink");
consumer = gst_parse_launch (videoConsumerString, NULL);
gst_element_set_state (consumer, GST_STATE_NULL);
g_free (videoConsumerString);

创建管道后,我将其状态设置为 GST_STATE_NULL。 当我开始播放时,我将其状态设置为 GST_STATE_PLAYING。

但在外面我得到了错误:

ERROR from element mpegvparse0: No valid frames found before end of stream

我尝试更改 char* 缓冲区的大小,在管道中使用不同的元素(例如 ffmpegcolorspace、videconvert 等),但没有解决这个问题。

如果使用 GST_DEBUG=3 运行,我会收到很多警告

0:00:00.064480642  4059      0x12c66d0 WARN    codecparsers_mpegvideo gstmpegvideoparser.c:887:gst_mpeg_video_packet_parse_picture_header: Unsupported picture type : 0

我使用 gstreamer 1.0。 有人遇到过这样的问题吗?

附:我无法使用 Gstreamer 从文件中读取数据。我只能用 fread 从文件中读取缓冲区,然后尝试播放它们。 也许我必须设置一些特定的固定大小的读取缓冲区?

【问题讨论】:

  • 你用过this的例子吗?那个 eos 是如何创建的(我的意思是流的结束 - 谁创建了它,你是在以某种方式这样做)?我的猜测是您在 EOS 之后推送缓冲区..您是否看到任何有关此的警告(使用 GST_DEBUG=3 ./your_app 运行)
  • 为什么是 '''gst_element_set_state (consumer, GST_STATE_NULL);'''?你什么时候把它设置为'''GST_STATE_PLAYING'''?我们可能需要更完整的代码sn-p。还看到 ffmpegcolorspace 告诉我您正在使用多年未更新的 gstreamer-0.10。请考虑切换到 1.X,尤其是对于新代码。
  • @otopolsky 不,使用gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/… 示例,但它们几乎相似。当所有数据都已经推送时,我将 EOS 推送到缓冲区。我更新了问题的主体。如果使用 GST_DEBUG=3 运行,我会得到很多 codecparsers_mpegvideo gstmpegvideoparser.c:887:gst_mpeg_video_packet_parse_picture_header: Unsupported picture type : 0
  • @ensonic 当我完成其他对象的初始化时,我将管道设置为 GST_STATE_PLAYING。我使用 gstreamer 1.0。我不知道为什么我在尝试使用 ffmpegcolorspace 时没有报错。
  • 好的,我猜您对 mp4 文件进行了一些处理(否则您只需使用 filesrc) - 检查更改的缓冲区。我刚刚注意到问题开头提到的 4096 大小 - 它以字节为单位吗?这对于视频缓冲区来说非常小..您还应该为appsrc提供一些上限..您在某处这样做吗?如果是这样,请粘贴所有相关代码 sn-ps..

标签: c++ gstreamer


【解决方案1】:

我解决了这个问题。 出乎我意料的是,它是在创建 GstBuffer 时。

从已知大小的数据(char*)创建此类缓冲区的正确方法是

    GstBuffer * buffer = gst_buffer_new_allocate(NULL, size, NULL);
    gst_buffer_fill(m_dataBufferProducer, 0, data, size);

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多