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

714
Ivan Kolesnikov

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

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

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

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

0
Вы пометили этот вопрос с pulseaudio. Это должно быть фиктивное устройство ALSA или источник Pulseaudio? Намного проще в настройке (хотя я не уверен в поведении при запуске / остановке, мне придется это выяснить). dirkt 6 лет назад 0
@dirkt Спасибо за комментарий! Это фиктивное устройство ALSA. Я пометил вопрос с помощью pulseaudio, потому что, как я понял, мы можем использовать pulseaudio для маршрутизации потока ледового вещания на фиктивное устройство ALSA. Но я могу ошибаться) В любом случае я хочу создать виртуальное звуковое устройство -> направить поток ледяного вещания на него -> получить этот поток с виртуального звукового устройства через ffmpeg. Любое решение будет уместным, без каких-либо обязательных условий) Ivan Kolesnikov 6 лет назад 0

2 ответа на вопрос

1
dirkt

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

Большое спасибо! Я проверил, и это прекрасно работает! Тихий, когда ледяной поток не работает и воспроизводится без ошибок, когда он снова запускается! Вывод UDP стабильный! Ivan Kolesnikov 6 лет назад 0
1
Aaron Muir Hamilton

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

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

# modprobe snd-aloop index=0 pcm_substreams=1 

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

Спасибо за ответ! Не могли бы вы объяснить, как направить поток ледового вещания на устройство обратной связи Alsa? Ivan Kolesnikov 6 лет назад 0
@IvanKolesnikov Это должно быть достижимо с любым плеером, способным к потоковой передаче из IceCast, если вы играете на устройство hw: Loopback, 0,0 Например, с MPV вы должны сделать `mpv --audio-device = alsa / hw: Loopback, 0,0 http: // example.com / path / to / icecast / stream` или с SoX, вы должны сделать `sox http://example.com/path/to/icecast/stream -t alsa hw: Loopback, 1,0`. Aaron Muir Hamilton 6 лет назад 1

Похожие вопросы