我正在使用Android上的GSTREAMER(版本1.14.1(,并且已经在Windows和Linux上使用的实现(C 代码(。
我遵循GSTREAMER网站的Android教程,构建了我自己的gstreamer-android.so
库,用于在Android Studio中使用。在我的C 代码中,我添加了 GST_PLUGIN_STATIC_DECLARE
和GST_PLUGIN_STATIC_REGISTER
宏以注册静态插件。在运行时,所有GSTELEMENTS都可以成功创建。(我正在使用gst_element_factory_make()
来电。(
我这样构建管道:
GstCaps* video_caps = gst_caps_new_full(
gst_structure_new("video/x-raw", "format", G_TYPE_STRING, "RGBA", NULL),
gst_structure_new("video/x-h264", "format", G_TYPE_STRING, "RGBA", NULL),
NULL);
g_object_set(m_app_sink, "emit-signals", TRUE, "caps", video_caps, NULL);
g_signal_connect(m_app_sink, "new-sample", G_CALLBACK(cb_new_sample), this);
gst_bin_add_many(GST_BIN(m_pipeline), source, m_decoder, m_video_flip, m_queue, m_video_convert, m_app_sink, NULL);
if (!gst_element_link_many(source, m_decoder, NULL)) {
gst_object_unref(m_pipeline);
return false;
}
if (!gst_element_link_many(m_video_flip, m_queue, m_video_convert, m_app_sink, NULL)) {
gst_object_unref(m_pipeline);
return false;
}
g_signal_connect(m_decoder, "pad-added", G_CALLBACK(cb_pad_added), this);
和以后的代码以gst_element_set_state(m_pipeline, GST_STATE_PLAYING);
我以不同的元素为source
:filesrc
,udpsrc
和videotestsrc
。
当我将管道切换为播放状态时,我希望触发decodebin
的pad-added
回调,并在那里进行PAD的链接。所有这些都已经在所有3个来源上都在Windows和Linux上工作。
在Android上,回调仅针对videotestsrc
触发,但如果我使用其他来源之一。
但是我想念什么?为什么它适用于VideoTestSRC,而对文件和UDP流不起作用?(正确设置了Android应用中的权限设置并注册了静态插件。(
有人知道在Android上手动和回调的管道的示例实现吗?(到目前为止,我只能找到playbin
的示例,因为我需要从视频流中获取帧,所以我无法使用。(
我真的没有想法,为什么我没有得到这个回调。任何帮助和建议都非常感谢。谢谢!
更新:
创建了自己的调试功能(在此帖子之后(后,我可以看到H.264的编码器插件存在问题。
2019-07-30 09:56:29.034 27551-27611/at.myapp.player E/GStreamer.cpp:: gstdecodebin2.c,gst_decode_bin_expose: error: no suitable plugins found:
Missing decoder: H.264 (Constrained Baseline Profile) (video/x-h264, stream-format=(string)avc, alignment=(string)au, level=(string)4, profile=(string)constrained-baseline, codec_data=(buffer)0142c028ffe1001c6742c028db01e0089f97016a020202800000030080015f90078c197001000568ca8132c8, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)1/1)
,但我还不知道该如何解决。我虽然添加GST_PLUGIN_STATIC_REGISTER(openh264);
应该在那里,不是吗?
好吧,我明白了!
我添加了GST_PLUGIN_STATIC_REGISTER(videoparsersbad)
,现在一切都对我有用!:(