Хранение параметров в .asoundr c не применяется - PullRequest
3 голосов
/ 06 февраля 2020

У меня есть микрофон, и я могу записывать голос так:

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
}


1 Ответ

2 голосов
/ 06 февраля 2020

Указав ведомое устройство PCM как plughw:0, вы создали цепочку из двух plug плагинов. Это означает, что приложение может использовать любой пример формата, который пожелает, верхний плагин преобразует его в 22 кГц с 32 битами, а нижний плагин преобразует его в любой формат, поддерживаемый аппаратным обеспечением.

Для принудительной установки аппаратного обеспечения чтобы использовать указанный формат, используйте его непосредственно в качестве подчиненного с hw:0.

. Вы не можете запретить программам, таким как arecord, использовать другой формат; в этом вся цель плагина plug. Чтобы проверить, какой формат фактически используется оборудованием, добавьте параметр -v к вызову arecord.

...