本文介紹了GStreamer Android硬件加速H.264編碼的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在開發一個機器人,它使用Gstreamer
從Jetson 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。
我從MediaCodecList
Android 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
請注意,使用最低值可能無法獲得最佳延遲。這取決于流格式和網絡可用帶寬。只需嘗試在相當長的持續時間內運行各種值,然后查看。
這篇關于GStreamer Android硬件加速H.264編碼的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,