2026/3/27 23:36:00
网站建设
项目流程
做装潢网站,餐饮o2o平台有哪些,wordpress会员注册怎么搞,河北做网站的1、前言在一次Qt项目开发过程中#xff0c;Arm架构的ubuntu环境下#xff0c;使用qt qmediaplayer播放视频报错Warning: No decoder available for type video/mpeg..#xff0c;经过长时间的排查#xff0c;最终找到问题所在#xff0c;最终解决问题。2、现象在Qt中…1、前言在一次Qt项目开发过程中Arm架构的ubuntu环境下使用qt qmediaplayer播放视频报错Warning: No decoder available for type video/mpeg..经过长时间的排查最终找到问题所在最终解决问题。2、现象在Qt中使用qmediaplayer播放MP4avimkv等视频时视频无法播放并出现类似如下报错Warning: No decoder available for type video/x-h264, stream-format(string)avc, alignment(string)au, codec_data(buffer)0164002affe1001a6764002aac2c6a81e0089f966e0202028000000300800000194201000468ee3cb0, level(string)4.2, profile(string)high.Warning: No decoder available for type audio/mpeg, mpegversion(int)1, mpegaudioversion(int)1, layer(int)3, rate(int)48000, channels(int)2, parsed(boolean)true.使用系统自带的Video播放器也无法播放视频3、问题原因与解决方法①没有安装gstreamer1.0-libavQt 5.12 的 QMediaPlayer 在 Linux/ARM 上依赖 GStreamer而当前系统的 GStreamer 没有可用的 MPEG-4 (video/mpeg, mpegversion4) 解码器插件。解决方法在终端中进行以下安装# 更新软件源sudo apt update# 安装基础的GStreamer插件ARM架构sudo apt install -y gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly# 安装MP4/H.264解码关键插件sudo apt install -y gstreamer1.0-libav gstreamer1.0-vaapi# 安装Qt5与GStreamer的桥接组件sudo apt install -y libqt5multimedia5-plugins qtmultimedia5-dev注以上安装完成后基本可以解决90%的问题记得最好将QtCreator重启一下②安装以上插件后依旧无法播放使用GStreamer命令行工具进行测试这是为了绕过Qt直接测试系统层的GStreamer能否播放。请将/path/to/your/video.mp4替换为您的视频文件绝对路径。gst-launch-1.0 playbin urifile:///path/to/your/video.mp4如果报同样的插件错误说明是系统层的GStreamer插件确实缺失或未正确安装。即使安装了gstreamer1.0-libav也可能存在架构兼容性问题。可以尝试彻底重装sudo apt reinstall -y gstreamer1.0-libav如果成功播放说明GStreamer已经安装了gstreamer1.0-libav但是无法确保能够找到解码器MPEG-4 (video/mpeg, mpegversion4) 解码器可以通过一下命令验证是否能够找到解码器。gst-inspect-1.0 avdec_mpeg4正常应该看到类似Factory Details:Rank primaryLong-name libav MPEG-4 decoder如果能够看到说明能够找到解码器即可重新尝试qt播放视频如果看不到类似打印说明能识别 MPEG-4 流但不能解码这正是 QMediaPlayer 报No decoder available的原因如输入以下命令后gst-inspect-1.0 avdec_mpeg4出现以下结果No such element or plugin接下来进行第1步确认 gst-inspect 用的是哪一套which gst-inspect-1.0正常系统应是/usr/bin/gst-inspect-1.0第2步确认 libav 插件真实存在ls /usr/lib/aarch64-linux-gnu/gstreamer-1.0/ | grep libav正常一定会看到libgstlibav.so第3步让 GStreamer“说实话”GST_DEBUG3 gst-inspect-1.0 avdec_mpeg4如果你看到类似no such element skipping plugin ... libgstlibav.so或根本没提 libgstlibav 说明插件根本没被扫描到第四步验证libgstlibav是否缺少库ldd /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstlibav.so如果出现以下打印说明缺少FFmpeg 运行库libavcodec.so.58 not foundlibavutil.so.56 not foundlibswresample.so.3 not found可以使用以下命令尝试补全sudo apt install \ libavcodec58 \ libavutil56 \ libswresample3 \ libavformat58补全后使用以下命令删除gstreamer的注册文件后重新扫描插件rm -f ~/.cache/gstreamer-1.0/registry.aarch64.bingst-inspect-1.0 avdec_mpeg4如果出现以下打印说明能够找到解码器即可重新尝试qt播放视频Factory Details:Long-name: libav MPEG-4 decoderKlass: Decoder/VideoDescription: Decode MPEG-4 video streams如果出现以下提示(gst-plugin-scanner:155541): GStreamer-WARNING **: 09:56:26.267: Failed to load plugin /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstchromaprint.so: /usr/lib/aarch64-linux-gnu/libgomp.so.1: cannot allocate memory in static TLS block(gst-plugin-scanner:155541): GStreamer-WARNING **: 09:56:26.634: Failed to load plugin /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstlibav.so: /usr/lib/aarch64-linux-gnu/libgomp.so.1: cannot allocate memory in static TLS blockNo such element or plugin avdec_mpeg4则说明最终找到了问题原因libgomp.so.1: cannot allocate memory in static TLS block并且它同时导致❌libgstlibav.so加载失败❌libgstchromaprint.so加载失败❌avdec_mpeg4永远注册不了这不是插件缺失也不是 FFmpeg 不全而是 ARM 平台上的“静态 TLS 槽位耗尽”问题。解决方法通过预加载 libgomp有时可以“挤出” TLS 槽位export LD_PRELOAD/usr/lib/aarch64-linux-gnu/libgomp.so.1 rm -f ~/.cache/gstreamer-1.0/registry.aarch64.bin gst-inspect-1.0 avdec_mpeg4如果成功avdec_mpeg4会出现但这是 Hack不保证 Qt / 多线程场景长期稳定