QGC V5.0 gstreamer视频流在安卓端画面卡顿、冻结,硬件解码失败的问题解决方案 📅 2026/7/6 1:34:56 主要原因1.低端设备CPU软件解码性能不足2.硬件解码着色器未嵌入导致硬件解码失败回退软解3.gstreamer的gl上下文丢失导致画面冻结解决方法一、启用硬件解码我使用的gstreamer版本是1.26.2直接更改findgstreamer中的版本似乎会报错。硬件解码器MediaCodec/AMC输出的视频帧是 GL_TEXTURE_EXTERNAL_OES 纹理需要专用的 GLSL 着色器变体使用 samplerExternalOES采样器。GStreamer 上游提供两个着色器变体纹理类型采样器.qsb 文件解码方式GL_TEXTURE_2Dsampler2DRGBA.frag.qsb软解GL_TEXTURE_EXTERNAL_OESsamplerExternalOESRGBA.frag.qsb.external硬解安卓运行时选择逻辑在 gstqsg6material.cc:284-287 cpp if (target GST_GL_TEXTURE_TARGET_EXTERNAL_OES) frag_shader :/org/freedesktop/gstreamer/qml6/RGBA.frag.qsb.external; else frag_shader :/org/freedesktop/gstreamer/qml6/RGBA.frag.qsb;RGBA.frag.qsb.external 由独立的 add_custom_command qsb-wrapper.py 生成若该脚本没被成功调用将导致qsb文件嵌入失败进而导致无法使用硬件解码。二、禁用零拷贝我在使用gstreamer1.26.2时发现在云卓g12运行硬件解码RTSP视频流时发现画面时不时就会冻结毫无规律可言正常解码时非常流程解码高码率的三四路视频流都没问题但就是会不时出现视频画面冻结的现象哪怕我加了探测针检测画面管道停止流动时就重启视频流仍然没用解决探针始终判断视频在正常解码然后我用adb查看了渲染端的日志发现amcvideodec...gl_sync... Failed to render buffer渲染缓冲区失败说明这根本不是解码问题而是渲染问题我丢给claude它在网上搜索到了相关内容“这是一个已知的 GStreamer 缺陷搜索结果验证了这一点。您的解码器是amcvideodec-omxqcomvideodecoderhevc高通硬件 HEVC走零拷贝 GL 路径。该故障与gst-plugins-bad的 issue #1193 和 #1216 相符在 RTSP 断连时编解码器被停止而 GL 线程仍处于释放缓冲区的过程中on_frame_available回调被遗漏导致SurfaceTexture↔ GL 同步卡死。由于该状态残留在 Android Surface/解码器的 GL 层中因此重启管道也无法清除。上游官方推荐的规避方案是禁用零拷贝 GL 路径强制解码器输出video/x-raw系统内存格式让视频接收器sink正常上传纹理——这样就能完全剔除有问题的gl_sync/SurfaceTexture 路径。”最后测试结果就是测试多路视频流同时解码画面正常不卡顿且不再冻结。最后该问题据说是在GStreamer 1.7.1中出现的且在2025年时gstreamer官方以及将该问题设置未已解决但时至今日gstreamer1.26.2中仍然能够复现我不明白是为什么更深层次的原因和更根本的解决方案我也不知道后续我还会测试其他版本的gstreamer若是实在不行我就换成FFMpeg再试试了。