GStreamer Android硬件加速H.264编码

我正在开发一个机器人,它使用GstreamerJetson Nano通过UDP将两个摄像头流传输到Android设备。

此时,我正在获取其中一个流,并尝试对视频进行编码以在Android设备上显示。我的GStreamer管道如下所示:

rtspsrc location=rtsp://192.168.1.239:8554/test ! application/x-rtp, payload=96 ! rtph264depay ! amcviddec-omxexynosavcdec ! videoconvert ! autovideosink sync=false"

在手机上,我使用的是GStreamer的预构建二进制文件,其实现非常类似于this。

我从MediaCodecListAndroid API中了解到,我的设备具有OMX.Exynos.avc.dec的硬件加速,这就是我在该管道中使用它的原因。

现在,当我运行该应用程序时,本机库给我这个错误以及更多的";ame";type:

错误
2022-02-15 12:25:13.570 6377-6377/cz.walle.wallecontroller E/GStreamer+ahc: 0:00:00.095861231 0x7589b71200 ../sys/androidmedia/gst-android-hardware-camera.c:1777:_init_classes Failed to initialize android.hardware.Camera classes: Failed to get static field ID EFFECT_EMBOSS (Ljava/lang/String;): java.lang.NoSuchFieldError: no "Ljava/lang/String;" field "EFFECT_EMBOSS" in class "Landroid/hardware/Camera$Parameters;" or its superclasses
    java.lang.NoSuchFieldError: no "Ljava/lang/String;" field "EFFECT_EMBOSS" in class "Landroid/hardware/Camera$Parameters;" or its superclasses
        at org.freedesktop.gstreamer.GStreamer.nativeInit(Native Method)
        at org.freedesktop.gstreamer.GStreamer.init(GStreamer.java:18)
        at cz.walle.wallecontroller.ControlActivity.onCreate(ControlActivity.java:41)
        at android.app.Activity.performCreate(Activity.java:8282)
        at android.app.Activity.performCreate(Activity.java:8262)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4005)
        at android.app.ActivityThread.ha
2022-02-15 12:25:13.570 6377-6377/cz.walle.wallecontroller E/GStreamer+ahs: 0:00:00.096544154 0x7589b71200 ../sys/androidmedia/gst-android-hardware-sensor.c:596:_init_classes Failed to initialize Android classes: Failed to call Java method: java.lang.ClassNotFoundException: Didn't find class "org/freedesktop/gstreamer/androidmedia/GstAhsCallback" on path: DexPathList[[zip file "/data/app/~~cU9DGdEFi5D9pOGi5u1pLw==/cz.walle.wallecontroller-nq-kqx36s-N7ImViW2Lwrw==/base.apk"],nativeLibraryDirectories=[/data/app/~~cU9DGdEFi5D9pOGi5u1pLw==/cz.walle.wallecontroller-nq-kqx36s-N7ImViW2Lwrw==/lib/arm64, /data/app/~~cU9DGdEFi5D9pOGi5u1pLw==/cz.walle.wallecontroller-nq-kqx36s-N7ImViW2Lwrw==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]]
    java.lang.ClassNotFoundException: Didn't find class "org/freedesktop/gstreamer/androidmedia/GstAhsCallback" on path: DexPathList[[zip file "/data/app/~~cU9DGdEFi5D9pOGi5u1pLw==/cz.walle.wallecontroller-nq-kqx36s-N7ImViW2Lwrw==/base.apk"],nativeLibraryDirectories=[/data/app/~~cU9DGdEFi5D9pOGi5u1pLw==/cz.walle.wallecontroller-nq-kqx36s-N7ImVi

整个堆栈跟踪here。

有谁有这方面的经验吗?当我尝试使用avdec_h264这样的不同编码器时,流可以工作,但有一个CPU内核跟不上编码。


解决方案

您将使用解码库,它将根据插件中内置的排名来选择解码器。这应该选择可用于解码的最有效的:

rtspsrc location=rtsp://192.168.1.239:8554/test latency=300 ! application/x-rtp,encoding-name=H264 ! decodebin ! autovideosink
请注意,使用最低值可能无法获得最佳延迟。这取决于流格式和网络可用带宽。只需尝试在相当长的持续时间内运行各种值,然后查看。

相关文章