安庆市网站建设_网站建设公司_云服务器_seo优化
2025/12/30 16:20:59 网站建设 项目流程

1、前言

在一次Qt项目开发过程中,Arm架构的ubuntu环境下,使用qt qmediaplayer播放视频报错Warning: "No decoder available for type 'video/mpeg..,经过长时间的排查,最终找到问题所在,最终解决问题。

2、现象

在Qt中使用qmediaplayer播放MP4,avi,mkv等视频时,视频无法播放并出现类似如下报错

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-libav

Qt 5.12 的 QMediaPlayer 在 Linux/ARM 上依赖 GStreamer,而当前系统的 GStreamer 没有可用的 MPEG-4 (video/mpeg, mpegversion=4) 解码器插件。

解决方法:

在终端中进行以下安装

# 更新软件源

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 uri=file:///path/to/your/video.mp4
  • 如果报同样的插件错误:说明是系统层的GStreamer插件确实缺失或未正确安装。即使安装了gstreamer1.0-libav,也可能存在架构兼容性问题。可以尝试彻底重装:

sudo apt reinstall -y gstreamer1.0-libav
  • 如果成功播放:说明GStreamer已经安装了gstreamer1.0-libav,但是无法确保能够找到解码器MPEG-4 (video/mpeg, mpegversion=4) 解码器,可以通过一下命令验证是否能够找到解码器。

gst-inspect-1.0 avdec_mpeg4

正常应该看到类似:

Factory Details:
Rank primary
Long-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_DEBUG=3 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 found
libavutil.so.56 => not found
libswresample.so.3 => not found

可以使用以下命令尝试补全

sudo apt install \ libavcodec58 \ libavutil56 \ libswresample3 \ libavformat58

补全后,使用以下命令删除gstreamer的注册文件后重新扫描插件

rm -f ~/.cache/gstreamer-1.0/registry.aarch64.bin
gst-inspect-1.0 avdec_mpeg4

如果出现以下打印,说明能够找到解码器,即可重新尝试qt播放视频

Factory Details:
Long-name: libav MPEG-4 decoder
Klass: Decoder/Video
Description: 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 block

No 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 / 多线程场景长期稳定

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询