Как передавать аудио с помощью FFMPEG?

Основываясь на ответе @ Allan , я пытаюсь перенаправить вывод ffmpeg на сервер.

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

Но я получаю следующее сообщение об ошибке:

"Должен быть указан хотя бы один выходной файл"

Я также пытался использовать ffserver вместо SSH, но мне не повезло.

Можно ли передавать аудио таким образом?

Судя по всему, см. Duckduckgo.com/?q=streaming+ffmpeg+over+ssh

Ответы (1)

Есть два решения, которые я могу визуализировать для этого сценария:

  • Сохранение файла на удаленный компьютер
  • Прямая трансляция, чтобы удаленный компьютер мог получать звук

Сохранение файла

Это, пожалуй, самый простой способ. Дайте потоку закончить запись, а затем скопируйте его в заданное место в сети. Этот скрипт должен соответствовать всем требованиям:

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

exit 0

Скрипт не проверяет никаких ошибок, но записывает с микрофона, а когда закончит, скопирует его через SCP (защищенное копирование) на удаленный компьютер. Чтобы это работало, вам нужно настроить ключи SSH, чтобы облегчить неинтерактивный вход в систему .

Трансляция в реальном времени

Другой метод заключается в передаче звука через TCP через соединение «точка-точка». Используя тот же ввод из предыдущего ответа, мы просто меняем вывод на сетевой поток:

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

Где....

  • -f- транспортный формат; в данном случае mpegts (транспортный поток MPEG)
  • tcp://remote_host_or_IP_:port— это значение URI имени хоста/IP-адреса удаленного компьютера и номера порта, который он будет прослушивать.

Настройте удаленный компьютер на «прослушивание»

Использование ffplayудаленного компьютера может быть настроено на получение потока (для этой части я использовал Windows 10, но будет работать и в macOS/Windows/BSD/Linux)

Введите команду

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

Где....

  • -iопределяет входной поток
  • local_host_or_IP_addr:port— это IP-адрес или имя хоста и порт TCP прослушивающего компьютера (а не компьютера, с которого выполняется потоковая передача).
  • ?listenтребуется перевести его в «режим прослушивания», иначе время ожидания истечет, если потока нет.

Ниже приведен пример, выполненный в Windows 10 и получающий поток с микрофона хоста macOS. IP-адрес компьютера с Windows 10 — 10.0.0.123, и я вещаю через порт 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

Как только он начнет принимать трансляцию, указанные выше значения изменятся и откроется окно «визуализации» плеера.

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

Он будет продолжать «слушать», пока процесс не будет убит.