GSTREAMER管道播放,但没有填充的回调(仅在Android上发生,在Windows和Linux上可行)



我正在使用Android上的GSTREAMER(版本1.14.1(,并且已经在Windows和Linux上使用的实现(C 代码(。

我遵循GSTREAMER网站的Android教程,构建了我自己的gstreamer-android.so库,用于在Android Studio中使用。在我的C 代码中,我添加了 GST_PLUGIN_STATIC_DECLAREGST_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);

启动它

我以不同的元素为sourcefilesrcudpsrcvideotestsrc

当我将管道切换为播放状态时,我希望触发decodebinpad-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),现在一切都对我有用!:(

最新更新