Nota: La transmisión de audio en varias habitaciones AirPlay2 no es compatible: use shairport-sync para eso.
.
Instale uxplay en sistemas Linux basados en Debian con " sudo apt install uxplay
"; en FreeBSD con " sudo pkg install uxplay
". También disponible en sistemas basados en Arch a través de AUR. Desde la versión 1.66, uxplay ahora también está empaquetado en formato RPM en Fedora 38 (" sudo dnf install uxplay
").
Para otras distribuciones basadas en RPM que aún no han empaquetado UxPlay, ahora se proporciona un "archivo de especificaciones" de RPM uxplay.spec con versiones recientes (consulte sus "Activos"), y también se puede encontrar en el directorio principal de fuentes de UxPlay. Consulte la sección sobre el uso de este archivo de especificaciones para crear un paquete RPM instalable.
Después de la instalación:
(En Linux y *BSD): si hay un firewall activo en el servidor que aloja UxPlay, asegúrese de que el puerto de red predeterminado (UDP 5353) para consultas mDNS/DNS-SD esté abierto (consulte Solución de problemas a continuación para obtener más detalles); También abra tres puertos UDP y tres TCP para Uxplay, y use la opción "uxplay -p" (ver " man uxplay
" o " uxplay -h
").
Incluso si instala el paquete binario uxplay precompilado de su distribución, es posible que necesite leer las instrucciones a continuación para ejecutar UxPlay para ver cuál de los paquetes de complementos GStreamer de su distribución también debe instalar.
Para el modo de solo audio (Apple Music, etc.), la mejor calidad se obtiene con la opción "uxplay -async", pero luego iOS impone una latencia de 2 segundos.
Agregue cualquier opción de UxPlay que desee utilizar como predeterminada a un archivo de inicio ~/.uxplayrc
(consulte " man uxplay
" o " uxplay -h
" para conocer el formato y otras ubicaciones posibles). En particular, si su sistema utiliza sistemas de audio PipeWire o video Wayland, es posible que desee agregar "as pipewiresink" o "vs waylandsink" como valores predeterminados al archivo. (La salida de los comandos de terminal "ps waux | grep pulse" o "pactl info" contendrá "pipewire" si su sistema Linux/BSD lo usa).
En Raspberry Pi: si usa Ubuntu 22.10 o anterior, GStreamer debe estar parcheado para usar la decodificación de video por hardware mediante la GPU Broadcom (también recomendado pero opcional para Raspberry Pi OS (Bullseye): use la opción " uxplay -bt709
" si no usa el parche).
Para compilar (fácilmente) la última versión de UxPlay desde el código fuente, consulte la sección Obtención de UxPlay.
Este proyecto es un servidor Unix AirPlay2 Mirror de código abierto GPLv3 para Linux, macOS y *BSD. Inicialmente fue desarrollado por antimof usando código de RPiPlay basado en OpenMAX, que a su vez deriva de AirplayServer, shairplay y playfair. (El sitio antimof ya no participa en el desarrollo, pero publica periódicamente actualizaciones extraídas del nuevo sitio principal de UxPlay).
UxPlay se prueba en varios sistemas, incluidos (entre otros) Debian (10 "Buster", 11 "Bullseye", 12 "Bookworm"), Ubuntu (20.04 LTS, 22.04 LTS, 23.04 (también derivados de Ubuntu, Linux Mint, Pop! _OS), Red Hat y clones (Fedora 38, Rocky Linux 9.2), openSUSE Leap 15.5, Mageia 9, OpenMandriva "ROME", PCLinuxOS, Arch Linux, Manjaro y debería ejecutarse en cualquier sistema Linux. También probado en macOS Catalina y Ventura. (Intel) y Sonoma (M2), FreeBSD 14.0, Windows 10 y 11 (64 bits).
En Raspberry Pi 4 modelo B, se prueba en Raspberry Pi OS (Bullseye y Bookworm) (32 y 64 bits), Ubuntu 22.04 LTS y 23.04, Manjaro RPi4 23.02 y (sin decodificación de video por hardware) en openSUSE 15.5. También probado en Raspberry Pi Zero 2 W, 3 modelo B+ y ahora 5.
Su uso principal es actuar como un AppleTV para duplicar la pantalla (con audio) de clientes iOS/iPadOS/macOS (iPhone, iPod Touch, iPad, computadoras Mac) en la pantalla del servidor de un host que ejecuta Linux, macOS u otro sistema Unix. (y ahora también Microsoft Windows). UxPlay admite el protocolo AirPlay2 de Apple mediante el "Protocolo heredado", pero faltan algunas funciones. (Los detalles de lo que se sabe públicamente sobre el protocolo AirPlay 2 de Apple se pueden encontrar aquí, aquí y aquí; consulte también pyatv, que podría ser un recurso para agregar protocolos modernos). Si bien no hay garantía de que futuras versiones de iOS sigan admitiendo el "Protocolo heredado ", iOS 17 continúa siendo compatible.
El servidor UxPlay y su cliente deben estar en la misma red de área local, en la que también se está ejecutando un servidor Bonjour/Zeroconf mDNS/DNS-SD (sólo el servicio DNS-SD "Service Discovery" es estrictamente necesario, no es necesario que el red local también será del tipo ".local" basado en mDNS). En servidores Linux y BSD Unix, esto suele ser proporcionado por Avahi, a través del servicio avahi-daemon, y está incluido en la mayoría de las distribuciones de Linux (este servicio también puede ser proporcionado por servidores macOS, iOS o Windows).
Las conexiones al servidor UxPlay por parte de clientes iOS/MacOS se pueden iniciar tanto en el modo AirPlay Mirror (que transmite audio AAC comprimido con pérdida mientras se refleja la pantalla del cliente) como en el modo AirPlay Audio alternativo que transmite audio Apple Lossless (ALAC) sin duplicación de pantalla. En el modo Audio , los metadatos se muestran en el terminal uxplay; si se usa la opción -ca
de UxPlay, la portada adjunta también se envía a un archivo
que se actualiza periódicamente y se puede ver con (recargar). visor de gráficos de su elección Es posible cambiar entre los modos Espejo y Audio durante una conexión activa: en el modo Espejo , detenga la duplicación (o cierre la ventana del espejo) e inicie una conexión en modo Audio , vuelva a cambiar iniciando una conexión en modo Espejo ; La visualización artística se detiene/reinicia cuando sale/vuelve a ingresar al modo Audio .
Tenga en cuenta que UxPlay no puede descifrar el video-DRM de Apple (como se encuentra en el contenido de la "aplicación Apple TV" en el cliente) y la aplicación Apple TV no se puede ver usando el modo AirPlay Mirror de UxPlay (solo se transmitirá el audio desprotegido, en AAC). formato), pero UxPlay transmitirá contenido de video y audio de aplicaciones sin DRM como la "aplicación YouTube" en modo Espejo.
Como UxPlay no admite actualmente la transmisión de video AirPlay que no sea Mirror (donde el cliente controla un servidor web en el servidor AirPlay que recibe directamente contenido HLS para evitar que el cliente lo decodifique y vuelva a codificar), use el ícono de video AirPlay en aplicaciones como la aplicación YouTube solo enviarán audio (en formato ALAC sin pérdidas) sin el vídeo que lo acompaña (hay planes para admitir vídeo HLS en futuras versiones de UxPlay)
UxPlay utiliza "complementos" de GStreamer para renderizar audio y vídeo. Esto significa que el vídeo y el audio son compatibles "listos para usar", utilizando una variedad de complementos. AirPlay transmite vídeo en formato h264: la decodificación de gstreamer es independiente de los complementos y utiliza decodificadores h264 de hardware GPU acelerados si están disponibles; de lo contrario, se utiliza la decodificación de software.
VAAPI para gráficos integrados Intel y AMD, NVIDIA con controlador de código abierto "Nouveau"
Con una GPU Intel o AMD, es preferible la decodificación de hardware con el complemento VAAPI gstreamer de código abierto. En principio, los controladores "Nouveau" de código abierto para gráficos NVIDIA también son compatibles: consulte aquí, pero esto requiere que VAAPI se complemente con firmware extraído de los controladores propietarios de NVIDIA.
NVIDIA con controladores propietarios
El complemento nvh264dec
(incluido en gstreamer1.0-plugins-bad desde GStreamer-1.18.0) se puede utilizar para la decodificación de video acelerada en la GPU NVIDIA después de instalar el controlador CUDA libcuda.so
de NVIDIA. Para GStreamer-1.16.3 o anterior, el complemento se llama nvdec
y debe ser creado por el usuario.
Compatibilidad con Video4Linux2 para decodificación de hardware h264 en Raspberry Pi (Pi 4B y anteriores)
Las computadoras Raspberry Pi (RPi) (probadas en Pi 4 Modelo B) ahora pueden ejecutar UxPlay usando decodificación de video por software, pero se prefiere la decodificación h264/h265 acelerada por hardware mediante firmware en la GPU Broadcom 2835 de Pi. UxPlay accede a esto utilizando el complemento GStreamer-1.22 Video4Linux2 (v4l2); Utiliza el códec bcm2835 del módulo del kernel de Linux fuera de línea principal mantenido por Raspberry Pi, hasta ahora solo incluido en el sistema operativo Raspberry Pi, y otras dos distribuciones (Ubuntu, Manjaro) disponibles con Raspberry Pi Imager. (Para GStreamer < 1.22, consulte UxPlay Wiki) .
(Nuevo): Compatibilidad con decodificación de hardware h265 (HEVC) en Raspberry Pi (Pi 4 modelo B y Pi 5)
El apoyo está presente, pero hasta el momento no se han obtenido resultados satisfactorios. Pi modelo 5 solo proporciona decodificación acelerada por hardware (GPU) para video h265, pero no H264, ya que su CPU es lo suficientemente potente para una decodificación satisfactoria de software H264.
La licencia GPLv3 de UxPlay no tiene una "excepción GPL" agregada que permita explícitamente distribuirla en forma compilada cuando se vincula a versiones de OpenSSL anteriores a la v. 3.0.0 (las versiones anteriores de OpenSSL tienen una cláusula de licencia incompatible con la GPL a menos que OpenSSL pueda ser considerada como una "Biblioteca del sistema", que está en *BSD). Muchas distribuciones de Linux tratan a OpenSSL como una "Biblioteca del sistema", pero algunas (por ejemplo, Debian) no lo hacen: en este caso, el problema se resuelve vinculándolo con OpenSSL-3.0.0 o posterior.
Descargue y descomprima UxPlay-master.zip, o (si git está instalado): "git clone https://github.com/FDH2/UxPlay". También puede descargar una versión reciente o anterior que figura en Versiones.
(Adapte estas instrucciones para Linux o *BSD no basados en Debian; para macOS, consulte las instrucciones específicas a continuación). Consulte Solución de problemas a continuación para obtener ayuda ante cualquier dificultad.
Necesita un compilador C/C++ (por ejemplo, g++) con las bibliotecas de desarrollo estándar instaladas. Los sistemas basados en Debian proporcionan un paquete "build-essential" para usar en la compilación de software. También necesita pkg-config: si no lo encuentra " which pkg-config
", instale pkg-config o su reemplazo pkgconf. También asegúrese de que cmake>=3.5 esté instalado: " sudo apt install cmake
" (agregue build-essential
y pkg-config
(o pkgconf
) a esto si es necesario).
Asegúrese de que su distribución proporcione OpenSSL 1.1.1 o posterior y libplist 2.0 o posterior. (Esto significa sistemas basados en Debian 10 "Buster" (por ejemplo, Ubuntu 18.04) o más nuevos; en sistemas Debian 10 "libplist" es una versión anterior, necesita "libplist3".) Si no es así, es posible que deba compilar e instalar estos desde la fuente (consulte las instrucciones al final de este README).
Si tiene una instalación OpenSSL no estándar, es posible que necesite configurar la variable de entorno OPENSSL_ROOT_DIR ( por ejemplo , " export OPENSSL_ROOT_DIR=/usr/local/lib64
" si es ahí donde está instalado). De manera similar, para instalaciones de GStreamer no estándar (o múltiples), establezca la variable de entorno GSTREAMER_ROOT_DIR en el directorio que contiene el directorio ".../gstreamer-1.0/" de la instalación de gstreamer que UxPlay debería usar (si es, por ejemplo, "~ /my_gstreamer/lib/gstreamer-1.0/", establezca esta ubicación con " export GSTREAMER_ROOT_DIR=$HOME/my_gstreamer/lib
").
En una ventana de terminal, cambie los directorios al directorio fuente del código fuente descargado ("UxPlay-*", "*" = "master" o la etiqueta de versión para descargas de archivos zip, "UxPlay" para descargas de "git clone"), luego siga las instrucciones a continuación:
Nota: De forma predeterminada, UxPlay se creará con optimización para la computadora en la que se basa; cuando este no sea el caso, como cuando está empaquetando una distribución, use la opción cmake -DNO_MARCH_NATIVE=ON
.
Si usa X11 Windows en Linux o *BSD, y desea activar/desactivar el modo de pantalla completa presionando una tecla (F11 o Alt_L+Enter), UxPlay debe construirse con una dependencia de X11. A partir de UxPlay-1.59, esto se hará de forma predeterminada SI las bibliotecas de desarrollo X11 están instaladas y detectadas. Instálelos con " sudo apt install libx11-dev
". Si se detecta GStreamer < 1.20, también se realizará una solución necesaria para las aplicaciones para compartir pantalla ( por ejemplo , Zoom).
-DNO_X11_DEPS=ON
.sudo apt install libssl-dev libplist-dev
". ( a menos que necesite compilar OpenSSL y libplist desde la fuente ).sudo apt install libavahi-compat-libdnssd-dev
sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
. (* Omita si creó Gstreamer desde la fuente )cmake .
( Para una compilación más limpia, que es útil si modifica la fuente, reemplácela por " mkdir build; cd build; cmake ..
": luego puede eliminar el contenido del directorio build
si es necesario, sin afectar la fuente). agregue aquí cualquier opción de cmake " -D
" según sea necesario (por ejemplo, -DNO_X11_DEPS=ON
o -DNO_MARCH_NATIVE=ON
).make
sudo make install
(después puedes desinstalar con sudo make uninstall
en el mismo directorio en el que se ejecutó). Esto instala el archivo ejecutable " uxplay
" en /usr/local/bin
(e instala una página de manual en algún lugar estándar como /usr/local/share/man/man1
y archivos README en algún lugar como /usr/local/share/doc/uxplay
). (Si "man uxplay" falla, verifique si $MANPATH está configurado: si es así, la ruta a la página de manual (generalmente /usr/local/share/man/) debe agregarse a $MANPATH .) El ejecutable de uxplay también puede ser se encuentra en el directorio de compilación después del proceso de compilación, si desea realizar una prueba antes de la instalación (en cuyo caso primero se deben instalar los complementos de GStreamer).
**Para aquellos con distribuciones basadas en RPM, también está disponible un archivo de especificaciones de RPM uxplay.spec: consulte Creación de un paquete rpm instalable.
Red Hat, o clones como CentOS (ahora continúa como Rocky Linux o Alma Linux): (sudo dnf install, o sudo yum install) openssl-devel libplist-devel avahi-compat-libdns_sd-devel gstreamer1-devel gstreamer1-plugins-base- devel (+libX11-devel para X11 en pantalla completa) (algunos de estos pueden estar en el repositorio de complementos "CodeReady", llamado "PowerTools" por los clones)
Mageia, PCLinuxOS, OpenMandriva: Igual que Red Hat, excepto por los cambios de nombre: (Mageia) "gstreamer1.0-devel", "gstreamer-plugins-base1.0-devel"; (OpenMandriva) "libopenssl-devel", "gstreamer-devel", "libgst-plugins-base1.0-devel". PCLinuxOS: igual que Mageia, pero usa synaptic (o apt) como administrador de paquetes.
openSUSE: (sudo zypper install) libopenssl-3-devel (anteriormente libopenssl-devel) libplist-2_0-devel (anteriormente libplist-devel) avahi-compat-mDNSResponder-devel gstreamer-devel gstreamer-plugins-base-devel (+ libX11- desarrollo para pantalla completa X11).
Arch Linux ( también disponible como paquete en AUR ): (sudo pacman -Syu) openssl libplist avahi gst-plugins-base.
FreeBSD: (sudo pkg install) libplist gstreamer1. También se debe instalar avahi-libdns o mDNSResponder para proporcionar la biblioteca dns_sd. OpenSSL ya está instalado como biblioteca del sistema.
Los creadores de RPM por primera vez deben instalar primero los paquetes rpm-build y rpmdevtools, luego crear el árbol rpmbuild con " rpmdev-setuptree
". Luego descargue y copie uxplay.spec en ~/rpmbuild/SPECS
. En ese directorio, ejecute " rpmdev-spectool -g -R uxplay.spec
" para descargar el archivo fuente correspondiente uxplay-*.tar.gz
en ~/rpmbuild/SOURCES
("rpmdev-spectool" también puede llamarse simplemente "spectool" ); luego ejecute " rpmbuild -ba uxplay.spec
" (deberá instalar las dependencias requeridas que esto informa). Esto debería crear el paquete RPM uxplay en un subdirectorio de ~/rpmbuild/RPMS
. ( uxplay.spec se prueba en Fedora 38, Rocky Linux 9.2, openSUSE Leap 15.5, Mageia 9, OpenMandriva, PCLinuxOS; se puede modificar fácilmente para incluir listas de dependencias para otras distribuciones basadas en RPM).
A continuación, instale los complementos de GStreamer necesarios con sudo apt install gstreamer1.0-
. Los valores de
requeridos son:
Las distribuciones basadas en Debian dividen algunos de los paquetes de complementos en partes más pequeñas: algunas que también pueden ser necesarias incluyen " gl " para compatibilidad con OpenGL (esto proporciona el videodisco "-vs gliimagesink", que puede ser muy útil en muchos sistemas (incluido Raspberry Pi ), y siempre debe usarse cuando se utiliza la decodificación h264/h265 mediante una GPU NVIDIA), " gtk3 " (que proporciona el disipador de videos "-vs gtksink") y " x " para compatibilidad con X11, aunque es posible que ya estén instalados; " vaapi " es necesario para la decodificación de vídeo h264 acelerada por hardware mediante gráficos Intel o AMD (pero no para su uso con NVIDIA que utilice controladores propietarios). Si el sonido no funciona, es posible que sea necesario instalar los complementos " alsa ", " pulseaudio " o " pipewire ", dependiendo de cómo esté configurado el audio.
En algunos casos, debido a problemas de patentes, la función del complemento libav avdec_aac necesaria para decodificar audio AAC en modo espejo no se proporciona en la distribución oficial: consígala en los repositorios comunitarios para esas distribuciones.
Red Hat, o clones como CentOS (ahora continúa como Rocky Linux o Alma Linux): Instale gstreamer1-libav gstreamer1-plugins-bad-free (+ gstreamer1-vaapi para gráficos Intel/AMD). En Fedora reciente, gstreamer1-libav pasa a llamarse gstreamer1-plugin-libav. Para obtener avdec_aac, instale paquetes desde rpmfusion.org : (obtenga ffmpeg-libs de rpmfusion; en RHEL o clones, pero no en Fedora reciente, obtenga también gstreamer1-libav desde allí).
Mageia, PCLinuxOS, OpenMandriva: Instale gstreamer1.0-libav gstreamer1.0-plugins-bad (+ gstreamer1.0-vaapi para gráficos Intel/AMD). En Mageia, para obtener avdec_aac, instale ffmpeg desde el repositorio "contaminado" (que también proporciona un gstreamer1.0-plugins-bad más completo).
openSUSE: Instale gstreamer-plugins-libav gstreamer-plugins-bad (+ gstreamer-plugins-vaapi para gráficos Intel/AMD). Para obtener avdec_aac, instale los paquetes libav* para openSUSE de Packman "Essentials" ; Recomendación: después de agregar el repositorio Packman, use la opción en la administración de software de YaST para cambiar todos los paquetes del sistema multimedia a Packman).
Arch Linux Instale gst-plugins-good gst-plugins-bad gst-libav (+ gstreamer-vaapi para gráficos Intel/AMD).
FreeBSD: Instale gstreamer1-libav, gstreamer1-plugins, gstreamer1-plugins-* (* = core, good, bad, x, gtk, gl, vulkan, pulse, v4l2, ...), (+ gstreamer1-vaapi para Intel/ Gráficos AMD).
Desde UxPlay-1.64, UxPlay se puede iniciar con opciones leídas desde un archivo de configuración, que será el primero que se encuentre entre (1) un archivo con una ruta dada por la variable de entorno $UXPLAYRC
, (2) ~/.uxplayrc
en la página de inicio del usuario. directorio ("~"), (3) ~/.config/uxplayrc
. El formato es una opción por línea, omitiendo el "-"
inicial de la opción de línea de comando. Las líneas del archivo de configuración que comienzan con "#"
se tratan como comentarios y se ignoran.
Ejecute uxplay en una ventana de terminal . En algunos sistemas, puede especificar el modo de pantalla completa con la opción -fs
, o alternar entre y fuera del modo de pantalla completa con F11 o (manteniendo presionada la tecla Alt izquierda)+Intro. Utilice Ctrl-C (o cierre la ventana) para finalizarlo cuando haya terminado. Si el panel desplegable "Duplicación de pantalla" del cliente iOS no ve el servidor UxPlay, verifique que su servidor DNS-SD (generalmente avahi-daemon) se esté ejecutando: haga esto en una ventana de terminal con systemctl status avahi-daemon
. Si esto muestra que avahi-daemon no se está ejecutando, contrólelo con sudo systemctl [start,stop,enable,disable] avahi-daemon
(en sistemas que no son systemd, como *BSD, use sudo service avahi-daemon [status, start, stop, restart, ...]
). Si se ve UxPlay, pero el cliente no logra conectarse cuando se selecciona, puede haber un firewall en el servidor que impide que UxPlay reciba solicitudes de conexión del cliente a menos que se abran algunos puertos de red: si hay un firewall activo, abra también el puerto UDP 5353 (para consultas mDNS) que necesita Avahi . Consulte Solución de problemas a continuación para obtener ayuda con este u otros problemas.
A diferencia de un Apple TV, el servidor UxPlay no requiere de forma predeterminada que los clientes se "emparejen" inicialmente con él utilizando un código PIN mostrado por el servidor (después de lo cual el cliente "confía" en el servidor y no necesita repetir esto). Desde v1.67, Uxplay ofrece dicha "autenticación de pin" como opción: consulte " -pin
" y " -reg
" en Uso para obtener más detalles, si desea utilizarlo. Algunos clientes con MDM (Administración de dispositivos móviles, a menudo presente en dispositivos propiedad del empleador) deben usar autenticación mediante pin: UxPlay proporcionará esto incluso cuando se ejecute sin la opción de pin.
De forma predeterminada, UxPlay está bloqueado para su cliente actual hasta que ese cliente interrumpe la conexión; desde UxPlay-1.58, la opción -nohold
modifica este comportamiento de modo que cuando un nuevo cliente solicita una conexión, elimina el cliente actual y toma el control. UxPlay 1.66 introduce un mecanismo ( -restrict
, -allow
, -block
) para controlar qué clientes pueden conectarse, utilizando su "ID de dispositivo" (que en los dispositivos Apple parece ser inmutable).
En el modo Espejo, GStreamer puede elegir entre dos métodos para reproducir video con el audio que lo acompaña: antes de UxPlay-1.64, las transmisiones de video y audio se reproducían lo antes posible después de su llegada (el método " sync=false " de GStreamer) , con un reloj interno GStreamer utilizado para intentar mantenerlos sincronizados. A partir de UxPlay-1.64, el otro método (el modo " sync=true " de GStreamer), que utiliza marcas de tiempo en las transmisiones de audio y video enviadas por el cliente, es el nuevo valor predeterminado . En hosts UxPlay de baja potencia de decodificación (como los modelos Raspberry Pi Zero W o 3 B+), esto eliminará cuadros de video que no se pueden decodificar a tiempo para reproducirse con el audio, lo que hará que el video se entrecorte, pero aún así esté sincronizado.
El método anterior que no elimina fotogramas de vídeo tardíos funcionó bien en sistemas más potentes y todavía está disponible con la opción UxPlay " -vsync no
"; este método está adaptado a la "transmisión en vivo" y puede ser mejor cuando se usa UxPlay como segundo monitor para una computadora Mac, por ejemplo, mientras que el nuevo método predeterminado basado en marca de tiempo es mejor para ver un video, para mantener los movimientos de los labios y las voces. sincronizado. (Sin el uso de marcas de tiempo, el video eventualmente quedará rezagado con respecto al audio si no se puede decodificar lo suficientemente rápido: la decodificación de video acelerada por hardware ayudó a evitar esto anteriormente, cuando no se usaban marcas de tiempo).
-async
opción basada. (Un ejemplo podría ser si desea seguir las letras de Apple Music en el cliente mientras escucha un sonido superior en el servidor UxPlay). Esto retrasa el vídeo en el cliente para que coincida con el audio en el servidor, por lo que genera un ligero retraso antes de que una pausa o cambio de pista iniciado en el cliente tenga efecto en el audio reproducido por el servidor. El control de volumen de AirPlay atenúa el volumen (ganancia) hasta -30 dB: el rango de decibeles -30:0 se puede reescalar desde Bajo : 0 o Bajo : Alto , usando la opción -db
("-db Bajo " o "-db Bajo : Alto "), Bajo debe ser negativo. El cambio de escala es lineal en decibeles. Tenga en cuenta que el formato de audio de GStreamer "recortará" cualquier ganancia de audio por encima de +20 dB, así que mantenga Alto por debajo de ese nivel. La opción -taper
proporciona un perfil de control de volumen de AirPlay "cónico" que algunos usuarios pueden preferir.
Las opciones -vsync y -async también permiten un ajuste opcional de retardo de audio positivo (o negativo) en milisegundos para un ajuste fino: -vsync 20.5
retrasa el audio con respecto al vídeo en 0,0205 segundos; un valor negativo lo adelanta.)
Es posible que descubra que el vídeo mejora con la configuración -fps 60, que permite que algunos vídeos se reproduzcan a 60 fotogramas por segundo. (Puede ver qué velocidad de fotogramas se transmite realmente usando -vs fpsdisplaysink y/o -FPSdata). Al usar esto, debe usar la opción predeterminada de sincronización basada en marca de tiempo -vsync
.
Desde UxPlay-1.54, puede mostrar la "Cubierta" adjunta de fuentes como Apple Music en modo Solo audio (ALAC): ejecute " uxplay -ca
" en segundo plano, luego ejecute un visor de imágenes con recarga automática. característica: un ejemplo es "feh": ejecute " feh -R 1
" en primer plano; termine feh y luego Uxplay con " ctrl-C fg ctrl-C
".
De forma predeterminada, GStreamer utiliza un algoritmo para buscar el mejor "videodisipador" (término de GStreamer para un controlador de gráficos para mostrar imágenes) para usar. Puedes anular esto con la opción uxplay -vs
. Los disipadores de video disponibles dependen de su sistema operativo y hardware de gráficos: use " gst-inspect-1.0 | grep sink | grep -e video -e Video -e image
" para ver qué hay disponible. Algunas posibilidades en Linux/*BSD son:
gliimagesink (OpenGL), waylandsink
xvimagesink , ximagesink (X11)
kmssink , fbdevsink (gráficos de consola sin X11)
vaapisink (para gráficos acelerados por hardware Intel/AMD); para gráficos de hardware NVIDIA (con CUDA), use gliimagesink combinado con " -vd nvh264dec
" (o "nvh264sldec", una nueva variante que se convertirá en "nvh264dec" en GStreamer-1.24).
Si el servidor es "sin cabeza" (sin monitor conectado, solo reproduce audio), use -vs 0
.
GStreamer también busca el mejor "audiosink"; anule su elección con -as
. Las opciones en Linux incluyen pulsesink, alsasink, pipewiresink, oss4sink; vea lo que está disponible con gst-inspect-1.0 | grep sink | grep -e audio -e Audio
.
Un problema común implica que GStreamer intente utilizar decodificación de video h264 de hardware acelerado incorrectamente configurado o ausente (por ejemplo, VAAPI). Pruebe " uxplay -avdec
" para forzar la decodificación de vídeo por software; Si esto funciona, puede intentar reparar la decodificación de video por hardware acelerada si lo necesita, o simplemente desinstalar el complemento GStreamer vaapi.
Consulte Uso para obtener más opciones de tiempo de ejecución.
Para video Framebuffer (para Raspberry Pi OS "Lite" y otras distribuciones que no sean X11), use el videoink KMS "-vs kmssink" (el videoink framebuffer de DirectFB "dfbvideosink" está roto en el Pi y tiene fallas de segmentación). En este caso, debes usar explícitamente la opción "-vs kmssink", ya que sin ella, autovideosink no encuentra el videosink correcto.
Raspberry Pi 5 no proporciona decodificación H264 por hardware (y no la necesita).
Pi Zero 2 W, 3 Modelo B+ y 4 Modelo B deben usar decodificación H264 por hardware mediante la GPU Broadcom, pero requiere un módulo de kernel fuera del convencional bcm2835_codec mantenido en el árbol del kernel de Raspberry Pi; Las distribuciones que se sabe que lo suministran incluyen Raspberry Pi OS, Ubuntu y Manjaro-RPi4. Utilice la decodificación de software (opción -avdec) si este módulo no está disponible.
Uxplay utiliza el complemento Video4Linux2 (v4l2) de GStreamer-1.22 y posteriores para acceder a la GPU, si se utiliza la decodificación H264 por hardware. Esto debería suceder automáticamente. Se puede utilizar la opción -v4l2, pero normalmente es mejor dejar que GStreamer encuentre el mejor canal de vídeo por sí solo.
En distribuciones más antiguas (GStreamer < 1.22), el complemento v4l2 necesita un parche: consulte UxPlay Wiki. El sistema operativo Raspberry Pi heredado (Bullseye) tiene un GStreamer-1.18.4 parcialmente parcheado que necesita la opción uxplay -bt709 (y no use -v4l2); En este caso, es mejor aplicar el parche completo de UxPlay Wiki.
Para el sistema operativo Raspberry Pi (Buster) de "doble legado", no existe ningún parche para GStreamer-1.14. En su lugar, primero cree un GStreamer-1.18.6 completamente nuevo desde el código fuente siguiendo estas instrucciones antes de compilar UxPlay.
Raspberry Pi 3 Modelo B+ con un sistema operativo de 32 bits también puede acceder a la GPU con el complemento GStreamer OMX (use la opción " -vd omxh264dec
"), pero esto no funciona con el firmware de Pi 4 Modelo B. La compatibilidad con OMX se eliminó del sistema operativo Raspberry Pi (Bullseye), pero está presente en Buster.
El video H265 (4K) es compatible con decodificación de hardware mediante la GPU Broadcom en los modelos Raspberry Pi 5, así como en Raspberry Pi 4 modelo B. Si bien GStreamer parece hacer uso de esta decodificación de hardware, la velocidad de renderizado de video 4K de UxPlay es satisfactoria. Estos modelos de Raspberry Pi aún no se han logrado. Se requiere la opción "-h265" para activar el soporte h265. En este modo se prefiere una conexión Ethernet por cable (y puede ser requerida por el cliente).
Incluso con la decodificación de vídeo GPU, los modelos de menor potencia pueden eliminar algunos fotogramas para mantener el audio y el vídeo sincronizados mediante marcas de tiempo. En el sistema operativo Legacy Raspberry Pi (Bullseye), las "Opciones de rendimiento" de raspi-config permiten especificar cuánta memoria asignar a la GPU, pero esta configuración parece estar ausente en Bookworm (pero aún se puede configurar, por ejemplo, en 128 MB agregando una línea "gpu_mem=128" en /boot/config.txt). Un Pi Zero 2 W (que tiene 512 MB de memoria) funcionó bien cuando se probó en Bullseye o Bookworm Lite de 32 bits con 128 MB asignados a la GPU (el valor predeterminado parece ser 64 MB).
Las opciones básicas de uxplay para R Pi son uxplay [-vs
. La opción
= glimagesink
a veces resulta útil. Con el compositor de video Wayland, use
= waylandsink
. Con video framebuffer, use
= kmssink
.
ssh user@remote_host
export DISPLAY=:0
nohup uxplay [options] > FILE &
El sonido y el vídeo se reproducirán en el host remoto; "nohup" mantendrá uxplay ejecutándose si se cierra la sesión ssh. La salida del terminal se guarda en ARCHIVO (que puede ser /dev/null para descartarla)
Nota: Una función de servidor nativo de AirPlay está incluida en MacOS 12 Monterey, pero está restringida al hardware reciente. UXPlay puede ejecutarse en sistemas MacOS más antiguos que no podrán ejecutar Monterey, o pueden ejecutar Monterey pero no AirPlay.
Estas instrucciones para macOS suponen que se instalan las herramientas de desarrollador de la línea de comandos XCode (si se instala Xcode, abra el terminal, escriba "sudo xcode-select --install" y acepte las condiciones).
También se supone que CMake> = 3.13 está instalado: esto se puede hacer con los administradores de paquetes MacPorts ( sudo port install cmake
), homebrew ( brew install cmake
) o una descarga de https://cmake.org/download/. También instale git
si lo usa para obtener UXPlay.
Siguiente instalar libplist y openssl-3.x. Tenga en cuenta que las versiones estáticas de estas bibliotecas se utilizarán en las compilaciones de macOS, para que puedan desinstalarse después de construir UXPlay, si lo desea.
Si usa HomeBrew: brew install libplist openssl@3
Si usa MacPorts: sudo port install libplist-devel openssl3
De lo contrario, construya liblist y openssl a partir de la fuente: consulte las instrucciones cerca del final de este readme; Requiere herramientas de desarrollo (AutoConf, Automake, Libtool, etc. ) para instalar.
A continuación, obtenga el último lanzamiento de MacOS de GStreamer-1.0.
Uso de GSTreamer "oficial" (recomendado tanto para MacPorts como para usuarios caseros) : instale la versión de Gstreamer para macOS en https://gstreamer.freedesktop.org/download/. (Esta versión contiene su propio PKG-Config, por lo que no tiene que instalar uno). Instale los paquetes GStreamer-1.0 y GStreamer-1.0-Devel. Después de descargar, haga clic en Cambiarlos para instalar (se instalan en /library/frameworks/gstreamer.framework). Los usuarios de HomeBrew o MacPorts no deben instalar (o deben desinstalar) el GStreamer suministrado por su Administrador de paquetes, si usan la versión "oficial".
Uso de HomeBrew's GStreamer : PKG-Config es necesario: ("Brew Instale PKG-Config Gstreamer"). Esto hace que una gran cantidad de paquetes adicionales sea instalado por Homebrew como dependencias. La instalación Homebrew Gstreamer se ha reelaborado recientemente en una sola "Fórmula" llamada gstreamer
, que ahora funciona sin necesidad de que se establezca GST_PLUGIN_PATH en el entorno. HomeBrew instala GStreamer a (HOMEBREW)/lib/gstreamer-1.0
Where (HOMEBREW)/*
IS /opt/homebrew/*
en Apple Silicon Macs, y /usr/local/*
en Intel Macs; No coloque ningún complemento adicional no homebreo (que se construya allí) allí, y en su lugar, configure GST_PLUGIN_PATH para señalar su ubicación (Homebrew no suministra un GStreamer completo, pero parece tener todo lo necesario para UXPlay).
Uso de GStreamer instalado desde MacPorts : no se recomienda esto, ya que actualmente el MacPorts Gstreamer es antiguo (v1.16.2), sin mantenimiento y está construido para usar X11:
(Si realmente desea usar el MacPorts GStreamer-1.16.2, instale pkgconf ("sudo puerto instalar pkgconf"), entonces "sudo puerto instalar gstreamer1-gst-plugins-base gstreamer1-gst-plugins-Good gstreamer1-gst-plugins -bad gstreamer1-gst-libav ". Para el soporte x11 en macOS, compile uxplay usando una opción especial cmake -DUSE_X11=ON
, y ejecutarlo desde un terminal de Xquartz con -vs ximagesink; Mac no retina más antiguas requiere una resolución más baja cuando se usa X11: uxplay -s 800x600
.)
Después de instalar GStreamer, cree e instale UXPlay: abra un terminal y cambie en el directorio de origen UXPlay ("UXPlay-Master" para descargas ZipFile, "UxPlay" para descargas "Git Clone") y construya/instale con "CMake.; Hacer; sudo haz instalar "(igual que para Linux).
Ejecutar UXPlay mientras verifica las advertencias de Gstreamer (haz esto con "exportar gst_debug = 2" antes de ejecutar uxplay) revela que con el valor predeterminado (ya que uxplay 1.64) se usa de marcas de tiempo para la sincronización de video, se están dejando caer muchos marcos de video (solo en macos),,,, Quizás debido a otro error (sobre Videometa) que aparece en las advertencias de Gstreamer. Recomendación: use la nueva opción UXPlay "No TimeStamp" -vsync no
" (puede agregar una línea" VSYNC NO "en el archivo de configuración de UXPlayRC).
En MacOS con esta instalación de GStreamer, los únicos videos disponibles parecen ser GlimagegeLink (elección predeterminada hecha por AutovideOsink) y OSXVideOsink. El título de la ventana no muestra el nombre del servidor AirPlay, pero la ventana está visible para aplicaciones de intercambio de pantalla (por ejemplo, Zoom). El único Audiosink disponible parece ser Osxaudiosink.
La opción -nc siempre se usa, ya sea que se seleccione o no. Esta es una solución para un problema con los videos de Gstreamer en MacOS: si la tubería GStreamer se destruye mientras la ventana del espejo aún está abierta, se produce una Segfault.
En el caso de GlimageSink, la configuración de resolución "-S WXH" no afecta el tamaño de la ventana del espejo OpenGL (pequeño) (pequeño), pero la ventana se puede ampliar usando el mouse o la pista de seguimiento. Por el contrario, una ventana creada con "-VS OSXVideOsink" es inicialmente grande, pero tiene la relación de aspecto incorrecta (imagen estirada); En este caso, la relación de aspecto cambia cuando el ancho de la ventana se cambia arrastrando su lado; La opción -vs "osxvideosink force-aspect-ratio=true"
se puede usar para que la ventana tenga la relación de aspecto correcta cuando se abre por primera vez.
Descargue e instale Bonjour SDK para Windows v3.0 . Puede descargar el SDK sin ningún registro en Softpedia.com, o obtenerlo del sitio oficial de Apple https://developer.apple.com/download (Apple le hace registrarse como desarrollador para acceder a él desde su sitio). Esto debería instalar el Bonjour SDK como C:Program FilesBonjour SDK
.
(Esto es para ventanas de 64 bits; una compilación para ventanas de 32 bits debería ser posible, pero no se prueba). Se utilizará el entorno de compilación MSYS2 similar a UNIX: descargue e instale MSYS2 desde el sitio oficial https: // www .msys2.org/. Acepte la ubicación de instalación predeterminada C:mysys64
.
Los paquetes MSYS2 se instalan con una variante del Administrador de paquetes "Pacman" utilizado por Arch Linux. Abra un terminal "MSYS2 MINGW64" desde la pestaña MSYS2 en el menú Inicio de Windows y actualice la nueva instalación de MSYS2 con "Pacman -Syu". Luego instale el compilador MINGW-64 y CMake
pacman -S mingw-w64-x86_64-cmake mingw-w64-x86_64-gcc
El compilador con todas las dependencias requeridas se instalará en el directorio MSYS64, con la ruta predeterminada C:/msys64/mingw64
. Aquí simplemente construiremos UXPlay a partir de la línea de comandos en el entorno MSYS2 (esto usa " ninja
" en lugar de " make
" para el sistema de compilación).
Descargue el último UXPlay de GitHub (para usar git
, instálelo con pacman -S git
, luego " git clone https://github.com/FDH2/UxPlay
") , luego instale las dependencias de UXPlay (OpenSSL ya está instalado con MSYS2):
pacman -S mingw-w64-x86_64-libplist mingw-w64-x86_64-gstreamer mingw-w64-x86_64-gst-plugins-base
Si está probando un sistema de compilación de Windows diferente, las versiones MSVC de GStreamer para Windows están disponibles en el sitio oficial de GStreamer, pero solo se ha probado la compilación MingW de 64 bits en MSYS2.
CD al directorio de origen UXPlay, luego " mkdir build
" y " cd build
". El proceso de compilación supone que el SDK de Bonjour está instalado en C:Program FilesBonjour SDK
. Si está en otro lugar, establezca la variable Enviroment Bonjour_Sdk_Home para señalar a su ubicación. Luego construya uxplay con
cmake ..
ninja
Suponiendo que no hay error en ninguno de estos, habrá construido el ejecutable UXPlay uxplay.exe en el directorio actual ("construir"). Las características "sudo make install" y "sudo make desinstall" ofrecidas en las otras compilaciones no están disponibles en Windows; En su lugar, el entorno MSYS2 tiene /mingw64/...
disponible, y puede instalar el ejecutable Uxplay.exe en C:/msys64/mingw64/bin
(más manzana y documentación en C:/msys64/mingw64/share/...
) con
cmake --install . --prefix /mingw64
Para poder ver la manzana, debe instalar el visor de la mano de la mano con " pacman -S man
".
Para ejecutar uxplay.exe, debe instalar algunos paquetes de complementos Gstreamer con pacman -S mingw-w64-x86_64-gst-
, donde los requeridos tienen
dado por
Otros posibles paquetes de complementos MSYS2 Gstreamer que puede usar se enumeran en los paquetes MSYS2.
También deberá otorgar permiso al ejecutable UXPlay UXPlay.exe para acceder a los datos a través del firewall de Windows. Se puede ofrecer automáticamente la opción de hacerlo cuando ejecuta UXPlay por primera vez, o es posible que deba hacerlo utilizando la configuración de Windows-> Actualización y seguridad-> Windows Security-> Firewall & Network Protection-> Permitir una aplicación a través del firewall . Si su protección contra el virus marca UXPlay.exe como "sospechosa" (pero sin una firma de malware verdadera), es posible que deba darle una excepción.
Ahora pruebe ejecutando " uxplay
" (en una ventana de terminal MSYS2). Si necesita especificar el Audiosink, hay dos opciones principales en Windows: el complemento DirectSound anterior " -as directsoundsink
" y el complemento API de la sesión de audio de Windows (WASAPI) más moderno " -as wasapisink
", que admite opciones adicionales como
uxplay -as 'wasapisink device=""'
Donde
especifica un dispositivo de audio disponible por su GUID, que se puede encontrar usando " gst-device-monitor-1.0 Audio
":
tiene una forma como {0.0.0.00000000}.{98e35b2b-8eba-412e-b840-fd2c2492cf44}
. Si no se especifica " device
", se utiliza el dispositivo de audio predeterminado.
Si desea especificar el videos en la opción Usando la opción -vs
, algunas opciones para
son d3d11videosink
, d3dvideosink
, glimagesink
, gtksink
.
-vs "d3d11videosink fullscreen-toggle-mode=property fullscreen=true"
, o obtener la capacidad de alternar y salir del modo Fullscreen utilizando la tecla ALT-Inter Combinación con la opción -vs "d3d11videosink fullscreen-toggle-mode=alt-enter"
. Por conveniencia, estas opciones se agregarán si solo se usa -vs d3d11videosink
con o sin la opción de pantalla completa "-fs". (Los usuarios de Windows pueden desear agregar " vs d3d11videosink
" (sin inicial " -
") al archivo de opciones de inicio de UXPlay; consulte "Man uxplay" o "uxplay -h".) El ejecutable uxplay.exe también se puede ejecutar sin el entorno MSYS2, en el terminal de Windows, con C:msys64mingw64binuxplay
.
Opciones:
-
") en el archivo de inicio UXPlay (ya sea una variable de entorno $UXPLAYRC
, o ~/.uxplayrc
o ~/.config/uxplayrc
); Las líneas que comienzan con " #
" se tratan como comentarios e ignoradas. Opciones de línea de comando Opciones de reemplazo en el archivo de inicio.-n server_name (predeterminado: uxplay); server_name@ hostname será el nombre que aparece ofreciendo servicios de AirPlay a su iPad, iPhone, etc., donde el nombre de host es el nombre del servidor que ejecuta UXPlay. Este también será el nombre que se muestra encima de la ventana de pantalla del espejo (x11).
-nh no agregue "@ hostname " al final del nombre del servidor AirPlay.
-H265 Active "ScreenMultiCodec" Support (AirPlay "Características" Bit 42) para aceptar el video H265 (4K/HEVC) además del video H264 (1080p) en el modo de espejo de pantalla. Cuando se usa esta opción, se crean dos "tuberías de video" (una para H264, una para H265). Si algún complemento GStreamer en la tubería son específicos para H264 o H265, la versión correcta se utilizará en cada tubería. Se prefiere una conexión Ethernet de cliente de cliente cableado sobre WiFi para el video 4K, y el cliente podría requerir. Solo los dispositivos Apple recientes (M1/M2 Mac o iPads, y algunos iPhones) pueden enviar un video H265 si se solicita un resolución "-S WXH" con H> 1080. La opción "-H265" cambia la resolución predeterminada (opción "-s") de 1920x1080 a 3840x2160, y deja la opción máxima de cuadros máximo predeterminado ("-fps") a 30 fps.
-Pin [NNNN] : (desde V1.67) Use autenticación "PIN" de estilo Apple (una vez) cuando un nuevo cliente se conecta por primera vez: se muestra un código PIN de cuatro dígitos en la terminal y el cliente La pantalla muestra un indicador de inicio de sesión para que esto se ingrese. Cuando se usa "-pin" por sí mismo, se elige un nuevo código PIN aleatorio para cada autenticación; Si se usa "-pin nnnn" (por ejemplo, "-pin 3939"), esto establecerá un código fijo sin cambios. La autenticación agrega el servidor a la lista del cliente de "Servidores de confianza" y el cliente no necesitará reautorizar siempre que las claves públicas del cliente y el servidor permanezcan sin cambios. (De manera predeterminada, desde V1.68, la clave pública del servidor se genera desde la dirección MAC, que se puede cambiar con la opción -m; consulte la opción -key para un método alternativo de generación de claves). (Agregue una línea "PIN" en el archivo de inicio UXPlay si desea que el servidor UXPlay use el protocolo de autenticación PIN).
-reg [ nombre de archivo ] : (desde v1.68). Si se usa "-Pin", esta opción mantiene un registro de "clientes de confianza" autorizados en PIN en $ home/.uxplay.register (o opcionalmente, en el nombre de archivo ). Sin esta opción, los clientes que devuelven que se salten la autorización PIN se confían y no se verifican. Esta opción puede ser útil si UXPlay se usa en un entorno más público, para registrar los detalles del cliente; El registro es texto, una línea por cliente, con la clave pública del cliente (formato base-64), ID de dispositivo y nombre del dispositivo; Comentar fuera (con "#") o eliminar una línea desregistra al cliente correspondiente (ver opciones -restrict, -block, y permiso para obtener más formas de controlar el acceso al cliente). (Agregue una línea "reg" en el archivo de inicio si desea usar esta función).
-vsync [x] (en modo espejo :) Esta opción ( ahora el predeterminado ) usa marcas de tiempo para sincronizar el audio con video en el servidor, con un retraso de audio opcional en milisegundos (decimales) ( x = "20.5" significa retraso de 0.0205 segundos: Se permiten retrasos positivos o negativos menos de un segundo). Se necesita en sistemas de baja potencia, como Raspberry Pi sin decodificación de video de hardware.
-vsync NO (en modo espejo :) Esto desactiva la sincronización de audio-video basada en la marca de tiempo, restaurando el comportamiento predeterminado antes de UXPlay-1.64. Los sistemas de escritorio estándar parecen funcionar bien sin el uso de marcas de tiempo: este modo es apropiado para la "transmisión en vivo", como el uso de UXPlay como segundo monitor para una computadora Mac, o monitorear una cámara web; Con él, no se dejan caer marcos de video.
-sync [x] (en modo de solo audio (ALAC) :) Esta opción utiliza marcas de tiempo para sincronizar el audio en el servidor con video en el cliente, con un retraso de audio opcional en milisegundos (decimales) ( x = "20.5" significa 0.0205 Seconds Retraso: se permiten retrasos positivos o negativos inferiores a un segundo). Debido a que el cliente agrega un retraso de video para tener en cuenta la latencia, el servidor en el modo async agrega un retraso de audio equivalente, lo que significa que los cambios de audio como una pausa o una El cambio de pista no entrará en vigencia de inmediato. En principio, esto podría mitigarse utilizando la configuración de latencia de audio -al
para cambiar la latencia (valor predeterminado 0.25 segundos) que el servidor informa al cliente, pero actualmente cambia esto no parece tener ningún efecto .
-Async no . Este es el comportamiento predeterminado en modo de solo audio, pero esta opción puede ser útil como una opción de línea de comandos para apagar una opción -async
establecida en un archivo de configuración "UXPlayRC".
-db bajo [: alto ] Rescala la atenuación de control de volumen de avión (ganancia) de -30dB: 0dB a bajo : 0dB o bajo : alto . El límite inferior bajo debe ser negativo (atenuación); El límite superior alto puede ser un signo. (GStreamer restringe el volumen de augsación por alto para que no pueda exceder +20dB). El reescalado es "plano", de modo que para -db -50: 10, un cambio en la atenuación de la airplay en -7dB se traduce a una atenuación de -7 x (60/30) = -14db y el volumen máximo (avión 0dB) es un aumento de 10dB, y el airplay -30dB se convertiría en -50dB. Tenga en cuenta que el valor mínimo de AirPlay (-30dB exactamente) se traduce a "silencio".
-Taper proporciona un perfil de control de volumen de avión "cónico" (que coincide con el llamado "Dasl-Tapering" en Shairport-Sync): cada vez la longitud del control deslizante de volumen (o el número de pasos por encima del silencio, donde 16 pasos = completos El volumen) se reduce en un 50%, el volumen percibido se reduce a la mitad (una atenuación de 10dB). (Esto se modifica a volúmenes bajos, para usar el volumen "no superado" si es más fuerte).
-S WXH EG -S 1920X1080 (= "1080p"), las resoluciones predeterminadas de ancho y altura en píxeles para video H264. (El valor predeterminado se convierte en 3840x2160 (= "4k") cuando se usa la opción -h265). Esta es solo una solicitud realizada al cliente AirPlay, y tal vez no será la resolución final que obtenga. W y H son números enteros con cuatro dígitos o menos. Tenga en cuenta que el tamaño de píxel de altura es el controlador utilizado por el cliente para determinar el formato de transmisión; El ancho se ajusta dinámicamente a la forma de la imagen (formato de retrato o paisaje, dependiendo de cómo se mantenga un iPad, por ejemplo).
-s wxh@r como se indicó anteriormente, pero también informa al cliente de AirPlay sobre la tasa de actualización de la pantalla de la pantalla. El valor predeterminado es r = 60 (60 Hz); R debe ser un número entero inferior a 256.
-O enciende una opción "exagerada" para la ventana de visualización. Esto reduce la resolución de la imagen mediante el uso de algunos de los píxeles solicitados por opción -s wxH (o sus valores predeterminados 1920x1080) agregando un marco límite vacío de píxeles no utilizados (que se perdería en una pantalla de pantalla completa que exagera, y no está Mostrado por Gstreamer). Recomendación: no use esta opción a menos que haya alguna razón especial para usarla.
-FS utiliza el modo de pantalla completa, pero solo funciona con X11, Wayland, Vaapi y D3D11 (Windows).
-P le permite seleccionar los puertos de red utilizados por UXPlay (estos deben abrirse si el servidor está detrás de un firewall). Por sí mismo, -p establece puertos "heredados" TCP 7100, 7000, 7001, UDP 6000, 6001, 7011. -PN (por ejemplo, -p 35000) establece los puertos TCP y UDP n, n+1, n+2. -P n1, n2, n3 (valores separados por comas) establece cada puerto por separado; -P N1, N2 establece puertos N1, N2, N2+1. -P TCP N o -P UDP N establece solo los puertos TCP o UDP. Los puertos deben estar en el rango [1024-65535].
Si no se usa la opción -p, los puertos se eligen dinámicamente (al azar), que no funcionará si se está ejecutando un firewall.
-AVDEC Fuerzas del uso del software H264 Decodificación utilizando el elemento GStreamer AVDEC_H264 (decodificador Libav H264). Esta opción debe evitar que AutovideOsink elija un complemento de videos de videos acelerado como Vaapisink.
-VP Parser elige el elemento analizador H264 de la tubería GStreamer, el valor predeterminado es H264Parse. El uso de citas "..." permite agregar opciones.
-Vd Decoder elige el elemento decodificador H264 de la tubería GStreamer, en lugar del valor predeterminado "decodebin" que lo elige para usted. La decodificación del software es realizada por AVDEC_H264; Varios decodificadores de hardware incluyen: VAAPIH264DEC, NVDEC, NVH264DEC, V4L2H264DEC (estos requieren que el hardware apropiado esté disponible). El uso de citas "..." permite incluir algunos parámetros con el nombre del decodificador.
-VC Converter elige el elemento VideoConverter de GStreamer Pipeline, en lugar del valor predeterminado "VideoConvert". Al usar Video4Linux2 Hardware Decoding mediante una GPU, -vc v4l2convert
también usará la GPU para la conversión de video. El uso de citas "..." permite que algunos parámetros se incluyan con el nombre del convertidor.
-VS VideoSink elige el VideoSink de GStreamer, en lugar del valor predeterminado "AutovideOsink" que lo elige para usted. Some videosink choices are: ximagesink, xvimagesink, vaapisink (for intel graphics), gtksink, glimagesink, waylandsink, osxvideosink (for macOS), kmssink (for systems without X11, like Raspberry Pi OS lite) or fpsdisplaysink (which shows the streaming framerate in fps). El uso de citas "..." permite que algunos parámetros se incluyan con el nombre de la videos. Por ejemplo, el modo de pantalla completa es compatible con el complemento Vaapisink, y se obtiene usando -vs "vaapisink fullscreen=true"
; Esto también funciona con waylandsink
. La sintaxis de tales opciones es específica para un complemento dado (ver documentación de GStreamer), y algunas opciones de videosink podrían no funcionar en su sistema.
-vs 0 suprime la visualización de video transmitido. En el modo Mirror, la pantalla del cliente todavía se refleja a una velocidad reducida de 1 cuadro por segundo, pero no se representa o se muestra. Esta opción siempre debe usarse si el servidor no tiene "pantalla de cabeza" (sin pantalla adjunta para mostrar un video), y solo se usa para hacer audio, que será un audio con pérdida con pérdida Audio de Apple Lossless en modo AirPlay solo de audio.
-v4l2 Configuración de video para hardware H264 Decodificación de video en la GPU por Video4Linux2. Equivalente a -vd v4l2h264dec -vc v4l2convert
.
-BT709 Una solución alternativa para la falla del complemento Video4Linux2 anterior para reconocer el uso de Apple de una variante de "color de gama completa" poco común (pero permitido) del estándar de color BT709 para TV digital. GSTreamer -.20.4 ya no necesita esto y los backports de él.
-RPI equivalente a "-v4l2" (no válido para Raspberry Pi Model 5, y eliminado en UXPlay 1.67)
-rpigl equivalente a "-rpi -vs GlimagegeSink". (Eliminado desde UXPlay 1.67)
-rpifb equivalente a "-rpi -vs kmssink" (eliminado desde uxplay 1.67)
-rpiwl equivalente a "-rpi -vs waylandsink". (Eliminado desde UXPlay 1.67)
-Man Audiosink elige el Audiosink Gstreamer, en lugar de dejar que AutoAudiosink lo elija. Algunas opciones de Audiosink son: PulSesink, Alsink, Pipewiresink, OSSSink, OSS4Sink, Jackaudiosink, Osxaudiosink (para macOS), Wasapisink, DirectSoundsink (para Windows). El uso de cotizaciones "..." podría permitir algunos parámetros opcionales (por ejemplo -as "alsasink device=..."
para especificar un dispositivo de salida no definitivo). La sintaxis de tales opciones es específica para un complemento dado (ver documentación de GStreamer), y algunas opciones de Audiosink podrían no funcionar en su sistema.
-Me 0 (o simplemente -a ) suprime la reproducción del audio transmitido, pero muestra video transmitido.
-al x especifica una latencia de audio x en segundos (decimales) en solo audio (ALAC), que se informa al cliente. Se permiten valores en el rango [0.0, 10.0] segundos y se convertirán en un número entero de microsegundos. El valor predeterminado es 0.25 segundos (250000 USEC). (Sin embargo, el cliente parece ignorar esta latencia reportada, por lo que esta opción parece no funcional).
-Ca FileName proporciona un archivo (donde el nombre de archivo puede incluir una ruta completa) utilizado para la salida de "portada" (de Apple Music, etc. ,) en el modo ALAC de solo audio. Este archivo se sobrescribe con la última portada a medida que llega. La portada (formato JPEG) se descarta si no se usa esta opción. Use con un visor de imágenes que vuelve a cargar la imagen si cambia, o regularmente ( por ejemplo, una vez por segundo). Para lograr esto, ejecute " uxplay -ca [path/to/]filename &
" en el fondo, luego ejecute el visor de imágenes en primer plano. Ejemplo, usando feh
como visor: ejecute " feh -R 1 [path/to/]filename
" (en la misma ventana terminal en la que UXPlay se colocó en el fondo). Para dejar de fumar, use ctrl-C fg ctrl-C
para terminar el visor de imágenes, traiga uxplay
en primer plano y termínelo también.
-Reset n establece un límite de n fallas consecutivas de tiempo de espera del cliente para responder a las solicitudes NTP desde el servidor (se envían cada 3 segundos para verificar si el cliente todavía está presente y sincronizarlo). Después de las fallas de N , se presumirá que el cliente está fuera de línea, y la conexión se restablecerá para permitir una nueva conexión. El valor predeterminado de n es 5; El valor n = 0 significa "sin límite" en los tiempos de espera.
-NoFreeze cierra la ventana de video después de un reinicio debido al tiempo de espera de NTP (el valor predeterminado es dejar la ventana abierta para permitir una reconexión más suave al mismo cliente). Esta opción puede ser útil en modo de pantalla completa.
-NC mantiene el comportamiento anterior de UXPlay <1.45 que no cierra la ventana de video cuando el cliente envía la señal de "dejar de reflejar". Esta opción se usa actualmente de forma predeterminada en MacOS, ya que la ventana creada en MacOS por GStreamer no termina correctamente (causa un Segfault) si aún está abierta cuando la tubería GStreamer está cerrada.
-Nohold elimina la conexión actual cuando un nuevo cliente intenta conectarse. Sin esta opción, el cliente actual mantiene la propiedad exclusiva de UXPlay hasta que se desconecta.
-restrict Restrinja a los clientes permitidos para conectarse a los especificados por -allow
. El DeviceId tiene la forma de una dirección MAC que muestra UXPlay cuando el cliente intenta conectarse, y parece ser inmutable. Tiene el formato XX:XX:XX:XX:XX:XX
, x = 0-9, AF, y posiblemente es la dirección MAC de hardware "verdadero" del dispositivo. Tenga en cuenta que los clientes de iOS generalmente exponen diferentes direcciones "WI_FI privadas" aleatorias "(direcciones MAC" falsas ") a diferentes redes (por razones de privacidad, para evitar el seguimiento), que pueden cambiar y no se corrigen al dispositivo.
-restrict no eliminar restricciones (predeterminado). Esto es útil como un argumento de línea de comandos a las restricciones Overide establecidas en el archivo de inicio.
-Allow ID agrega el dispositivoD = ID a la lista de clientes permitidos cuando se aplican restricciones del cliente. Por lo general, esta será una entrada en el archivo de inicio UXPlayRC.
-La ID de bloque siempre bloquea a los clientes con dispositivoD = id , incluso cuando las restricciones del cliente no se aplican en general. Por lo general, esta será una entrada en el archivo de inicio UXPlayRC.
-FPSDATA enciende el monitoreo de informes regulares sobre el rendimiento de transmisión de video que envía el cliente. Estos se mostrarán en la ventana del terminal si se usa esta opción. El cliente actualiza los datos a intervalos de 1 segundo.
-fps n establece una velocidad de cuadro máxima (en cuadros por segundo) para que el cliente de AirPlay transmita el video; n debe ser un número completo inferior a 256 (el cliente puede optar por servir videos a cualquier velocidad de cuadro más baja que esto; el valor predeterminado es de 30 fps). Una configuración de 60 fps puede darle un video mejorado pero no se recomienda en Raspberry Pi. Una configuración por debajo de 30 fps podría ser útil para reducir la latencia si está ejecutando más de una instancia de UXPlay al mismo tiempo. Esta configuración es solo un aviso para el dispositivo cliente, por lo que establecer un valor alto no forzará una alta fotograma. (Puede probar el uso de "-vs fpsdisplaysink" para ver qué fotograma se está recibiendo, o usar la opción -fpsdata que muestra datos de rendimiento de video de video enviados continuamente por el cliente durante la transmisión de video).
-F {H | V | I} Implementa la imagen "Videoflip" Transforma: H = Flip horizontal (imagen de flip o espejo derecha); V = Flip vertical; I = Rotación o inversión de 180 grados (que es la combinación de H con V).
-r {r | l} 90 grados a la derecha (en sentido horario) o izquierda (en sentido antihorario) rotaciones; Estas transformaciones de imagen se llevan a cabo después de cualquier transformación -f .
-M [Mac] cambia la dirección MAC (ID del dispositivo) utilizada por UXPlay (el valor predeterminado es usar la dirección MAC de hardware real informada por la tarjeta de red de la computadora host). (Se necesitan diferentes direcciones de server_name, MAC y puertos de red para cada uno que ejecuta UXPlay si intenta ejecutar más de una instancia de UXPlay en la misma computadora). If [Mac] (en la forma xx: xx: xx: xx: xx: XX, 6 octetos hexagonales) no se da, se genera una dirección MAC aleatoria. Si UXPlay no logra encontrar la verdadera dirección MAC de una tarjeta de red (más específicamente, la dirección MAC utilizada por la primera interfaz de red activa detectada) se utilizará una dirección MAC aleatoria incluso si no se especificó la opción -m . (Tenga en cuenta que una dirección MAC aleatoria será diferente cada vez que se inicie UXPlay).
-Key [ nombre de archivo ] : esta opción (más segura) para generar y almacenar una clave pública persistente (necesaria para la opción -pin) se ha reemplazado de forma predeterminada con un método (menos seguro) que genera una clave desde la "ID del dispositivo del servidor "(Dirección MAC, que se puede cambiar con la opción -m, convenientemente como una opción de archivo de inicio). Cuando se usa la opción -key, se genera y almacena un keypair generado de forma segura en $HOME/.uxplay.pem
, si ese archivo no existe, o lee de él, si existe. (Opcionalmente, la clave se puede almacenar en el nombre de archivo ). Este método es más seguro que el nuevo método predeterminado (porque la ID del dispositivo se transmite en el anuncio DNS_SD) pero aún deja la clave privada expuesta a cualquier persona que pueda acceder al archivo PEM . Esta opción debe establecerse en el archivo de inicio de UXPlay como una línea "clave" de línea o "clave de archivo " (sin inicial "-"), donde el nombre de archivo es una ruta completa que debe estar encerrada en cotizaciones ( "...."
) si Contiene espacios en blanco. Debido a que el método predeterminado es más simple y es poco probable que la seguridad del acceso al cliente a UXPlay sea un problema importante, ya no se recomienda la opción -key .
-dacp [ nombre de archivo ] : exporte la clave DACP-ID actual del cliente y la clave actualizada activa al archivo: el valor predeterminado es $ home/.uxplay.dacp. (Opcionalmente se puede cambiar al nombre de archivo ). Puede ser utilizado por aplicaciones de control remoto. El archivo es transitorio: solo existe mientras el cliente está conectado.
-VDMP descarga el video H264 para archivar Videodump.h264. -vdmp n descarga no más de unidades nal a videodump.x.h264; x = 1,2, ... aumenta cada vez que llega una unidad NAL SPS/PPS. Para cambiar el nombre Videodump , use -vdmp [n] nombre de archivo .
-Admp descarga audio a archivar audiodump.x.aac (audio de formato AAC-eld), audiodump.x.alac (ALAC Format Audio) o Audiodump.x.aud (otro audio de formato), donde x = 1,2,3 ... aumenta cada vez que cambia el formato de audio. -Admp n restringe el número de paquetes arrojados a un archivo a N o menos. Para cambiar el nombre Audiodump , use -Admp [n] nombre de archivo . Tenga en cuenta que (a diferencia del video abandonado), el audio abandonado actualmente solo es útil para la depuración, ya que no se contiene para que se pueda reproducir con reproductores de audio estándar.
-d habilitar la salida de depuración. Nota: Esto no muestra el error de GStreamer o los mensajes de depuración. Para ver los mensajes de error y advertencia de GStreamer, establezca la variable de entorno GST_DEBUG con "Exportar GST_DEBUG = 2" antes de ejecutar UXPlay. Para ver los mensajes de información de GStreamer, establezca gst_debug = 4; para mensajes de depuración, gst_debug = 5; Aumente esto para ver aún más del funcionamiento interno de Gstreamer.
Nota: uxplay
se ejecuta desde una línea de comando terminal, y los mensajes informativos se escriben en el terminal.
Un usuario (en Ubuntu) encontró la compilación falló con mensajes sobre la vinculación a "USR/local/lib/libcrypto.a" y "zlib". Esto se debió a que (además de la instalación estándar de Ubuntu de libssl-dev), el usuario no sabía que una segunda instalación con libcrypto in /usr /local estaba presente. Solución: Cuando haya más de una instalación de OpenSSL, establezca la variable de entorno Open_SSL_ROOT_DIR para apuntar al correcto; En Ubuntu de 64 bits, esto se hace ejecutando export OPENSSL_ROOT_DIR=/usr/lib/X86_64-linux-gnu/
antes de ejecutar cmake.
Se requiere el servicio DNS_SD Service-Descossvery ("Bonjour" o "ZeroConf") para que funcione UXPlay. En Linux, generalmente será proporcionado por Avahi, y para solucionar esto, debe usar la herramienta avahi-browse
. (Es posible que deba instalar un paquete separado con un nombre como avahi-utils
para obtener esto).
En Linux, asegúrese de que esté instalado Avahi e inicie el servicio de Avahi-Demon en el sistema que ejecuta uxplay (su distribución documentará cómo hacer esto, por ejemplo: sudo systemctl
o sudo service avahi-daemon
, con
uno de Enable, Desactivar sudo find /etc -name avahi-daemon.conf
Iniciar, detener, Estado. sudo find /etc -name avahi-daemon.conf
"): asegúrese de que" deshabilitar la publicación " no sea una opción seleccionada). En su lugar, algunos sistemas pueden usar el demonio MDNSD como alternativa para proporcionar el servicio DNS-SD. (FreeBSD offers both alternatives, but only Avahi was tested; see here.)
If UxPlay stops with the "No DNS-SD Server found" message, this means that your network does not have a running Bonjour/zeroconf DNS-SD server. Before v1.60, UxPlay used to stall silently if DNS-SD service registration failed, but now stops with an error message returned by the DNSServiceRegister function: kDNSServiceErr_Unknown if no DNS-SD server was found: (A NixOS user found that in NixOS, this error can also occur if avahi-daemon service IS running with publishing enabled, but reports "the error disappeared on NixOS by setting services.avahi.openFirewall to true".) Other mDNS error codes are in the range FFFE FF00 (-65792) to FFFE FFFF (-65537), and are listed in the dnssd.h file. An older version of this (the one used by avahi) is found here. A few additional error codes are defined in a later version from Apple.
If UxPlay stalls without an error message and without the server name showing on the client , this is a network problem (if your UxPlay version is older than 1.60, it is also the behavior when no DNS-SD server is found.)
A useful tool for examining such network problems from the client end is the (free) Discovery DNS-SD browser available in the Apple App Store for both iOS (works on iPadOS too) and macOS.
If your router has this problem, a reported "fix" is to (at least on 5GHz) use fixed channel and/or fixed (not dynamic) channel width.
This is usually because Avahi is only using the "loopback" network interface, and is not receiving mDNS queries from new clients that were not listening when UxPlay started.
To check this, after starting uxplay, use the utility avahi-browse -a -t
in a different terminal window on the server to verify that the UxPlay AirTunes and AirPlay services are correctly registered (only the AirTunes service is used in the "Legacy" AirPlay Mirror mode used by UxPlay, but the AirPlay service is used for the initial contact).
The results returned by avahi-browse should show entries for uxplay like
+ eno1 IPv6 UxPlay AirPlay Remote Video local
+ eno1 IPv4 UxPlay AirPlay Remote Video local
+ lo IPv4 UxPlay AirPlay Remote Video local
+ eno1 IPv6 863EA27598FE@UxPlay AirTunes Remote Audio local
+ eno1 IPv4 863EA27598FE@UxPlay AirTunes Remote Audio local
+ lo IPv4 863EA27598FE@UxPlay AirTunes Remote Audio local
If only the loopback ("lo") entries are shown, a firewall on the UxPlay host is probably blocking full DNS-SD service, and you need to open the default UDP port 5353 for mDNS requests, as loopback-based DNS-SD service is unreliable.
If the UxPlay services are listed by avahi-browse as above, but are not seen by the client, the problem is likely to be a problem with the local network.
This shows that a DNS-SD service is working, clients hear UxPlay is available, but the UxPlay server is not receiving the response from the client. This is usually because a firewall on the server is blocking the connection request from the client. (One user who insisted that the firewall had been turned off turned out to have had two active firewalls ( firewalld and ufw ) both running on the server!) If possible, either turn off the firewall to see if that is the problem, or get three consecutive network ports, starting at port n, all three in the range 1024-65535, opened for both tcp and udp, and use "uxplay -pn" (or open UDP 7011,6001,6000 TCP 7100,7000,7001 and use "uxplay -p").
If you are really sure there is no firewall, you may need to investigate your network transmissions with a tool like netstat, but almost always this is a firewall issue.
If you do not see the message raop_rtp_mirror starting mirroring
, something went wrong before the client-server negotiations were finished. For such problems, use "uxplay -d " (debug log option) to see what is happening: it will show how far the connection process gets before the failure occurs. You can compare your debug output to that from a successful start of UxPlay in the UxPlay Wiki.
If UxPlay reports that mirroring started, but you get no video or audio, the problem is probably from a GStreamer plugin that doesn't work on your system (by default, GStreamer uses the "autovideosink" and "autoaudiosink" algorithms to guess what are the "best" plugins to use on your system). A different reason for no audio occurred when a user with a firewall only opened two udp network ports: three are required (the third one receives the audio data).
Raspberry Pi devices ( Pi 4B+ and earlier: this does not apply to the Pi 5, which does not provide hardware h264 decoding, and does not need it ) work best with hardware GPU h264 video decoding if the Video4Linux2 plugin in GStreamer v1.20.x or earlier has been patched (see the UxPlay Wiki for patches). This is fixed in GStreamer-1.22, and by backport patches from this in distributions such as Raspberry Pi OS (Bullseye): use option -bt709
with the GStreamer-1.18.4 from Raspberry Pi OS . This also needs the bcm2835-codec kernel module that is not in the standard Linux kernel (it is available in Raspberry Pi OS, Ubuntu and Manjaro).
-avdec
for software h264-decoding.Sometimes "autovideosink" may select the OpenGL renderer "glimagesink" which may not work correctly on your system. Try the options "-vs ximagesink" or "-vs xvimagesink" to see if using one of these fixes the problem.
Other reported problems are connected to the GStreamer VAAPI plugin (for hardware-accelerated Intel graphics, but not NVIDIA graphics). Use the option "-avdec" to force software h264 video decoding: this should prevent autovideosink from selecting the vaapisink videosink. Alternatively, find out if the gstreamer1.0-vaapi plugin is installed, and if so, uninstall it. (If this does not fix the problem, you can reinstall it.)
There are some reports of other GStreamer problems with hardware-accelerated Intel HD graphics. One user (on Debian) solved this with "sudo apt install intel-media-va-driver-non-free". This is a driver for 8'th (or later) generation "*-lake" Intel chips, that seems to be related to VAAPI accelerated graphics.
If you do have Intel HD graphics, and have installed the vaapi plugin, but -vs vaapisink
does not work, check that vaapi is not "blacklisted" in your GStreamer installation: run gst-inspect-1.0 vaapi
, if this reports 0 features
, you need to export GST_VAAPI_ALL_DRIVERS=1
before running uxplay, or set this in the default environment.
You can try to fix audio or video problems by using the " -as
" or " -vs
" options to choose the GStreamer audiosink or videosink , rather than letting GStreamer choose one for you. (See above, in Starting and running UxPlay for choices of
or
.)
The "OpenGL renderer" window created on Linux by "-vs glimagesink" sometimes does not close properly when its "close" button is clicked. (this is a GStreamer issue). You may need to terminate uxplay with Ctrl-C to close a "zombie" OpenGl window. If similar problems happen when the client sends the "Stop Mirroring" signal, try the no-close option "-nc" that leaves the video window open.
rm -rf ~/.cache/gstreamer-1.0/*
may be the solution to problems where gst-inspect-1.0 does not show a plugin that you believe is installed. The cache will be regenerated next time GStreamer is started. This is the solution to puzzling problems that turn out to come from corruption of the cache, and should be tried first. If UxPlay fails to start, with a message that a required GStreamer plugin (such as "libav") was not found, first check with the GStreamer tool gst-inspect-1.0 to see what GStreamer knows is available. (You may need to install some additional GStreamer "tools" package to get gst-inspect-1.0). For, eg a libav problem, check with " gst-inspect-1.0 libav
". If it is not shown as available to GStreamer, but your package manager shows the relevant package as installed (as one user found), try entirely removing and reinstalling the package. That user found that a solution to a " Required gstreamer plugin 'libav' not found " message that kept recurring was to clear the user's gstreamer cache.
If it fails to start with an error like ' no element "avdec_aac"
' this is because even though gstreamer-libav is installed. it is incomplete because some plugin features are missing: " gst-inspect-1.0 | grep avdec_aac
" will show if avdec_aac is available. Unlike other GStreamer plugins, the libav plugin is a front end to FFmpeg codecs which provide avdec_*.
Some distributions (RedHat, SUSE, etc) provide incomplete versions of FFmpeg because of patent issues with codecs used by certain plugins. In those cases there will be some "extra package" provider like RPM fusion (RedHat), packman (SUSE) where you can get complete packages (your distribution will usually provide instructions for this, Mageia puts them in an optional "tainted" repo) . The packages needed may be "ffmpeg*" or "libav*" packages: the GStreamer libav plugin package does not contain any codecs itself, it just provides a way for GStreamer to use ffmpeg/libav codec libraries which must be installed separately. For similar reasons, distributions may ship incomplete packages of GStreamer "plugins-bad". Use user on Fedora thought they had installed from rpmfusion, but the system had not obeyed: "Adding --allowerasing to the dnf command fixed it after a restart" .
starting with release UxPlay-1.65.3, UxPlay will continue to function, but without audio in mirror mode, if avdec_aac is missing.
To troubleshoot GStreamer execute "export GST_DEBUG=2" to set the GStreamer debug-level environment-variable in the terminal where you will run uxplay, so that you see warning and error messages; see GStreamer debugging tools for how to see much more of what is happening inside GStreamer. Run "gst-inspect-1.0" to see which GStreamer plugins are installed on your system.
Some extra GStreamer packages for special plugins may need to be installed (or reinstalled: a user using a Wayland display system as an alternative to X11 reported that after reinstalling Lubuntu 18.4, UxPlay would not work until gstreamer1.0-x was installed, presumably for Wayland's X11-compatibility mode). Different distributions may break up GStreamer 1.x into packages in different ways; the packages listed above in the build instructions should bring in other required GStreamer packages as dependencies, but will not install all possible plugins.
The GStreamer video pipeline, which is shown in the initial output from uxplay -d
, has the default form
appsrc name=video_source ! queue ! h264parse ! decodebin ! videoconvert ! autovideosink name=video_sink sync=false
The pipeline is fully configurable: default elements "h264parse", "decodebin", "videoconvert", and "autovideosink" can respectively be replaced by using uxplay options -vp
, -vd
, -vc
, and -vs
, if there is any need to modify it (entries can be given in quotes "..." to include options).
This can happen if the TCP video stream from the client stops arriving at the server, probably because of network problems (the UDP audio stream may continue to arrive). At 3-second intervals, UxPlay checks that the client is still connected by sending it a request for a NTP time signal. If a reply is not received from the client within a 0.3 sec time-window, an "ntp timeout" is registered. If a certain number (currently 5) of consecutive ntp timeouts occur, UxPlay assumes that the client is "dead", and resets the connection, becoming available for connection to a new client, or reconnection to the previous one. Sometimes the connection may recover before the timeout limit is reached, and if the default limit is not right for your network, it can be modified using the option "-reset n ", where n is the desired timeout-limit value ( n = 0 means "no limit"). If the connection starts to recover after ntp timeouts, a corrupt video packet from before the timeout may trigger a "connection reset by peer" error, which also causes UxPlay to reset the connection.
A protocol failure may trigger an unending stream of error messages, and means that the audio decryption key (also used in video decryption) was not correctly extracted from data sent by the client.
The protocol was modifed in UxPlay-1.65 after it was discovered that the client-server "pairing" step could be avoided (leading to a much quicker connection setup, without a 5 second delay) by disabling "Supports Legacy Pairing" (bit 27) in the "features" code UxPlay advertises on DNS-SD Service Discovery. Most clients will then not attempt the setup of a "shared secret key" when pairing, which is used by AppleTV for simultaneous handling of multiple clients (UxPlay only supports one client at a time). This change is now well-tested, but in case it causes any protocol failures, UxPlay can be reverted to the previous behavior by uncommenting the previous "FEATURES_1" setting (and commenting out the new one) in lib/dnssdint.h, and then rebuilding UxPlay. ("Pairing" is re-enabled when the new Apple-style one-time "pin" authentication is activated by running UxPlay with the "-pin" option introduced in UxPlay 1.67.)
Protocol failure should not happen for iOS 9.3 or later clients. However, if a client uses the same older version of the protocol that is used by the Windows-based AirPlay client emulator AirMyPC , the protocol can be switched to the older version by the setting OLD_PROTOCOL_CLIENT_USER_AGENT_LIST
in UxPlay/lib/global.h
. UxPlay reports the client's "User Agent" string when it connects. If some other client also fails to decrypt all audio and video, try adding its "User Agent" string in place of "xxx" in the entry "AirMyPC/2.0;xxx" in global.h and rebuild uxplay.
Note that for DNS-SD Service Discovery, Uxplay declares itself to be an AppleTV3,2 (a 32 bit device) with a sourceVersion 220.68; this can also be changed in global.h. UxPlay also works if it declares itself as an AppleTV6,2 with sourceVersion 380.20.1 (an AppleTV 4K 1st gen, introduced 2017, running tvOS 12.2.1), so it does not seem to matter what version UxPlay claims to be.
1.70 2024-10-04 Add support for 4K (h265) video (resolution 3840 x 2160). Fix issue with GStreamer >= 1.24 when client sleeps, then wakes.
1.69 2024-08-09 Internal improvements (eg in -nohold option, identifying GStreamer videosink selected by autovideosink, finding X11 display) in anticipation of future HLS video support. New -nofreeze option to not leave frozen video in place when a network connection is reset. Fixes for GStreamer-1.24.x changes.
1.68 2023-12-31 New simpler (default) method for generating a persistent public key from the server MAC address (which can now be set with the -m option). (The previous method is still available with -key option). New option -reg to maintain a register of pin-authenticated clients. Corrected volume-control: now interprets AirPlay volume range -30dB:0dB as decibel gain attenuation, with new option -db low[:high] for "flat" rescaling of the dB range. Add -taper option for a "tapered" AirPlay volume-control profile.
1.67 2023-11-30 Add support for Apple-style one-time pin authentication of clients with option "-pin": (uses SRP6a authentication protocol and public key persistence). Detection with error message of (currently) unsupported H265 video when requesting high resolution over wired ethernet. Removed rpi* options (which are not valid with new Raspberry Pi model 5, and can be replaced by combinations of other options). Added optional argument "mac" to "-m" option, to specify a replacement MAC address/Device ID. Update llhttp to v. 9.1.3. Add -dacp option for exporting current client DACP info (for remotes).
1.66 2023-09-05 Fix IPV6 support. Add option to restrict clients to those on a list of allowed deviceIDs, or to block connections from clients on a list of blocked deviceIDs. Fix for #207 from @thiccaxe (screen lag in vsync mode after client wakes from sleep).
1.65.3 2023-07-23 Add RPM spec file; add warning if required gstreamer libav feature "avdec_aac" is missing: (this occurs in RPM-based distributions that ship an incomplete FFmpeg for Patent or License reasons, and rely on users installing an externally-supplied complete FFmpeg). Mirror-mode airplay will now work without audio if avdec_aac is missing.
1.65 2023-06-03 Eliminate pair_setup part of connection protocol to allow faster connections with clients (thanks to @shuax #176 for this discovery); to revert, uncomment a line in lib/dnssdint.h. Disconnect from audio device when connection closes, to not block its use by other apps if uxplay is running but not connected. Fix for AirMyPC client (broken since 1.60), so its older non-NTP timestamp protocol works with -vsync. Corrected parsing of configuration file entries that were in quotes.
1.64 2023-04-23 Timestamp-based synchronization of audio and video is now the default in Mirror mode. (Use "-vsync no" to restore previous behavior.) A configuration file can now be used for startup options. Also some internal cleanups and a minor bugfix that fixes #192.
1.63 2023-02-12 Reworked audio-video synchronization, with new options -vsync (for Mirror mode) and -async (for Audio-Only mode, to sync with client video). Option -vsync makes software h264 decoding of streamed videos with option -avdec viable on some recent Raspberry Pi models. Internal change: all times are now processed in nanoseconds units. Removed -ao option introduced in 1.62.
1.62 2023-01-18 Added Audio-only mode time offset -ao x to allow user synchronization of ALAC audio playing on the server with video, song lyrics, etc. playing on the client. x = 5.0 appears to be optimal in many cases. Quality fixes: cleanup in volume changes, timestamps, some bugfixes.
1.61 2022-12-30 Removed -t option (workaround for an Avahi issue, correctly solved by opening network port UDP 5353 in firewall). Remove -g debug flag from CMAKE_CFLAGS. Postpend (instead of prepend) build environment CFLAGS to CMAKE_CFLAGS. Refactor parts of uxplay.cpp
1.60 2022-12-15 Added exit with error message if DNSServiceRegister fails (instead of just stalling). Test for Client's attempt to using unsupported AirPlay 2 "REMOTE CONTROL" protocol (with no timing channel), and exit if this occurs. Reworked metadata processing to correctly parse DMAP header (previous version worked with DMAP messages currently received, but was not correct).
1.59 2022-12-12 remove "ZOOMFIX" compile option and make compilation with X11-dependence the default if X11 development libraries are detected (this now also provides fullscreen mode with a F11 or Alt+Enter key toggle); ZOOMFIX is now automatically applied for GStreamer < 1.20. New cmake option -DNO_X11_DEPS compiles uxplay without X11 dependence. Reworked internal metadata handling. Fix segfault with "-vs 0".
1.58 2022-10-29 Add option "-nohold" that will drop existing connections when a new client connects. Update llhttp to v8.1.0.
1.57 2022-10-09 Minor fixes: (fix coredump on AUR on "stop mirroring", occurs when compiled with AUR CFLAGS -DFORTIFY_SOURCE); graceful exit when required plugins are missing; improved support for builds on Windows. Include audioresample in GStreamer audio pipeline.
1.56 2022-09-01 Added support for building and running UxPlay-1.56 on Windows (no changes to Unix (Linux, *BSD, macOS) codebase.)
1.56 2022-07-30 Remove -bt709 from -rpi, -rpiwl, -rpifb as GStreamer is now fixed.
1.55 2022-07-04 Remove the bt709 fix from -v4l2 and create a new -bt709 option (previous "-v4l2" is now "-v4l2 -bt709"). This allows the currently-required -bt709 option to be used on its own on RPi without -v4l2 (sometimes this give better results).
1.54 2022-06-25 Add support for "Cover Art" display in Audio-only (ALAC) mode. Reverted a change that caused VAAPI to crash with AMD POLARIS graphics cards. Minor internal changes to plist code and uxplay option parsing.
1.53 2022-06-13 Internal changes to audio sync code, revised documentation, Minor bugfix (fix assertion crash when resent audio packets are empty).
1.52 2022-05-05 Cleaned up initial audio sync code, and reformatted streaming debug output (readable aligned timestamps with decimal points in seconds). Eliminate memory leaks (found by valgrind). Support for display of ALAC (audio-only) metadata (soundtrack artist names, titles etc.) in the uxplay terminal.
1.51 2022-04-24 Reworked options forVideo4Linux2 support (new option -v4l2) and short options -rpi, -rpifb, -rpiwl as synonyms for -v4l2, -v4l2 -vs kmssink, and -v4l2 -vs waylandsink. Reverted a change from 1.48 that broke reconnection after "Stop Mirroring" is sent by client.
1.50 2022-04-22 Added -fs fullscreen option (for Wayland or VAAPI plugins only), Changed -rpi to be for framebuffer ("lite") RPi systems and added -rpigl (OpenGL) and -rpiwl (Wayland) options for RPi Desktop systems. Also modified timestamps from "DTS" to "PTS" for latency improvement, plus internal cleanups.
1.49 2022-03-28 Addded options for dumping video and/or audio to file, for debugging, etc. h264 PPS/SPS NALU's are shown with -d. Fixed video-not-working for M1 Mac clients.
1.48 2022-03-11 Made the GStreamer video pipeline fully configurable, for use with hardware h264 decoding. Support for Raspberry Pi.
1.47 2022-02-05 Added -FPSdata option to display (in the terminal) regular reports sent by the client about video streaming performance. Internal cleanups of processing of video packets received from the client. Added -reset n option to reset the connection after n ntp timeouts (also reset after "connection reset by peer" error in video stream).
1.46 2022-01-20 Restore pre-1.44 behavior (1.44 may have broken hardware acceleration): once again use decodebin in the video pipeline; introduce new option "-avdec" to force software h264 decoding by libav h264, if needed (to prevent selection of vaapisink by autovideosink). Update llhttp to v6.0.6. UxPlay now reports itself as AppleTV3,2. Restrict connections to one client at a time (second client must now wait for first client to disconnect).
1.45 2022-01-10 New behavior: close video window when client requests "stop mirroring". (A new "no close" option "-nc" is added for users who wish to retain previous behavior that does not close the video window).
1.44 2021-12-13 Omit hash of aeskey with ecdh_secret for an AirMyPC client; make an internal rearrangement of where this hash is done. Fully report all initial communications between client and server in -d debug mode. Replace decodebin in GStreamer video pipeline by h264-specific elements.
1.43 2021-12-07 Various internal changes, such as tests for successful decryption, uniform treatment of informational/debug messages, etc., updated README.
1.42 2021-11-20 Fix MAC detection to work with modern Linux interface naming practices, MacOS and *BSD.
1.41 2021-11-11 Further cleanups of multiple audio format support (internal changes, separated RAOP and GStreamer audio/video startup)
1.40 2021-11-09 Cleanup segfault in ALAC support, manpage location fix, show request Plists in debug mode.
1.39 2021-11-06 Added support for Apple Lossless (ALAC) audio streams.
1.38 2021-10-8 Add -as audiosink option to allow user to choose the GStreamer audiosink.
1.37 2021-09-29 Append "@hostname" to AirPlay Server name, where "hostname" is the name of the server running uxplay (reworked change in 1.36).
1.36 2021-09-29 Implemented suggestion (by @mrbesen and @PetrusZ) to use hostname of machine runing uxplay as the default server name
1.35.1 2021-09-28 Added the -vs 0 option for streaming audio, but not displaying video.
1.35 2021-09-10 now uses a GLib MainLoop, and builds on macOS (tested on Intel Mac, 10.15 ). New option -t timeout for relaunching server if no connections were active in previous timeout seconds (to renew Bonjour registration).
1.341 2021-09-04 fixed: render logger was not being destroyed by stop_server()
1.34 2021-08-27 Fixed "ZOOMFIX": the X11 window name fix was only being made the first time the GStreamer window was created by uxplay, and not if the server was relaunched after the GStreamer window was closed, with uxplay still running. Corrected in v. 1.34
If you need to do this, note that you may be able to use a newer version (OpenSSL-3.0.1 is known to work). You will need the standard development toolset (autoconf, automake, libtool). Download the source code from https://www.openssl.org/source/. Install the downloaded openssl by opening a terminal in your Downloads directory, and unpacking the source distribution: ("tar -xvzf openssl-3.0.1.tar.gz ; cd openssl-3.0.1"). Then build/install with "./config ; make ; sudo make install_dev". This will typically install the needed library libcrypto.*
, either in /usr/local/lib or /usr/local/lib64.
(Ignore the following for builds on MacOS:) On some systems like Debian or Ubuntu, you may also need to add a missing entry /usr/local/lib64
in /etc/ld.so.conf (or place a file containing "/usr/local/lib64/libcrypto.so" in /etc/ld.so.conf.d) and then run "sudo ldconfig".
(Note: on Debian 9 "Stretch" or Ubuntu 16.04 LTS editions, you can avoid this step by installing libplist-dev and libplist3 from Debian 10 or Ubuntu 18.04.) As well as the usual build tools (autoconf, automake, libtool), you may need to also install some libpython*-dev package. Download the latest source with git from https://github.com/libimobiledevice/libplist, or get the source from the Releases section (use the *.tar.bz2 release, not the *.zip or *.tar.gz versions): download libplist-2.3.0, then unpack it ("tar -xvjf libplist-2.3.0.tar.bz2 ; cd libplist-2.3.0"), and build/install it: ("./configure ; make ; sudo make install"). This will probably install libplist-2.0.* in /usr/local/lib. The new libplist-2.3.0 release should be compatible with UxPlay; libplist-2.2.0 is also available if there are any issues.
(Ignore the following for builds on MacOS:) On some systems like Debian or Ubuntu, you may also need to add a missing entry /usr/local/lib
in /etc/ld.so.conf (or place a file containing "/usr/local/lib/libplist-2.0.so" in /etc/ld.so.conf.d) and then run "sudo ldconfig".
All the resources in this repository are written using only freely available information from the internet. The code and related resources are meant for educational purposes only. It is the responsibility of the user to make sure all local laws are adhered to.
This project makes use of a third-party GPL library for handling FairPlay. The legal status of that library is unclear. Should you be a representative of Apple and have any objections against the legality of the library and its use in this project, please contact the developers and the appropriate steps will be taken.
Given the large number of third-party AirPlay receivers (mostly closed-source) available for purchase, it is our understanding that an open source implementation of the same functionality wouldn't violate any of Apple's rights either.
[adapted from fdraschbacher's notes on RPiPlay antecedents]
The code in this repository accumulated from various sources over time. Here is an attempt at listing the various authors and the components they created:
UxPlay was initially created by antimof from RPiPlay, by replacing its Raspberry-Pi-adapted OpenMAX video and audio rendering system with GStreamer rendering for desktop Linux systems; the antimof work on code in renderers/
was later backported to RPiPlay, and the antimof project became dormant, but was later revived at the current GitHub site to serve a wider community of users.
The previous authors of code included in UxPlay by inheritance from RPiPlay include:
lib/playfair
folder. License: GNU GPLlib/
originally stems from this project. License: GNU LGPLv2.1+lib/
concerning mirroring is dsafa22's work. License: GNU LGPLv2.1+Independent of UxPlay, but used by it and bundled with it:
lib/llhttp/
. License: MIT