gpt4 book ai didi

audio - 在 .asoundrc 中存储参数不适用

转载 作者:行者123 更新时间:2023-12-02 06:02:13 28 4
gpt4 key购买 nike

我有一个麦克风,我可以像这样录制声音:

arecord test.wav -r 22050 -f S32_LE -V mono

到目前为止一切顺利。然而,当 third party software我正在使用的(我认为内部使用 ffmpeg)想要使用它失败的麦克风,因为它不使用上述参数。

我现在尝试将这些参数移至我的 .asoundrc 中,以便 alsa 能够获取它们。

The Alsa Wiki告诉我可以使用 plug 插件来指定 rateformat:

A more complex tool for conversion is the pcm type plug. the syntax is:

type plug                  # Format adjusted PCM
slave STR # Slave name (see pcm_slave)
# or
slave { # Slave definition
pcm STR # Slave PCM name
# or
pcm { } # Slave PCM definition
[format STR] # Slave format (default nearest) or "unchanged"
[channels INT] # Slave channels (default nearest) or "unchanged"
[rate INT] # Slave rate (default nearest) or "unchanged"
}
route_policy STR # route policy for automatic ttable generation
# STR can be 'default', 'average', 'copy', 'duplicate'
# average: result is average of input channels
# copy: only first channels are copied to destination
# duplicate: duplicate first set of channels
# default: copy policy, except for mono capture - sum
ttable { # Transfer table (bidimensional compound of
# cchannels * schannels numbers)
CCHANNEL {
SCHANNEL REAL # route value (0.0 ... 1.0)
}
}

所以我设置了一个像这样的插件:

pcm.!default {
type asym
playback.pcm {
type plug
slave.pcm "softvol"
}
capture.pcm {
type plug
slave {
pcm "plughw:0" # this works
rate 22050 # does not apply
format S32_LE # does not apply
}
}
}

pcm“plughw:0” 被拾取,但是速率和格式回落到 8 位和 8000Hz。另外,我必须指定 -V Mono 以便我可以录制:

arecord test.wav -V mono
Recording WAVE 'test.wav' : Unsigned 8 bit, Rate 8000 Hz, Mono
############+ |

很遗憾,所有必需的参数都无法添加到我的设置中。

更新

我尝试使用 ffmpeg 进行录制,试图模仿:

ffmpeg -f alsa -ac 1 -i plughw:0 output.wav -ar 22050 -f S32_LE

录音开始,但没有录制任何音频,并且速率和格式再次混合:

aplay output2.wav 
Playing WAVE 'output2.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono

使用 asym 插件更新

我确实按照建议尝试了非对称方法。

pcm.my_mic {
type hw
card 0
channels 1
format S32_LE
}

pcm.duplex {
type asym
playback.pcm "dmixer"
capture.pcm "my_mic"
}

pcm.!default {
type plug
slave.pcm "duplex"
}

但是,当我输入 arecord test.wav 时,系统会要求我提供格式,尽管它是在 .asoundrc 中配置的。

当我输入格式时,出现以下错误:

arecord -f S32_LE
Recording WAVE 'stdin' : Signed 32 bit Little Endian, Rate 8000 Hz, Mono
ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) Slave PCM not usable
arecord: set_params:1270: Broken configuration for this PCM: no configurations available.

更新

我的 friend Y.W. 提供了一些 ALSA 魔法。我能够在没有参数的情况下让 arecord 工作,但是,在默认情况下录制音频时,它仍然以某种方式使用较差的设置。这里的关键似乎是将我的 I2s 卡的单声道信号映射到立体声信号。

这是.asoundrc内容:

# This section makes a reference to your I2S hardware, adjust the card name
# to what is shown in arecord -l after card x: before the name in []
# You may have to adjust channel count also but stick with default first
pcm.dmic_hw {
type hw
card raspisound
channels 2
format S32_LE
rate 48000
}

# This is the software volume control, it links to the hardware above and after
# saving the .asoundrc file you can type alsamixer, press F6 to select
# your I2S mic then F4 to set the recording volume and arrow up and down to adjust the volume
# After adjusting the volume - go for 50 percent at first, you can do something like
# arecord -D dmic_sv -c2 -r 48000 -f S32_LE -t wav -V mono -v myfile.wav
pcm.dmic_sv {
type softvol
slave.pcm dmic_hw
control {
name "Boost Capture Volume"
card raspisound
}
min_dB -3.0
max_dB 30.0
}

# This plugin converts the mono input to stereo.
pcm.mono2stereo {
type route
slave.pcm dmic_sv
slave.channels 2
# ttable.input_channel.output_channel volume_gain
ttable.0.0 1
ttable.0.1 1
}

# The "plug" plugin converts channels, rate and format on request.
# In our case it converts the 32 format to whatever the application request.
pcm.convert {
type plug
slave {
pcm mono2stereo
}
}

pcm.convertplayback {
type plug
slave {
pcm "hw:0"
}
}

# Default capture and playback devices
pcm.!default {
type asym
capture.pcm convert
playback.pcm convertplayback
}


最佳答案

通过将从属 PCM 设备指定为 plughw:0,您创建了两个 plug 插件链。这意味着应用程序可以使用它喜欢的任何样本格式,上层插件会将其转换为 32 位的 22 kHz,下层插件会将其转换为硬件支持的任何格式。

要强制硬件使用指定的格式,请直接将其用作从机,使用hw:0

您无法阻止像 arecord 这样的程序使用不同的格式;这就是 plug 插件的全部目的。要检查硬件实际使用的格式,请将 -v 参数添加到 arecord 调用中。

关于audio - 在 .asoundrc 中存储参数不适用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60086259/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com