C++ 如何使用Gstreamer播放原始字符*缓冲区?

C++ 如何使用Gstreamer播放原始字符*缓冲区?,c++,gstreamer,C++,Gstreamer,我有从video.mp4文件读取的char*缓冲区。此缓冲区大小为4096。 我试图从char*buffer创建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")

我有从video.mp4文件读取的char*缓冲区。此缓冲区大小为4096。 我试图从char*buffer创建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);
管道消费者是通过以下方式创建的:

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\u state\u NULL。 当我开始播放时,我将其状态设置为GST\u state\u 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
我使用gstreamer1.0。 有人面临这样的问题吗

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

我解决了这个问题。 出乎意料的是,对我来说,这是在创建GstBuffer的过程中

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

    GstBuffer * buffer = gst_buffer_new_allocate(NULL, size, NULL);
    gst_buffer_fill(m_dataBufferProducer, 0, data, size);
谢谢你的帮助

我解决了这个问题。 出乎意料的是,对我来说,这是在创建GstBuffer的过程中

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

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

谢谢你的帮助

你用过这个例子吗?eos是如何创建的(我的意思是流的尽头-谁创建了它,你是怎么做到的)?我猜你是在EOS后推缓冲器。。您是否看到与此相关的任何警告(使用
GST\u DEBUG=3/您的应用程序运行)为什么“GST\u元素设置\u状态(消费者,GST\u状态为空)”?您何时将其设置为“GST”状态“播放”?我们可能需要一个更完整的代码片段。看到ffmpegcolorspace,我还知道您正在使用多年未更新的gstreamer-0.10。请考虑切换到1。x,尤其是新代码。@ OtOrdoSkyNo,使用的例子,但它们几乎是相似的。当所有数据都已被推送时,我将EOS推送到缓冲区。我更新了问题的主体。如果在GST_DEBUG=3的情况下运行,我会得到很多编解码器\u mpegvideo gstmpegvideoparser.c:887:GST\u mpeg\u video\u packet\u parse\u picture\u header:不支持的图片类型:0@ensonic当我完成其他对象的初始化时,我将管道设置为GST_状态_播放。我使用gstreamer1.0。我不知道为什么在尝试使用ffmpegcolorspace时没有出现错误。好的,我想您应该对mp4文件进行一些处理(否则您只需使用filesrc)-检查更改的缓冲区。我刚刚注意到问题开头提到的4096大小-是否以字节为单位?这对于视频缓冲区来说非常小。。此外,还应为appsrc提供一些上限。。你在什么地方这样做?如果是这样,请粘贴所有相关代码段。您使用了示例吗?eos是如何创建的(我的意思是流的尽头-谁创建了它,你是怎么做到的)?我猜你是在EOS后推缓冲器。。您是否看到与此相关的任何警告(使用
GST\u DEBUG=3/您的应用程序运行)为什么“GST\u元素设置\u状态(消费者,GST\u状态为空)”?您何时将其设置为“GST”状态“播放”?我们可能需要一个更完整的代码片段。看到ffmpegcolorspace,我还知道您正在使用多年未更新的gstreamer-0.10。请考虑切换到1。x,尤其是新代码。@ OtOrdoSkyNo,使用的例子,但它们几乎是相似的。当所有数据都已被推送时,我将EOS推送到缓冲区。我更新了问题的主体。如果在GST_DEBUG=3的情况下运行,我会得到很多编解码器\u mpegvideo gstmpegvideoparser.c:887:GST\u mpeg\u video\u packet\u parse\u picture\u header:不支持的图片类型:0@ensonic当我完成其他对象的初始化时,我将管道设置为GST_状态_播放。我使用gstreamer1.0。我不知道为什么在尝试使用ffmpegcolorspace时没有出现错误。好的,我想您应该对mp4文件进行一些处理(否则您只需使用filesrc)-检查更改的缓冲区。我刚刚注意到问题开头提到的4096大小-是否以字节为单位?这对于视频缓冲区来说非常小。。此外,还应为appsrc提供一些上限。。你在什么地方这样做?如果是,请粘贴所有相关代码段。。