如何从 Docker 容器访问 JACK 音频
Posted
技术标签:
【中文标题】如何从 Docker 容器访问 JACK 音频【英文标题】:How to access JACK audio from a Docker container 【发布时间】:2019-11-13 11:58:22 【问题描述】:我在 Docker 容器中有一个多媒体应用。我想将它连接到我在主机系统中运行的 JACK 音频服务器。我该怎么做?
这是我当前(但不工作)docker run
命令:
docker run \
--rm \
-i -t \
-u $(id -u):$(id -g) \
-v $(pwd):/home/app/build \
-v $HOME:/home/app \
-v /media:/media \
-v /usr/local/lib64:/usr/local/lib64 \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /etc/machine-id:/etc/machine-id \
-v /run/user/$(id -u)/pulse:/run/user/$(id -u)/pulse \
-v $HOME/.pulse:/home/app/.pulse \
--env DISPLAY \
--env HOME='/home/app' \
--privileged \
--group-add $(getent group audio | cut -d: -f3) \
--name "app" \
<image name> <parameters>
【问题讨论】:
你有没有找到解决这个问题的方法?我有兴趣做类似的事情 @ChefCyanide 还没有,很遗憾! 【参考方案1】:来自this:
共享内存 IPC 使用的另一个来源是共享内存。 JACK 系统中所有共享内存的基类是 JackShmMemAble。需要去共享内存的对象需要从这个基类派生。此类的实现再次依赖于平台。对于 Linux 系统,使用了 System V 共享内存 API。共享内存用于多种目的,例如通知客户端 RT 线程它必须将自己设置为什么优先级。模板类 JackShmReadWritePtr、JackShmReadWritePtr1 和 JackShmReadPtr 用于访问共享内存。
所以,我认为你应该像 next 一样将 mount /dev/shm
绑定到容器,然后我猜容器中的客户端可以通过共享内存与主机中的插孔音频服务器通信:
docker run \
--rm \
-i -t \
-u $(id -u):$(id -g) \
-v /dev/shm:/dev/shm \
-v $(pwd):/home/app/build \
-v $HOME:/home/app \
-v /media:/media \
-v /usr/local/lib64:/usr/local/lib64 \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /etc/machine-id:/etc/machine-id \
-v /run/user/$(id -u)/pulse:/run/user/$(id -u)/pulse \
-v $HOME/.pulse:/home/app/.pulse \
--env DISPLAY \
--env HOME='/home/app' \
--privileged \
--group-add $(getent group audio | cut -d: -f3) \
--name "app" \
<image name> <parameters>
【讨论】:
我已将-v /dev/shm:/dev/shm
添加到配方中,但没有成功。访客应用程序拒绝与 Jack 交谈(未找到设备)。顺便说一句,链接很好!【参考方案2】:
你试过docker run --ipc=host (...)
吗?
我认为文档是指 IPC 上下文中的共享内存。我猜--ipc=host
有一些安全隐患(因为容器将有权访问主机上正在运行的用户的所有 IPC)。此外,也许您需要在 docker 容器中使用与主机上的用户相同的 UID 运行该进程。
【讨论】:
【参考方案3】:你会想要使用
--device /dev/snd:/dev/snd
working with sound in docker
【讨论】:
以上是关于如何从 Docker 容器访问 JACK 音频的主要内容,如果未能解决你的问题,请参考以下文章