Ir al contenido principal

Fanvil - Música ambiental por broadcast en bocinas A233, A212, A201 utilizando FFMPEG en PC con opción de voceo.

El siguiente articulo define como tener música ambiente con bocinas de Fanvil y mandando un streaming desde una PC para música y con voceo

Antonio Anaya avatar
Escrito por Antonio Anaya
Actualizado hace más de 3 semanas

Mira el video paso a paso aquí:

Equipos utilizados:

  1. UCM6302 Conmutador Grandstream

  2. A233 Bocina para exterior IP

  3. A212 Bocina para interior

  4. A201 Bocina para interior plafón

  5. PC/Lap con servidor FFmpeg

  6. V60P Teléfono para Voceo

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

¿Ha quedado contestada tu pregunta?