本文介紹了GStreamer Android硬件加速H.264編碼的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我正在開(kāi)發(fā)一個(gè)機(jī)器人,它使用Gstreamer
從Jetson Nano
通過(guò)UDP
將兩個(gè)攝像頭流傳輸?shù)紸ndroid設(shè)備。
此時(shí),我正在獲取其中一個(gè)流,并嘗試對(duì)視頻進(jìn)行編碼以在Android設(shè)備上顯示。我的GStreamer管道如下所示:
rtspsrc location=rtsp://192.168.1.239:8554/test ! application/x-rtp, payload=96 ! rtph264depay ! amcviddec-omxexynosavcdec ! videoconvert ! autovideosink sync=false"
在手機(jī)上,我使用的是GStreamer的預(yù)構(gòu)建二進(jìn)制文件,其實(shí)現(xiàn)非常類似于this。
我從MediaCodecList
Android API中了解到,我的設(shè)備具有OMX.Exynos.avc.dec
的硬件加速,這就是我在該管道中使用它的原因。
現(xiàn)在,當(dāng)我運(yùn)行該應(yīng)用程序時(shí),本機(jī)庫(kù)給我這個(gè)錯(cuò)誤以及更多的";ame";type:
錯(cuò)誤
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
整個(gè)堆棧跟蹤here。
有誰(shuí)有這方面的經(jīng)驗(yàn)嗎?當(dāng)我嘗試使用avdec_h264
這樣的不同編碼器時(shí),流可以工作,但有一個(gè)CPU內(nèi)核跟不上編碼。
推薦答案
您將使用解碼庫(kù),它將根據(jù)插件中內(nèi)置的排名來(lái)選擇解碼器。這應(yīng)該選擇可用于解碼的最有效的:
rtspsrc location=rtsp://192.168.1.239:8554/test latency=300 ! application/x-rtp,encoding-name=H264 ! decodebin ! autovideosink
請(qǐng)注意,使用最低值可能無(wú)法獲得最佳延遲。這取決于流格式和網(wǎng)絡(luò)可用帶寬。只需嘗試在相當(dāng)長(zhǎng)的持續(xù)時(shí)間內(nèi)運(yùn)行各種值,然后查看。
這篇關(guān)于GStreamer Android硬件加速H.264編碼的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,