Qt Multimedia GStreamer backend
Esta página cubre las limitaciones y puntos de personalización del backend GStreamer de Qt Multimedia, el backend multimedia por defecto en Linux embebido.
Consideraciones arquitectónicas
GStreamer es el backend multimedia por defecto en Linux embebido principalmente porque es el framework que la mayoría de los vendedores de placas embebidas priorizan para el soporte multimedia acelerado por hardware. FFmpeg también puede ser adecuado en algunas plataformas, por lo que se anima a los usuarios a experimentar con ambos backends multimedia para averiguar cuál funciona mejor para ellos.
Qt Multimedia GStreamer no es un framework de streaming de propósito general y no es necesariamente la mejor forma arquitectónica de usar GStreamer con Qt. Los desarrolladores, que necesitan un alto grado de control sobre la tubería GStreamer, pero sólo quieren mostrar la salida de vídeo Qt, puede que desee considerar el uso de GStreamer qml6glsink.
Limitaciones y Problemas Conocidos
GStreamer no se incluye con Qt, pero normalmente se despliega con la distribución de Linux.
- Algunos errores pueden deberse a la versión de GStreamer utilizada. Recomendamos utilizar la última versión de GStreamer corregida en su plataforma.
- Algunos errores también pueden estar relacionados con las bibliotecas utilizadas por GStreamer, como Pulseaudio. En particular Pulseaudio v16 tiene un error conocido que hace que la tubería GStreamer se cuelgue y requiere backports de estos dos parches:
- https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/745
- https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/764
Este error afecta actualmente a la mayoría de las distribuciones de Linux, incluyendo Ubuntu 22.04, 23.10 y 24.04, Debian 11 y 12, así como Fedora 39 y 40.
- No se admite el cambio de dispositivos de cámara o cámaras durante la grabación
- La búsqueda, las tasas de reproducción, el bucle y los sumideros de conmutación tienen errores conocidos.
- Las funciones de audio requieren PulseAudio. Consulte las notas de la plataforma Linux para más detalles.
- Algunas placas embebidas necesitan configuraciones individuales para resolver problemas de negociación/enlace de canalizaciones y mejorar el rendimiento. Recomendamos a los desarrolladores que experimenten con las variables de entorno listadas en Puntos de personalización cuando se enfrenten a estos problemas. Los archivos de la meta capa Yocto de Qt contienen configuraciones recomendadas para ciertas combinaciones de placas, BSPs y versiones de Boot to Qt. Aquí están los enlaces a las versiones de la rama dev:
- NXP i.MX 6/8/9: https://code.qt.io/cgit/yocto/meta-boot2qt.git/tree/meta-boot2qt-distro/dynamic-layers/freescale-layer/recipes-qt/boot2qt-addons/default-qt-envs.bbappend?h=dev
- Raspberry Pi 4/5: https://code.qt.io/cgit/yocto/meta-boot2qt.git/tree/meta-boot2qt-distro/dynamic-layers/raspberrypi/recipes-qt/boot2qt-addons/default-qt-envs.bbappend?h=dev
Algunas placas NXP i.MX exponen un dispositivo v4l2 llamado imx-capture, que puede causar errores cuando se utiliza con v4l2src en GStreamer. Para evitar que Qt Multimedia añada imx-capture a la lista de dispositivos de cámara disponibles, establezca la variable de entorno QT_GSTREAMER_SKIP_IMXCAPTURE=1. Tenga en cuenta que esto se considera como una API privada que será eliminada cuando NXP solucione los problemas con imx-capture.
- La reproducción de vídeo o streaming de cámara utilizando fotogramas de vídeo de la memoria del sistema o la conversión de software puede dar lugar a fotogramas perdidos y falta de respuesta debido a una gran carga de la CPU. Si el decodificador GStreamer o el dispositivo de cámara emite fotogramas de vídeo respaldados por DMA-BUF o GLMemory en uno de nuestros formatos de píxel soportados, Qt puede renderizarlos sin conversión o copia adicional. GStreamer selecciona un formato y tipo de memoria basado en las capacidades de sus elementos de canalización. Diferentes formas de controlar qué elementos se añaden a la tubería se describen en Puntos de personalización. Ver también Especificación del modo de E/S para cámaras v4l2.
Puntos de personalización
Qt Multimedia proporciona ciertos puntos de personalización para permitir el acceso a la canalización GStreamer subyacente. El punto de entrada es class QGStreamerPlatformSpecificInterface. Se pueden realizar personalizaciones adicionales configurando variables de entorno.
Advertencia: Los puntos de personalización y las variables de entorno específicas de Qt listadas aquí, se consideran APIs privadas y pueden estar sujetas a cambios. Tenga en cuenta que las variables de entorno son heredadas por defecto por los procesos hijos y pueden tener consecuencias no deseadas.
Renderizado externo de texturas OpenGL
Qt importa fotogramas de vídeo respaldados por DMA-BUF en el canal de gráficos OpenGL vinculando el búfer subyacente como una imagen EGL y exponiéndolo a los sombreadores como una textura OpenGL. Por defecto, Qt muestrea estas texturas utilizando el objetivo de textura GL_TEXTURE_2D y el código de sombreado estándar. Algunas tarjetas embebidas funcionan mejor con el objetivo de textura GL_TEXTURE_EXTERNAL_OES en su lugar, junto con un fragment shader dedicado. Este comportamiento puede activarse configurando la siguiente variable de entorno:
QT_MULTIMEDIA_FORCE_GL_TEXTURE_EXTERNAL_OES=1
Especificación del modo de E/S para cámaras v4l2
Cuando se utiliza un dispositivo de captura v4l2 con una cámara QCamera o QML, la propiedad io-mode del elemento GStreamer v4l2src subyacente afecta a si emite o no fotogramas de vídeo respaldados por DMA-BUF que permiten el renderizado de copia cero. En algunos casos, el modo automático predeterminado elige el modo mmap aunque el controlador de la cámara admita el modo dmabuf. El valor int de la propiedad io-mode puede establecerse explícitamente a través de la variable de entorno que se muestra a continuación. Aquí hay un ejemplo que muestra cómo establecer io-mode a dmabuf con el enum GST_V4L2_IO_DMABUF:
QT_GSTREAMER_V4L2SRC_IOMODE=4
Seleccionando elementos específicos de GStreamer
Una distribución GStreamer puede incluir varios plugins diferentes que potencialmente pueden realizar la misma tarea en el canal de medios. GStreamer selecciona automáticamente elementos como decodificadores y demuxers basado en su rango de características, que puede ser anulado a través de una variable de entorno GStreamer. Aquí hay un ejemplo que clasifica el decodificador de hardware v4l2h264dec más alto que cualquier decodificador de software H.264, mientras que también se asegura de que el demuxer aiurdemux no está seleccionado:
GST_PLUGIN_FEATURE_RANK=v4l2h264dec:MAX,aiurdemux:NONE
Para inspeccionar qué elementos se están creando durante el tiempo de ejecución, active el nivel 4 de registro de depuración para GstElementFactory:
GST_DEBUG=GST_ELEMENT_FACTORY:4
Además, puede inspeccionar visualmente toda la tubería GStreamer especificando una carpeta para .dot archivos gráficos que se volcarán en varios eventos, por ejemplo, cambios en el estado de reproducción:
GST_DEBUG_DUMP_DOT_DIR=/root/graphs
Lea más acerca de estas variables de entorno en la documentación GStreamer:
- Variables de entorno - GST_PLUGIN_FEATURE_RANK
- Tutorial básico - El registro de depuración
- Tutorial básico - Obtención de gráficos pipeline
Especificación de elementos de conversión de hardware
Si la fuente de medios de un pipeline GStreamer no puede proporcionar búferes de vídeo en un formato de píxel soportado por Qt Multimedia, el pipeline utilizará la conversión de software a menos que contenga un elemento de conversión de vídeo acelerado por hardware adecuado. Para especificar un elemento de conversión de hardware a utilizar, configurarlo como una descripción de la tubería GStreamer a la siguiente variable de entorno:
QT_GSTREAMER_OVERRIDE_VIDEO_CONVERSION_ELEMENT
Algunos elementos de conversión específicos del proveedor (imxvideoconvert_g2d, nvvidconv) se añaden al pipeline por defecto si están disponibles. Esto puede causar una conversión innecesaria si no son necesarios, y puede ser desactivado mediante la especificación de un elemento de identidad GStreamer utilizando la misma variable de entorno:
QT_GSTREAMER_OVERRIDE_VIDEO_CONVERSION_ELEMENT=identityGStreamer también puede realizar la conversión de formato con elementos OpenGL, proporcionando a Qt fotogramas de vídeo respaldados por GLMemory:
QT_GSTREAMER_OVERRIDE_VIDEO_CONVERSION_ELEMENT=glupload ! glcolorconvert
Acceso raw pipeline
Se puede acceder a GstPipeline subyacente a QMediaPlayer y QMediaCaptureSession.
Advertencia: Esta es una API insegura, ya que el pipeline sigue siendo gestionado por la implementación de Qt. Es necesario tener mucho cuidado al utilizar esta API.
#include <QtMultimedia/private/qgstreamer_platformspecificinterface_p.h> [...] QMediaPlayer player; GstPipeline *pipeline = QGStreamerPlatformSpecificInterface::instance()->gstPipeline(&player); [...] QMediaCaptureSession session; GstPipeline *pipeline = QGStreamerPlatformSpecificInterface::instance()->gstPipeline(&session);
Elementos GStreamer personalizados como sumideros y fuentes
Es posible crear elementos GStreamer a partir de una descripción GStreamer pipeline y envolverlos dentro de un QCamera o QAudioDevice:
#include <QtMultimedia/private/qgstreamer_platformspecificinterface_p.h> [...] QByteArray pipelineString = "videotestsrc is-live=true ! gamma gamma=2.0"; QMediaCaptureSession session; session.setVideoSink(wid.videoSink()); QCamera *cam = QGStreamerPlatformSpecificInterface::instance()->makeCustomGStreamerCamera( pipelineString, &session); session.setCamera(cam);
QMediaPlayer: fuentes personalizadas
El QMediaPlayer acepta una descripción GStreamer pipeline como fuente URI:
QMediaPlayer player; player.setSource(u"gstreamer-pipeline: videotestsrc name=testsrc"_s);
Este intentará compilar la descripción del pipeline para usarla como fuente en el QMediaPlayer y se conectará automáticamente a los sinks del QMediaPlayer.
Advertencia: ¡Hic sunt dracones! Las canalizaciones personalizadas son una función experimental: las canalizaciones personalizadas no se asignan bien a las API de QMediaPlayer, sobre todo el estado de los medios, las API de metadatos y el estado del transporte. La mayoría de las llamadas se asignarán directamente a la tubería GStreamer, que puede conducir a un comportamiento indefinido en función de la tubería. En la mayoría de los casos, el gstreamer-pipeline: puede no ser la elección correcta para el código de aplicación: para fuentes de vídeo arbitrarias, el QMediaCaptureSession con una cámara personalizada (véase más arriba) es la opción preferida. Para tuberías arbitrariamente complejas que sólo quieren dibujar en una GUI Qt/QML, qml6glsink de GStreamer (ver más abajo) puede ser una opción más robusta.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.