2016-04-11 80 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); 

謝謝您的幫助!