如何从Docker容器访问JACK音频

时间:2019-07-02 19:52:12

标签: linux docker audio jack

我在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>

3 个答案:

答案 0 :(得分:0)

来自this

  

共享内存使用的IPC中的另一个是共享内存。 JACK系统中所有共享内存的基类是JackShmMemAble。需要进入共享内存的对象需要从该基类派生。此类的实现再次依赖于平台。对于Linux系统,使用System V共享内存API。共享内存用于多种目的,例如向客户端RT线程通知其必须设置的优先级。模板类JackShmReadWritePtr,JackShmReadWritePtr1和JackShmReadPtr用于访问共享内存。

所以,我认为您应该像下一个一样将挂载/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>

答案 1 :(得分:0)

您尝试过使用docker run --ipc=host (...)吗?

我认为文档是指IPC上下文中的共享内存。我猜--ipc=host有一些安全隐患(因为容器将为运行中的用户访问主机上的所有IPC)。另外,也许您需要在Docker容器中以与主机上的用户相同的UID运行该进程。

答案 2 :(得分:0)

你会想要使用

 --device /dev/snd:/dev/snd

working with sound in docker