【发布时间】: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..