У меня есть микрофон, и я могу записывать голос так:
arecord test.wav -r 22050 -f S32_LE -V mono
Пока все хорошо. Однако, когда стороннее программное обеспечение , которое я использую (которое, я думаю, использует ffmpeg для внутреннего использования), хочет использовать микрофон, оно выходит из строя, так как оно не использует вышеописанные параметры.
Я попытался перенести эти параметры в мой .asoundrc
, чтобы они были подобраны alsa.
Alsa Wiki сообщает мне, что плагин plug
можно использовать в Для указания rate
и format
:
Более сложным инструментом для преобразования является плагин типа pcm. синтаксис:
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 бит и 8000 Гц. Также я должен указать -V Mono
, чтобы я мог записать:
arecord test.wav -V mono
Recording WAVE 'test.wav' : Unsigned 8 bit, Rate 8000 Hz, Mono
############+ |
Так что, к сожалению, ни один из обязательных параметров не может быть добавлен в мои настройки.
Обновление
Я попытался записать, используя ffmpeg
, пытаясь воспроизвести c что:
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
плагина
Я попытался использовать асимметрический c подход, как предложено.
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.
Обновление
С некоторыми ALSA magi c от моего друга YW Мне удалось заставить арекорд работать без параметров, однако он по-прежнему использует худшие настройки при записи звука по умолчанию. Ключевым моментом здесь, по-видимому, было сопоставление моносигнала моей карты 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
}