Mira el video paso a paso aquí:
Equipos utilizados:
Resumen
PASO 1:
Lo primero es dirigirnos a la pagina oficial de FFmpeg para descargar el programa que realizará el streaming de música. Nos vamos a Descargas-> presionamos sobre el logo de Windows en nuestro caso-> Windows Exe Files y podemos presionar cualquiera de los dos enlaces.
Después nos redirige al siguiente sitio donde podemos descargar cualquiera de las dos versiones señaladas en rojo, como recomendación descargue la full.
Una vez descargado el archivo lo descomprimimos y lo movemos a una carpeta ejemplo Música
PASO 2:
Para su uso abrimos CMD (Símbolo del sistema) y nos vamos a dirigir por terminal hasta la carpeta bin utilizando el comando cd "ruta del directorio"
En esa misma carpeta bin vamos a cargar la música de nuestro agrado y para el caso del nombre puede ser cualquiera, solo contemplen que no tenga espacios el nombre de la pista y adicional vamos agregar un archivo llamado playlist en .txt que es el que va a contener la ruta de la música para que se reproduzca en loop y ademas se brinquen las canciones en automático.
Como ven la ruta de la canción quedaría como file 'C:\Users\E-EC1-4190\Music\ffmpeg-2024\bin\music1.mp3' tomando en cuenta que el nombre de la canción no contenga espacios y ademas que podemos agregar N cantidad de pistas a la reproducción.
PASO 3:
Para emitir la reproducción desde el CMD posicionados en la ruta de la carpeta bin pegamos el siguiente comando:
ffmpeg -protocol_whitelist file,rtp,udp -re -stream_loop -1 -f concat -safe 0 -i playlist.txt -filter_complex "aresample=16000:async=1000:min_comp=0.3:max_soft_comp=0.5:first_pts=0,asetnsamples=n=160" -flush_packets 0 -acodec g722 -ac 1 -vn -frame_duration 10 -f rtp "rtp://239.1.1.1:5004?buffer_size=1.5M&rtcpport=5004&localrtpport=5004&max_delay=300000"
Para explicar un poco que hace cada parte del comando lo desmenuzaremos para su mejor comprensión:
-protocol_whitelist file,rtp,udp
Función: Permite solo los protocolos especificados (archivos locales, RTP y UDP) por seguridad.
Detalle: Evita que FFmpeg use protocolos no autorizados.
-re
Función: Simula la velocidad de lectura real del archivo.
Detalle: Sincroniza la lectura con la tasa de reproducción (evita que el stream vaya demasiado rápido).
-stream_loop -1
Función: Repite la lista de reproducción indefinidamente.
Detalle: -1 significa "repetir sin límite".
-f concat -safe 0 -i playlist.txt
Función: Concatena los archivos listados en playlist.txt.
Detalle:
-f concat: Usa el demuxer de concatenación.
-safe 0: Permite rutas absolutas/relativas sin restricciones.
El archivo playlist.txt debe contener líneas como: file 'ruta/canción.mp3'.
-filter_complex "aresample=16000:async=1000:min_comp=0.3:max_soft_comp=0.5:first_pts=0,asetnsamples=n=160"
Partes:
aresample=16000: Remuestrea el audio a 16 kHz (frecuencia estándar para voz).
async=1000: Tolerancia de sincronización de 1000ms.
min_comp=0.3: Compensación mínima de tiempo (30%).
max_soft_comp=0.5: Compensación máxima suave (50%).
first_pts=0: Establece el primer timestamp en 0 para evitar saltos.
asetnsamples=n=160: Fija el tamaño de cada paquete de audio a 160 muestras (óptimo para G.722).
-flush_packets 0
Función: Evita vaciados innecesarios del buffer de paquetes.
Detalle: Mantiene la continuidad del stream entre canciones.
-acodec g722 -ac 1 -vn
Partes:
-acodec g722: Usa el códec G.722 (para voz en telefonía IP).
-ac 1: Mixea el audio a mono (1 canal).
-vn: Deshabilita el video (solo audio).
-frame_duration 10
Función: Establece la duración de cada frame a 10ms.
Detalle: Paquetes más pequeños reducen la latencia.
-f rtp "rtp://239.1.1.1:5004?buffer_size=1.5M&rtcpport=5004&localrtpport=5004&max_delay=300000"
Partes:
-f rtp: Formato de salida RTP.
Dirección multicast: rtp://239.1.1.1:5004.
buffer_size=1.5M: Buffer de 1.5 MB para evitar pérdida de paquetes.
rtcpport=5004: Puerto RTCP (control).
localrtpport=5004: Puerto RTP local.
max_delay=300000: Retardo máximo permitido (300ms).
Para entender el trabajo que debe hacer este comando proporcionamos un diagrama.
playlist.txt → Concat → Remuestreo (16 kHz) → Filtrado → G.722 → RTP (Multicast)
↑ ↑ ↑
Loop Sincronización Paquetes
Durante las pruebas se detecto desface en la canción ya que unas bocinas iniciaba antes la transmisión que otras, por lo que se escuchaba un ligero desface, se ajusto el comando para que quedará optimizado el RTP al usar el CONCAT y ademas evitar el desface, mejoro bastante pero no a un 100%, de todas maneras se escucha bien la sincronización.
ffmpeg -protocol_whitelist file,rtp,udp -re -stream_loop -1 -f concat -safe 0 -i playlist.txt -filter_complex "aresample=16000:async=1:min_hard_comp=0.0001:first_pts=0,asetnsamples=n=160,adelay=1|1|1" -flush_packets 1 -acodec g722 -ac 1 -rtbufsize 32k -vn -frame_duration 5 -fflags +nobuffer+flush_packets+discardcorrupt -f rtp "rtp://239.1.1.1:5004?buffer_size=32k&rtcpport=5005&localrtpport=5004&max_delay=5000&ttl=1&pkt_size=100&connect=0"
-protocol_whitelist file,rtp,udp
Función: Solo permite los protocolos especificados (archivos locales, RTP y UDP) por seguridad.
-re
Función: Lee los datos a la velocidad de reproducción natural (evita que vaya demasiado rápido).
-stream_loop -1
Función: Repite la lista de reproducción indefinidamente (-1 = infinito).
-f concat -safe 0 -i playlist.txt
Función: Concatena los archivos listados en playlist.txt.
-safe 0: Permite cualquier ruta en el archivo de lista.
-filter_complex "aresample=16000:async=1:min_hard_comp=0.0001:first_pts=0,asetnsamples=n=160,adelay=1|1|1"
Partes:
aresample=16000: Convierte la frecuencia de muestreo a 16kHz
async=1: Sincronización estricta (1 segundo)
min_hard_comp=0.0001: Compensación mínima de tiempo
first_pts=0: Establece el primer timestamp en 0
asetnsamples=n=160: Fija 160 muestras por paquete
adelay=1|1|1: Aplica 1ms de delay a todos los canales
-flush_packets 1
Función: Fuerza el envío inmediato de paquetes.
-acodec g722 -ac 1 -vn
-acodec g722: Usa códec G.722 (voz en banda ancha)
-ac 1: Mezcla a mono
-vn: Sin video
-rtbufsize 32k -frame_duration 5
-rtbufsize 32k: Buffer de 32KB
-frame_duration 5: Paquetes de 5ms
-fflags +nobuffer+flush_packets+discardcorrupt
nobuffer: Reduce buffering
flush_packets: Limpia buffers frecuentemente
discardcorrupt: Descarta paquetes corruptos
-f rtp "rtp://239.1.1.1:5004?buffer_size=32k&rtcpport=5005&localrtpport=5004&max_delay=5000&ttl=1&pkt_size=100&connect=0"
buffer_size=32k: Tamaño del buffer
rtcpport=5005: Puerto para control RTCP
localrtpport=5004: Puerto local RTP
max_delay=5000: Máximo retardo (5ms)
ttl=1: Time-to-live para multicast
pkt_size=100: Tamaño de paquete
connect=0: No conectar inmediatamente
PASO 4:
Nos toca definir la dirección de broadcast en las bocinas para que reproduzca la playlist y para este caso la damos de alta como prioridad 10 para que al momento de realizar voceo que también se hará por multicast por medio de un conmutador, se detenga la música e inicie el voceo y al colgar llamada se vuelva a reproducir la música en automático. Mismo proceso se sigue para las demás bocinas
PASO 5:
Procedemos también a registrar la bocina como sip al conmutador
primero creamos la extensión en el conmutador y copiamos el Password SIP/IAX para posterior pegarlo en la bocina para el registro
Definimos la extensión y pegamos el password copiado en el UCM en el campo Authentication Password y apuntamos a la ip del servidor que seria la IP del conmutador y ya con eso tenemos toda la configuración del lado de las bocinas.
PASO 6:
Como ultimo paso nos falta definir un servidor de broadcast pero del lado del conmutador para que al marcarle a las bocinas active el voceo y al colgar regrese la música, ya que si le marcamos directo a la extensión de la bocina no entrará la llamada porque esta activo el broadcast.
Nos dirigimos al conmutador a Funciones de llamada-> Voceo/Intercom->Grupo de Voceo/intercom y agregamos un grupo.
En la configuración agregamos un nombre, colocamos que sea multicast paging, agregamos en el playback 1 y agregamos una dirección de broadcast que es la que vamos a colocar como prioridad 1 en la bocina, ademas de agregar en la lista los participantes que tendrán permiso de hacer el voceo.
El otro paso es ir a Funciones de llamada-> Voceo/Intercom->Comunidad de multidifusión damos en el botón agregar y colocamos una extensión en el caso 102 y los participantes donde se hará el voceo, cuando queramos hacer voceo a las bocinas solo marcamos 102.
Por ultimo copiado el comando damos enter y que comience el stream de música por RTP hacia una IP de broadcast que en nuestro caso es 239.1.1.1:5004
FAQ (Preguntas y respuestas)
Artículos relacionados