Gstreamer Android HW 加速 H.264 编码
Gstreamer Android HW accelerated H.264 encoding
我正在开发一个机器人,它使用 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"
在 phone 上,我使用的是 Gstreamer 的预构建二进制文件,其实现与 this.
非常相似
从 MediaCodecList
Android API,我设法发现,我的设备具有 OMX.Exynos.avc.dec
的硬件加速,所以这就是我使用它的原因在那条管道中。
现在,当我 运行 应用程序时,本机库给我这个错误以及更多“相同”类型的错误:
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 核心跟不上编码。
您将使用 decodebin,它会 select 根据插件中内置的排名解码器。那应该是 select 最有效的解码方法:
rtspsrc location=rtsp://192.168.1.239:8554/test latency=300 ! application/x-rtp,encoding-name=H264 ! decodebin ! autovideosink
请注意,最低值可能无法实现最佳延迟。这取决于 stream-format 和网络可用带宽。只需在相当长的时间内尝试各种值 运行 并查看。
我正在开发一个机器人,它使用 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"
在 phone 上,我使用的是 Gstreamer 的预构建二进制文件,其实现与 this.
非常相似从 MediaCodecList
Android API,我设法发现,我的设备具有 OMX.Exynos.avc.dec
的硬件加速,所以这就是我使用它的原因在那条管道中。
现在,当我 运行 应用程序时,本机库给我这个错误以及更多“相同”类型的错误:
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 核心跟不上编码。
您将使用 decodebin,它会 select 根据插件中内置的排名解码器。那应该是 select 最有效的解码方法:
rtspsrc location=rtsp://192.168.1.239:8554/test latency=300 ! application/x-rtp,encoding-name=H264 ! decodebin ! autovideosink
请注意,最低值可能无法实现最佳延迟。这取决于 stream-format 和网络可用带宽。只需在相当长的时间内尝试各种值 运行 并查看。