¿Cómo transmitir audio usando FFMPEG?

Sobre la base de la respuesta de @ Allan , estoy tratando de redirigir la salida de ffmpeg a un servidor.

$ ffmpeg -f avfoundation -i ":1" -t 10 - | ssh user@host .... -

Pero me sale el siguiente mensaje de error:

"Se debe especificar al menos un archivo de salida"

También intenté usar ffserver en lugar de SSH, pero no tuve suerte.

¿ Es posible transmitir audio de esta manera?

Aparentemente lo es, consulte duckduckgo.com/?q=streaming+ffmpeg+over+ssh

Respuestas (1)

Hay dos soluciones que puedo visualizar para este escenario:

  • Guardar el archivo en una computadora remota
  • Tener una transmisión en vivo para que una computadora remota pueda recibir el audio

Guardando el archivo

Este es probablemente el método más fácil. Permita que la transmisión termine de grabarse y luego cópiela en una ubicación predeterminada en la red. Este script debería ajustarse a la factura:

#!/bin/bash
#
ffmpeg -f avfoundation -i ":1" -t 10 audiocapture.mp3
scp audiocapture.mp3 user@host:/foo/bar/audiocapture.mp3

exit 0

El script no verifica ningún tipo de error, pero grabará desde el micrófono y, cuando termine, lo copiará a través de SCP (copia segura) en una computadora remota. Para que esto funcione, debe configurar claves SSH para facilitar un inicio de sesión no interactivo .

Transmitir en tiempo real

El otro método es transmitir el audio a través de TCP a través de una conexión punto a punto. Usando la misma entrada de la respuesta anterior, simplemente cambiamos la salida a un flujo de red:

$ ffmpeg -f avfoundation -i ":1" -t 10 -f mpegts "tcp://remote_host_or_IP_:port"

Dónde....

  • -fes el formato de transporte; en este caso mpegts (MPEG Transport Stream)
  • tcp://remote_host_or_IP_:portes el valor URI del nombre de host/dirección IP de la computadora remota y el número de puerto en el que estará escuchando.

Configure la computadora remota para "escuchar"

Se puede configurar el uso ffplayde la computadora remota para recibir la transmisión (utilicé Windows 10 para esta parte, pero funcionará en macOS/Windows/BSD/Linux)

Emitir el comando

ffplay -i tcp://local_host_or_IP_addr:port?listen -hide_banner

Dónde....

  • -idefine el flujo de entrada
  • local_host_or_IP_addr:portes la dirección IP o el nombre de host y el puerto TCP de la computadora que está escuchando (no la computadora que está transmitiendo).
  • ?listenes necesario ponerlo en "modo de escucha"; de lo contrario, se agotará el tiempo de espera si la transmisión no está allí.

A continuación se muestra un ejemplo realizado en Windows 10 que recibe la transmisión desde el micrófono de un host macOS. La dirección IP de la máquina con Windows 10 es 10.0.0.123 y estoy transmitiendo en el puerto 1234.

C:\Users\allan\Desktop\ffmpeg>ffplay -i tcp://10.0.0.123:1234?listen -hide_banner

    nan    :  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0

Una vez que comience a recibir la transmisión, los valores anteriores cambiarán y se abrirá una ventana de "visualización" del jugador.

Input #0, mpegts, from 'tcp://10.0.0.123:1234?listen':B f=0/0
384 kb/s    nan    :  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0
  Program 1   0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0
    Metadata: 0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0
Service01    nan    :  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0       0B f=0/0
FFmpeg    nan    :  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0   sq=    0B f=0/0
    Stream #0:0[0x100]: Audio: mp2 ([3][0][0][0] / 0x0003), 44100 Hz, stereo, fltp, 384 kb/s
  11.35 M-A:  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0

Continuará "escuchando" hasta que se elimine el proceso.