Направить поток ICECAST на фиктивное устройство ALSA

Направить поток ICECAST на фиктивное устройство ALSA

Я хочу передать поток icecast на udp через FFmpeg, но если поток icecast будет потерян, то и FFmpeg тоже потеряется. Я полагаю, что если бы я мог направить поток icecast на фиктивное устройство ALSA, то я мог бы получить данные с него через FFmpeg. Например:

ffmpeg -f alsa -i hw:Dummy,0 -f mpegts udp://ip:port

Затем, в случае обрыва потока Icecast, выходной поток UDP будет воспроизводиться без звука и продолжать воспроизводить аудио до тех пор, пока этот поток снова не станет доступен. (Это мое предположение).

Есть ли способ направить поток Icecast на фиктивное устройство ALSA?Или есть другой вариант маршрутизации потока Icecast на UDP для воспроизведения без звука в случае обрыва потока Icecast, а затем автоматического возврата к нормальному воспроизведению, когда поток Icecast снова станет доступен?

решение1

Я интерпретирую ваш комментарий как "использование Pulseaudio для этого нормально". Я не проверял, но вот что я бы сделал:

Сначала создадим «нулевой» приёмник Pulseaudio:

pacmd load-module module-null-sink sink_name=icecast sink_properties=device.description=Icecast

В Pulseaudio каждый приемник имеет связанный с ним .monitorисточник, поэтому вы можете выводить звук на icecastприемник и обрабатывать его в других приложениях, использующих этот icecast.monitorисточник.

Если я правильно вас понял, вы хотитеполучатьпоток icecast на вашем компьютере. Чтобы вывести поток в icecastприемник, сделайте что-то вроде

mplayer http://your.icecast.server -ao pulse::icecast

Когда поток icecast закончится, mplayerон также прекратится, поэтому оберните это в скрипт оболочки внутри бесконечного whileцикла и т. д.

Я не уверен, что понимаю, что вы пытаетесь сделать с частью "stream to udp via ffmpeg". В любом случае, теперь вы можете читать с icecast.monitorпомощью

ffmpeg -f alsa -i pulse ...

при использовании pavucontrolили pamcdдля выбора правильного источника, или, если ваша ffmpegкомпиляция с поддержкой PulseAudio, напрямую

ffmpeg -f pulse -i icecast.monitor ...

Однако, если идея заключается в том, что «я хочу распространить этот поток Icecast на другие компьютеры в моей домашней сети», то, возможно, лучше использоватьМодуль Pulseaudio RTPкак и раковина в первую очередь.

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

Редактировать

Я также не уверен, что фиктивное устройство ALSA будет работать в первую очередь, насколько я понимаю, они на самом деле просто "фиктивные" устройства и не обеспечивают петлевой связи. Вам придется использовать петлевое snd-aloopустройство для этого, и это немного мучительно, потому что вы постоянно сталкиваетесь с проблемами частоты дискретизации и т. д.

Поэтому вам действительно лучше использовать инфраструктуру Pulseaudio.

решение2

Вместо устройства-заглушки можно использовать устройство Loopback.

Устройство Loopback по умолчанию не включено, поэтому сначала необходимо загрузить модуль ядра snd-aloop с аргументами, чтобы указать желаемый тип и количество подпотоков:

# modprobe snd-aloop index=0 pcm_substreams=1

Тогда вместо того, чтобы направлять icecast в hw:Dummy,0, вы можете направить его в hw:Loopback,0,0ffmpeg и читать этот поток из hw:Loopback,1,0.

Связанный контент