将声音也输出到耳机(by joshua)

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (作者:张华 发表于:2018-01-09)

问题

发现一个问题,在笔记本上使用了pyaudio包的应用在关闭扬声器仅使用耳机的情况下无法将声音送出去。(注:笔记本只有一个口)
而使用台式机没这个问题,即使关闭音箱只使用耳机,一样工作正常。(注:台式机是一个声卡,录音与扬声器分别出前面板和后面板,当音响接后面,耳机使用二合一线接前面板,可做到关闭音箱仍然可以从耳机抓取声音。)
这也是京东上所有3.5mm的手机麦克风(如山业 MM-MC24)在接单孔的手机或电脑时在录音时就无法同时接功放的原因(手机麦克风接手机的单孔3.5mm口了, 手机上的扬声器就关闭了, 但一般的手机麦克风并没有集成的喇叭,所以就不能放声了)(注:加一根音频一分二线可以将单孔口变成双口,未测试)
20200416更新,windows也在同样问题,python程序使用pyaudio包通过扬音器放音的同时,录音设备无法同时监听这个扬音器放出的声音.经测试,可以安装一个叫Virtual Audio Cable的虚拟声卡,然后将声音的输入输出均改为这个虚拟声卡,这样可以模拟stereo mix实现内部录音,但输入指向虚拟声卡了会造成无法用麦克风啊.这时就还需要用它的audio repeater功能将声音再拷一份给实际物理设备.
还发现了一款类似的叫voicemeeter的软件,具体使用方法见附件。mac系统下用叫soundflower的软件。

解决

在ubuntu上安装pulseaudio的前端控制工具pavucontrol (apt install pavucontrol), 然后执行pavucontrol命令后只须在Recording TAB处将改成’Monitor of Built-in Audio Analog Stereo’后在关闭音箱的情况下pyaudio可以直接监听耳机将声音再回传至耳机, 但是此时耳机的录音功能会失效.(Playback处维持不变仍为’Build-int Audio Analog Stereo’),

在这里插入图片描述
将声音也输出到耳机(by joshua)_第1张图片

注: android上因无pulseaudio故无法做这件事,google上搜索“android simultaneous output”到下列网页解释的很清楚 - https://stackoverflow.com/questions/14064693/audio-output-on-headset-speakerphone-simultaneously

附录一,将喇叭的声音同时从多个声卡输出

sudo apt-get install paprefs, 然后在paprefs应用中设置simultaneous output,重启(pulseaudio -k), 这时Sound设置中会出出一个虚拟声卡.

附录二,Chrome中设置声音的路径

chrome://settings/content#media-stream-mic

20180205更新

今天发现我的hexchat不能声音提示了,原来是在我安装pavucontrol之后这个工具和’System settings -> sound’里设置alert volume的声音是独立的,在pavucontrol将’Playback -> system sounds’设置之后能听到声音提示了。

20180901更新 - 将笔记本声音输出到手机

笔记本只有一个音频输出, 所以需要买一个USB声卡, 这样就有了麦克风输入口和音频输出口. 将这个输出口用一根公对公音频线连接, 另一端接音频一分二线的麦克风输入口, 音频一分二线的公口插手机.
注: 经实际测试, 上面步骤省略USB声卡也是可以的, 公对公音频线一端连电脑一端接音频一分二线的麦克风输入口, 音频一分二线公口接手机。

20191026更新 - stream ubuntu audio output to android over wifi

hua@t440p:~$ pactl list | grep tcp
	Name: module-native-protocol-tcp
	Name: module-simple-protocol-tcp
hua@t440p:~$ pactl list sources short |grep analog-stereo.monitor
1	alsa_output.pci-0000_00_1b.0.analog-stereo.monitor	module-alsa-card.c	s16le 2ch 44100Hz	IDLE

cat << EOF | sudo tee -a /etc/pulse/default.pa
#load-module module-simple-protocol-tcp source=1 record=true port=12344
load-module module-simple-protocol-tcp source=alsa_output.pci-0000_00_1b.0.analog-stereo.monitor rate=48000 format=s16le record=true port=12344
EOF
pulseaudio -k
pulseaudio --start --log-target=syslog
install app 'SIMPLE PROTOCOL PLAYER' in the cellphone

android底层使用tinyalsa, 并无pavucontrol可以将声音输出改为耳机带麦模式.

root@virgo:/ # cat /proc/asound/cards                                          
 0 [msm8974taikomtp]: msm8974-taiko-m - msm8974-taiko-mtp-snd-card
                      msm8974-taiko-mtp-snd-cardls
root@virgo:/ # ls /system/lib/libtinyalsa.so
/system/lib/libtinyalsa.so

https://wenku.baidu.com/view/9160ea8e14791711cd79170f.html
https://www.wildmountainechoes.com/equipment/audio-recording-with-a-smartphone/

anbox安装

sudo add-apt-repository ppa:morphis/anbox-support
sudo apt update
sudo apt install linux-headers-generic anbox-modules-dkms
sudo modprobe ashmem_linux
sudo modprobe binder_linux
ls -1 /dev/{ashmem,binder}
sudo snap install --devmode --beta anbox
#sudo apt install android-tools-adb
adb devices
adb install xxx.apk

耳机电流声解决

sudo alsamixer
按F6选择第二个(HDA INTEL PCH),然后把auto mute改为disable
sudo alsactl store
when “automute” is set to
“on”, your speakers will be automatically muted when you plug in your
headphones, and when you unplug your headphones, your speakers will be
automatically unmuted.

