0

虽然使用 Liquidsoap 在 Docker 中的简单音频播放output.alsa(..)工作正常,但我无法让实时音频工作。基本上我想将模拟音频输入路由到模拟音频输出,例如output.alsa(input.alsa()). 以下三个示例在本机上工作正常:

示例 1:缓冲 I/O

# Successfully tested with Liquidsoap 1.4.4 & ALSA 1.1.3 (native)
# Low latency, no buffer underruns

set("frame.audio.size", 2048)
set("alsa.alsa_buffer", 8192)
set("alsa.buffer_length", 10)

input_analog = input.alsa(device="default", bufferize=true)
output.alsa(device="default", input_analog, bufferize=true)

示例 2:额外缓冲 I/O

# Successfully tested with Liquidsoap 1.4.4 + 1.1.3 (native)
# High latency, no buffer underruns

set("frame.audio.size", 2048)
set("alsa.alsa_buffer", 8192)
set("alsa.buffer_length", 10)

input_analog = input.alsa(device="default", bufferize=true)
input_analog = mksafe(buffer(input_analog))
output.alsa(device="default", input_analog, bufferize=true)

示例 3:无缓冲 I/O

# Successfully tested with Liquidsoap 2 & ALSA 1.2.4 (native)
# Almost no latency, no buffer underruns
# Doesn't work in Liquidsoap 1.4 because of some calculation bug

set("frame.audio.size", 7526)
set("frame.video.framerate", 0)

input_analog = input.alsa(device="default", bufferize=false)
output.alsa(device="default", input_analog, bufferize=false)

通过 Docker 中的这些示例,无论我尝试哪种缓冲区或帧设置,我都会得到大量的音频中断和缓冲区欠载。Docker Container 的 CPU 使用率通常 < 1%,有时会飙升至 5%。使用当前的 Liquidsoap 2 分支,在设置一些额外的高缓冲区和帧大小时情况会好得多,但仍然会发生欠载。

我正在像这样启动容器(之前还尝试过为容器提供额外 CPU 和内存的特定设置):

docker run -it \
    --network="host" \
    --mount type=tmpfs,destination=/tmp \
    -v /dev/snd:/dev/snd \
    -v "/etc/asound.conf":"/etc/asound.conf" \
    --group-add audio \
    --privileged \
    savonet/liquidsoap:main \
    ...

ALSA 设备的default定义很简单:

#/etc/asound.conf
defaults.pcm.card 2
defaults.ctl.card 2

需要什么秘方吗?你有一个例子,你是如何让它工作的?

也许这根本不是 Liquidsoap 的问题。希望结合一些隐藏的 Docker 标志来做一些特殊的 ALSA 设备配置就足够了。

4

1 回答 1

0

如果我首先在主机系统上播放音频,然后在启动 docker 之前停止播放,我发现所有示例都有效。

重新启动 docker 而不首先在主机上播放音频会导致所描述的缓冲区欠载。

- 编辑

另一个观察结果:在启动 Liquidsoap 之前在 docker-container(播放文件)中播放声音文件总是会导致缓冲区欠载。

于 2021-06-26T14:20:10.160 回答