Я интерпретирую ваш комментарий как «с помощью Pulseaudio это нормально». Я не проверял это, но вот что я сделаю:
Сначала создайте «нулевой» приемник Pulseaudio:
pacmd load-module module-null-sink sink_name=icecast sink_properties=device.description=Icecast
В Pulseaudio каждый приемник имеет связанный .monitor
источник, поэтому вы можете выводить звук на icecast
приемник и обрабатывать его в других приложениях с использованием icecast.monitor
источника.
Если я вас правильно понимаю, вы хотите получать ледяной эфир на своем компьютере. Чтобы вывести поток в icecast
приемник, сделайте что-то вроде
mplayer http://your.icecast.server -ao pulse::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 ...
Однако, если идея заключается в том, что «я хочу распространить этот поток ледового вещания на другие компьютеры в моей домашней сети», может быть лучше использовать модуль Pulseaudio RTP в качестве приемника.
Как я уже сказал, ничего из этого не проверено, возможно, вам придется отрегулировать детали, чтобы это работало.
редактировать
Я также не уверен, что фиктивное устройство ALSA сработало бы в первую очередь, насколько я понимаю, это действительно "фиктивные" устройства и не обеспечивают зацикливание. Для этого вам придется использовать snd-aloop
петлевое устройство, а это немного болезненно, потому что вы постоянно сталкиваетесь с проблемами с частотой дискретизации и т. Д.
Так что вам действительно лучше использовать инфраструктуру Pulseaudio.