如何配置不同的 ALSA 默认值以通过一台设备捕获并通过另一台设备播放?

Posted

技术标签:

【中文标题】如何配置不同的 ALSA 默认值以通过一台设备捕获并通过另一台设备播放?【英文标题】:How to configure different ALSA defaults for capture through one device and playback through another? 【发布时间】:2016-07-14 08:19:49 【问题描述】:

我正在寻求一些帮助来配置 Raspberry Pi 上的音频,因为到目前为止我在谷歌上的所有努力都失败了!

我的设置:

Raspberry PI 3(运行 Debian Jessie) 我用来捕获音频的 USB 网络摄像头 (Logitech) 用于播放的 3.5 毫米音频插孔中的外部扬声器

到目前为止,我已经设法将 ALSA 配置为默认情况下通过 USB 网络摄像头捕获并通过 3.5 毫米插孔播放。例如,以下工作正常:

# Capture from Webcam
arecord test.wav

# Playback through 3.5mm jack
aplay test.wav

默认情况下,这会捕获 8 位、8KHz、单声道的音频。但是,我希望默认捕获过程使用 16 位、16KHz、单声道设置,这就是我遇到的问题。

这是我的工作 ~/.asoundrc 文件:

pcm.!default 

        type asym

        playback.pcm 
                type hw
                card 1
                device 0
        

        capture.pcm 
                type plug
                slave 
                        pcm 
                                type hw
                                card 0
                                device 0
                        
                
        

还有我的/etc/modprobe.d/alsa-base.conf

options snd_usb_audio index=0
options snd_bcm2835 index=1

options snd slots=snd-usb-audio,snd-bcm2835

还有cat /etc/asound/cards的输出:

 0 [U0x46d0x825    ]: USB-Audio - USB Device 0x46d:0x825
                      USB Device 0x46d:0x825 at usb-3f980000.usb-1.4, high speed
 1 [ALSA           ]: bcm2835 - bcm2835 ALSA
                      bcm2835 ALSA

我已按照各种指南设置formatratechannels 属性,但均未成功。例如,这不起作用:

pcm.!default 

        type asym

        playback.pcm 
                type hw
                card 1
                device 0
        

        capture.pcm 
                type plug
                slave 
                        pcm 
                                type hw
                                card 0
                                device 0
                        
                        format S16_LE
                        rate 16000
                        channels 1
                
        

(我还尝试将这些属性移动到 pcm 块中,这是许多绝望的尝试之一!)

事实上,我完全没有在 Linux 上使用音频的经验,完全迷失了方向,非常感谢任何指导!

【问题讨论】:

【参考方案1】:

aplay 使用文件实际具有的任何示例格式,但arecord 创建一个新文件,因此如果您不想要愚蠢的默认值,则必须指定示例格式:

arecord -f S16_LE -r 16000 -c 1 test.wav

【讨论】:

是的,我已经通过指定参数进行录制,但我正在尝试了解如何配置内容,因此我不需要在录制时指定任何命令行参数。我认为~/.asoundrc 文件中的formatratechannels 参数可以做到这一点(也许他们做到了,而我只是错误地使用了它们),但到目前为止我还不够!跨度> 配置文件中的那些参数可以限制设备,但除非应用程序也使用相同的值,否则这不起作用。 (一些应用程序会询问设备它实际支持什么;arecord 不会。) 感谢您的澄清,这很有帮助。因此,也许我可以创建一个简单的 shell 脚本,解析 .asoundrc 的默认设置,然后使用这些参数调用 arecord

以上是关于如何配置不同的 ALSA 默认值以通过一台设备捕获并通过另一台设备播放?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CD 音轨输入 ALSA 驱动的声音输出设备?

Ubuntu 命令行配置默认声卡、录音播放与音量调节

在 C 中使用 ALSA 以不同的音量播放多个 wav 文件

关于 ALSA 驱动程序:如何正确处理音频设备

Archlinux 踩坑实录

Linux ALSA 音频库 配置和使用