2016-04-11 45 views
1

我有char *缓冲区,我从video.mp4文件读取。该缓冲区的大小为4096 我试图从字符*缓冲创建GstBuffer如何用Gstreamer玩原始char *缓冲区?

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); 

管道消费者在接下来的方式创建:

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。 有没有人遇到这样的问题?

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

+0

您是否使用过[this](https://cgit.freedesktop.org/gstreamer/gst-plugins-base/tree/tests/examples/app/appsrc_ex.c)示例?这个eos是如何创建的(我的意思是流的结束 - 谁创建了这个,你是否在做这个)?我的猜测是,你在EOS后推缓冲区..你看到有关此警告(使用'GST_DEBUG = 3。/ your_app'运行) – nayana

+0

为什么'''gst_element_set_state(consumer,GST_STATE_NULL);'''?你是否将它设置为'''GST_STATE_PLAYING'''?我们可能需要更完整的代码片段。另外看到ffmpegcolorspace告诉我,你正在使用gstreamer-0.10,它已经好几年没有更新过了。请考虑切换到1.X,特别是对于新代码。 – ensonic

+0

@otopolsky 不,使用https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-data-spoof.html示例,但它们几乎相似。 当所有数据已被推送时,我将EOS推入缓冲区。我更新了问题的主体。 如果有GST_DEBUG = 3运行,我得到了很多的 codecparsers_mpegvideo gstmpegvideoparser.c:887:gst_mpeg_video_packet_parse_picture_header:不支持的图片类型:0 –

回答

1

我解决了这个问题。 意外的是我在创建GstBuffer。

来创建数据与已知大小,缓冲区(字符*)正确的做法是

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

谢谢您的帮助!