解决PulseAudio的爆音问题提声音质

Ubuntu下的音量调节范围比Windows要大得多,这并非是什么好事——音量条左端10%和右端20%几乎是废的,前者声音小得根本听不见,而后者则大得出现了爆音。有意义的音量条长度变短直接导致了音量调节非常困难,而且,就算是中间音量也经常出现爆音。做下列设置避免让pulseaudio来“智能”地根据主音量来调整PCM音量.
modify the file /usr/share/pulseaudio/alsa-mixer/paths/analog-output.conf.common
change 'volume=‘merge’ to 'volume=‘ignore’

安装最新的ALSA驱动

安装最新的ALSA驱动, 仅适用于HDA Intel声卡,如果是2005年之后的计算机一般都有一个HDA Intel声卡,it is for handling internal speakers, headphone jacks and microphones. USB or Bluetooth sound will not be affected.

#https://wiki.ubuntu.com/Audio/UpgradingAlsa/DKMS
#http://yangwenbo.com/articles/solve-ubuntu-intel-soundcard-problem-with-latest-alsa-driver.html
sudo add-apt-repository ppa:ubuntu-audio-dev/alsa-daily
sudo apt update
sudo apt install dkms oem-audio-hda-daily-dkms
hua@t440p:~$ alsactl -v
alsactl version 1.1.3

ALSA学习

https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture
ALSA(高级linux声音体系)是为声卡提供驱动的linux内核组件,以替代原先的OSS(开放声音系统),而PulseAudio则是声音服务器。软件要发声先传给Pulse处理(主要是多条音频流的混音)然后发给ALSA驱动发出声音。PulseAudio的出现解决了混音和声卡独占的问题, 但它并不是必须的, 可以跳过它直接控制ALSA的,只是没有了声音控制及混音功能(anroid上就是只有minialsa而没有PulseAudio导制声音无法输出到多声道,如同时输出到耳机和喇叭,插上耳机后此时如果耳机本身不带喇叭是在录音时无法同时输出的)。
其实ALSA也是自带了一个简单的混音器dmix的, 但因声卡独占它会经常出现问题。什么叫混音呢?简单来说, 就是多个软件同时发出声音, 但声卡的音频流只有一个, 解决办法就是将所有声音“混合”起来。如果没有混音器, 那么就会出现声卡独占的问题,这就是PulseAuddio的存在价值了, 同时, 有了PulseAudio你可以分别控制各个软件的音量。

查看音频设备
hua@t440p:~$ cat /proc/asound/cards 
 0 [HDMI           ]: HDA-Intel - HDA Intel HDMI
                      HDA Intel HDMI at 0xf1630000 irq 32
 1 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0xf1634000 irq 31
 2 [U0x46d0x81b    ]: USB-Audio - USB Device 0x46d:0x81b
                      USB Device 0x46d:0x81b at usb-0000:00:14.0-3, high speed

查看音频输入
hua@t440p:~$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: PCH [HDA Intel PCH], device 0: ALC3232 Analog [ALC3232 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: U0x46d0x81b [USB Device 0x46d:0x81b], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

查看音频输出
hua@t440p:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: HDMI [HDA Intel HDMI], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: HDMI [HDA Intel HDMI], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: HDMI [HDA Intel HDMI], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: HDMI [HDA Intel HDMI], device 9: HDMI 3 [HDMI 3]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: HDMI [HDA Intel HDMI], device 10: HDMI 4 [HDMI 4]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 0: ALC3232 Analog [ALC3232 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

查看音频输出
使用speaker-test测试默认音频输出, 默认输出设备通过apply -L查看
hua@t440p:~$ aplay -L |grep -i '^default' -A 1
default
    Playback/recording through the PulseAudio sound server
使用‘aplay test.wav -D plughw:CARD=PCH,DEV=0’来指定测试音频来测试,输出设备通过apply -L查看

检测音频输入
使用arecord录制音频输入:
-f 表示音频格式。cd (16 bit little endian, 44100, stereo)
-d 录制几秒
-c 几个通道,如录制4个麦的麦克风阵列:-c 4
-D 使用ALSA的哪个设备:-D hw:1,0表示使用card 0下的device 0设备
arecord -f cd -d 5 -c 4 -D hw:1,0 > a.pcm #
aply a.pcm

PulseAudio GUI工具pavucontrol
pavucontrol是PulseAudio的GUI工具(PulseAudio Volume controler)用于配置与控制音频设备

ubuntu取消屏幕跟读器

super+alt+s

voicemeeter使用

首先安装voicemeeter普通版,香蕉版也试了没有声音,后来换成普通版就好了。下载地址:https://www.vb-audio.com/Voicemeeter/index.htm
安装后重启机器,然后做两个设置:

  • 在控制面板 -> 声音中将输入输出全改成voicemeeter虚拟设备
  • 然后做如图所示设置:
    将声音也输出到耳机(by joshua)_第2张图片
    这样设置后:
  • 控制面板中默认输入输出都使用虚拟设备,这样像python这样应用也会默认输出到虚拟设备, 从而实现了内录
  • 同时voicemeeter中也设置了将虚拟设备输出到物理设备从而喇叭放音,将麦克风输入到虚拟设备从而实现了也可以从麦克风录音,但是需要平时将voicemeeter一直开着,否则无法实现音箱放音. 所以点它的设置,设置它开机自启,同时显示在拖盘中

Reference

[1] https://www.jianshu.com/p/c2bb45d4dad9

你可能感兴趣的:(system)