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

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

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

Есть ли способ направить ледяной поток на устройство-манекен alsa? Или есть другой вариант для направления потока ледяного вещания в udp для тихого воспроизведения в случае пропадания ледяного потока, а затем автоматически возвращается к нормальному воспроизведению, когда поток ледового вещания снова становится доступным?

2 ответа2

1

Вы можете использовать устройство Loopback вместо устройства Dummy.

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

# modprobe snd-aloop index=0 pcm_substreams=1

Затем вместо маршрутизации icecast на hw:Dummy,0 , вы можете направить его на hw:Loopback,0,0 и прочитать этот поток в ffmpeg из hw:Loopback,1,0 .

1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .