
Я хочу передать поток 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,0
ffmpeg и читать этот поток из hw:Loopback,1,0
.