Я интерпретирую ваш комментарий как "с помощью 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
Когда поток 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.