热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在docker容器中使用音频运行应用程序

如何解决《在docker容器中使用音频运行应用程序》经验,为你挑选了2个好方法。

这个问题的灵感来自于您是否可以在docker容器中运行GUI应用程序?.

基本的想法是运行带有音频和ui的应用程序(vlc,firefox,skype,...)

我正在使用pulseaudio搜索docker容器,但我发现所有使用pulseaudio流在tcp上的容器.(应用程序的安全沙箱)

https://gist.github.com/hybris42/ce429de428e5af3a344a

https://github.com/jlund/docker-chrome-pulseaudio

https://github.com/tomparys/docker-skype-pulseaudio

在我的情况下,我会优先从容器内的应用程序直接播放音频到我的主机pulseaudio.(没有ssh隧道和臃肿的docker图像)

Pulseaudio因为我的qt app正在使用它;)



1> A. Binzxxxxx..:

我花了一些时间才发现需要什么.(Ubuntu的)

我们从docker run命令开始 docker run -ti --rm myContainer sh -c "echo run something"

ALSA:
我们需要/dev/snd和一些硬件访问看起来像.当我们把它放在一起时我们有

docker run -ti --rm \
    -v /dev/snd:/dev/snd \
    --lxc-cOnf='lxc.cgroup.devices.allow = c 116:* rwm' \
    myContainer sh -c "echo run something"`

在没有lxc标志的新docker版本中你应该使用这个:

docker run -ti --rm \
    -v /dev/snd:/dev/snd \
     --privileged \
    myContainer sh -c "echo run something"`

的PulseAudio:
在这里我们需要基本/dev/shm,/etc/machine-id/run/user/$uid/pulse.但这并非全部(可能是因为Ubuntu以及他们过去是如何做到的).envirorment变量XDG_RUNTIME_DIR必须在主机系统和docker 容器中相同.您可能还需要,/var/lib/dbus因为某些应用程序正在从此处访问计算机ID(可能只包含指向"真实"计算机ID的符号链接).至少你可能需要~/.pulse一些临时数据的隐藏主文件夹(我不确定这一点).

docker run -ti --rm \
    -v /dev/shm:/dev/shm \
    -v /etc/machine-id:/etc/machine-id \
    -v /run/user/$uid/pulse:/run/user/$uid/pulse \
    -v /var/lib/dbus:/var/lib/dbus \
    -v ~/.pulse:/home/$dockerUsername/.pulse \
    myContainer sh -c "echo run something"

在新的docker版本中,您可能需要添加--privileged.
当然,您可以将它们组合在一起并将其与xServerui转发一起使用,如下所示:https://stackoverflow.com/a/28971413/2835523

仅举几个:

你可以处理大部分(所有没有使用过的id) dockerfile

uid=$(id -u)得到的用户ID和GID与id -g

使用此ID创建docker用户

创建用户脚本:

mkdir -p /home/$dockerUsername && \
echo "$dockerUsername:x:${uid}:${gid}:$dockerUsername,,,:/home/$dockerUsername:/bin/bash" >> /etc/passwd && \
echo "$dockerUsername:x:${uid}:" >> /etc/group && \
mkdir /etc/sudoers.d && \
echo "$dockerUsername ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/$dockerUsername && \
chmod 0440 /etc/sudoers.d/$dockerUsername && \
chown ${uid}:${gid} -R /home/$dockerUsername


ALSA方法对我不起作用。我收到以下错误`ALSA lib pcm_dmix.c:1029:(snd_pcm_dmix_open)无法打开从属服务器`。

2> ctitze..:

受您发布的链接的启发,我能够创建以下解决方案。它是我所能得到的那样轻巧。但是,我不确定它是否(1)是安全的,并且(2)是否完全适合您的用例(因为它仍然使用网络)。

    paprefs在主机系统上安装,例如sudo apt-get install paprefs在Ubuntu计算机上使用。

    启动PulseAudio首选项,转到“网络服务器”选项卡,然后选中“启用对本地声音设备的网络访问”复选框[1]

    重启你的电脑。(仅重启Pulseaudio在Ubuntu 14.10上对我不起作用)

    在您的容器中安装Pulseaudio,例如 sudo apt-get install -y pulseaudio

    在您的容器中,运行export "PULSE_SERVER=tcp::"。例如,export "PULSE_SERVER=tcp:172.16.86.13:4713"[2]。您可以ifconfig使用pax11publish[1] 查找IP地址,使用Pulseaudio端口查找。

    而已。如果IP地址和Pulseaudio端口可能会发生变化,则应该自动执行步骤5。另外,我不确定Docker是否永久存储诸如PULSE_SERVER以下的环境变量:如果不是,则必须在每个容器启动后对其进行初始化。

由于我目前正在研究与OP类似的问题,因此希望使我的方法变得更好的建议将不胜感激。

参考文献:
[1] https://github.com/jlund/docker-chrome-pulseaudio
[2] https://github.com/jlund/docker-chrome-pulseaudio/blob/master/Dockerfile

更新(可能是更好的解决方案):
这也可以使用Unix套接字而不是TCP套接字来工作:

    用以下命令启动容器 -v /run/user/$UID/pulse/native:/path/to/pulseaudio/socket

    在容器中,运行 export "PULSE_SERVER=unix:/path/to/pulseaudio/socket"

/path/to/pulseaudio/socket可以是任何东西,用于测试目的,我使用/home/user/pulse
也许它甚至可以在主机上使用与默认套接字相同的路径(照顾$ UID部分),这样最终的解决方案将是-v /run/user/$UID/pulse/native:/run/user//pulse; 我还没有测试过。


推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • VSCode与Gitee集成:项目提交的高效实践
    本文介绍如何利用VSCode内置的Git工具将项目提交到Gitee,简化Git命令的使用,提升代码管理效率。同时分享一些常见的踩坑经验和解决方案。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
  • 本文探讨了如何利用HTML5和JavaScript在浏览器中进行本地文件的读取和写入操作,并介绍了获取本地文件路径的方法。HTML5提供了一系列API,使得这些操作变得更加简便和安全。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • 一个登陆界面
    预览截图html部分123456789101112用户登入1314邮箱名称邮箱为空15密码密码为空16登 ... [详细]
author-avatar
lovely--蕙蕙_868
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有