ubuntu docker 调用宿主机声卡(alsa)

需求:访问宿主机声卡

docker 播放宿主机上的音乐文件,可在宿主机指定声卡上正常播放出声音
使用的是工具是alsa

docker镜像

  • 系统:ubuntu20.04

拉取一个纯净系统:

$ sudo docker pull ubuntu:20.04

宿主机

  • 系统:ubuntu
  • 使用外接耳机

可以直接打开镜像,安装环境;也可以使用dockerfile


方法一:镜像内安装

运行镜像

将需要的资源挂载,安装完后可以直接测试。这里使用的是宿主机的一个音频文件:musicDemo.mp3

docker run -it --privileged -v /dev/snd:/dev/snd -v $宿主机/audio/:/audio/ --name alsa-test $IMAGE_NAME /bin/bash

安装alsa工具

root@xxx:~# apt-get update
root@xxx:~# apt-get install -y vim alsa-utils

刚下载的ubuntu20.04纯净镜像,需要先更新一下apt

查看声卡驱动

root@xxx:~# aplay -l

也可在宿主机查看。因为这里的驱动列表是挂载的宿主机的

root@xxx:~# vim /etc/asound.conf

打开的配置文件,写入以下内容

pcm.!default{
	type hw
	card 1
	device 0
} 
ctl.!default{
        type hw
        card 1
        device 0
}
timer.!default{
        type hw
        card 1
        device 0
}

保存退出即可

/etc/asound.conf 必须添加,否则耳机中可能会没有声音

安装sox

使用play指令

root@xxx:~# apt-get install -y sox libsox-fmt-all

测试

root@xxx:~# cd audio/
root@xxx:~/audio/# play musicDemo.mp3
play WARN alsa: can't encode 0-bit Unknown or not applicable

music_demo.mp3:

 File Size: 6.62k     Bit Rate: 32.0k
  Encoding: MPEG audio    
  Channels: 1 @ 16-bit   
Samplerate: 24000Hz      
Replaygain: off         
  Duration: 00:00:01.66  

In:98.6% 00:00:01.63 [00:00:00.02] Out:72.0k [      |      ]        Clip:0    
Done.

耳机中听到声音则为正常


方法二:dockerfile

使用dockerfile创建镜像,这里只展示主要部分

查看声卡

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC1220 Analog [ALC1220 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: ALC1220 Digital [ALC1220 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: Device [USB Audio Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

记录指定声卡的信息。我这里耳机是: card 1, device 0

dockerfile主要部分

RUN apt-get update
# 安装alsa工具
RUN apt-get install -y vim alsa-utils
# 添加asound.conf配置文件
RUN echo -e 'pcm.!default{
\ttype hw
\tcard 1
\tdevice 0
}
ctl.!default{
\ttype hw
\tcard 1
\tdevice 0
}
timer.!default{
\ttype hw
\tcard 1
\tdevice 0
}' > /etc/asound.conf
# 安装play
RUN apt-get install -y sox libsox-fmt-all

测试

同方法一


热插拔

支持耳机热插拔,后续更新

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker是一种底层的容器化平台,允许开发人员在基于容器的环境中构建,部署和运行应用程序。由于Docker容器在本质上是一个隔离的环境,因此默认情况下,容器内的进程无法直接访问宿主机上的命令。 然而,Docker提供了几种方法来调用宿主机命令。 第一种方法是通过使用挂载卷来实现宿主机命令的调用。通过在运行容器时指定-v参数,可以将宿主机上的目录或文件挂载到容器中。这样,容器内的进程就可以直接访问挂载的目录或文件,从而可以运行宿主机上的命令。 第二种方法是通过在容器中安装Docker客户端来实现宿主机命令的调用。可以使用Docker官方提供的适用于不同操作系统的Docker客户端二进制文件,将其复制到容器内,并设置相应的环境变量和路径。这样,容器内的进程就可以像在宿主机上一样使用Docker命令,并与宿主机上的Docker引擎进行通信。 第三种方法是通过在容器内运行SSH服务器来实现宿主机命令的调用。可以在容器内安装和配置SSH服务器,并将宿主机上的SSH密钥添加到容器内的授权文件中。这样,可以通过SSH协议从宿主机上的终端远程登录到容器内,并在容器内运行宿主机上的命令。 总之,Docker提供了多种方式来调用宿主机命令,使得容器内的进程可以与宿主机上的资源进行交互和通信,实现更灵活和强大的容器化应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值