如何使用 Gstreamer 播放原始 char* 缓冲区?
How to play raw char* buffer with 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");
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 从文件中读取缓冲区,然后尝试播放它们。
也许我必须设置一些特定的固定大小的读取缓冲区?
我解决了这个问题。
对我来说出乎意料的是,它是在创建 GstBuffer 时。
从已知大小的数据 (char*) 创建此类缓冲区的正确方法是
GstBuffer * buffer = gst_buffer_new_allocate(NULL, size, NULL);
gst_buffer_fill(m_dataBufferProducer, 0, data, size);
感谢您的帮助!
我有从 video.mp4 文件中读取的 char* 缓冲区。此缓冲区的大小为 4096。 我试图从 char* buffer
创建 GstBufferGstBuffer* 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 从文件中读取缓冲区,然后尝试播放它们。 也许我必须设置一些特定的固定大小的读取缓冲区?
我解决了这个问题。 对我来说出乎意料的是,它是在创建 GstBuffer 时。
从已知大小的数据 (char*) 创建此类缓冲区的正确方法是
GstBuffer * buffer = gst_buffer_new_allocate(NULL, size, NULL);
gst_buffer_fill(m_dataBufferProducer, 0, data, size);
感谢您的帮助!