Linux

音頻在脈衝/alsa 上失真,在 JACK 上工作正常。如何分析 JACK 為何正常工作並使用該知識來修復脈衝/alsa 配置?

  • November 12, 2020

為了測試和解決這個問題,我使用全新安裝的 Fedora 33,音頻設置或配置文件保持不變。

預設情況下,音頻嚴重失真(可以分辨出正在播放的內容,但總體上無法使用)。

但是,當我安裝並啟動jackd並使其使用以下設置執行時:

jackd -r -dalsa -dhw:0 -r48000 -p256 -n2

然後嘗試使用mpv(可以使用 JACK)的音頻文件,聲音清脆清晰,按預期工作

mpv --ao=jack test.flac

注意:也jackd-r44100作品。

這當然不是一個令人滿意的通用方法,因為不是每個軟體都能單獨使用 JACK,因此它不適用於 Firefox。

因為 JACK 能夠正確處理事情,我猜是脈衝或 alsa(自動)設置導致了問題?或者它可能是別的東西?

**簡而言之:**我如何使用 ALSA 配置(或類似的 pulseaudio)複製 JACK 所做的事情。最好通過 ALSA 的解決方案使這個答案也可以在沒有脈衝的情況下工作。當然,pulsuadio也有可能是導致問題的部分,我不知道。


附加資訊:

  • 輸出aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: Studio [Audiofuse Studio], device 0: USB Audio [USB Audio]
 Subdevices: 0/1
 Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 0: ALC1220 Analog [ALC1220 Analog]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 1: ALC1220 Digital [ALC1220 Digital]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
  • 輸出jackd -r -dalsa -dhw:0 -r48000 -p256 -n2
jackdmp 1.9.14
Copyright 2001-2005 Paul Davis and others.
Copyright 2004-2016 Grame.
Copyright 2016-2019 Filipe Coelho.
jackdmp comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details
no message buffer overruns
no message buffer overruns
no message buffer overruns
JACK server starting in non-realtime mode
self-connect-mode is "Don't restrict self connect requests"
audio_reservation_init
Acquire audio card Audio0
creating alsa driver ... hw:0|hw:0|256|2|48000|0|0|nomon|swmeter|-|32bit
configuring for 48000Hz, period = 256 frames (5.3 ms), buffer = 2 periods
ALSA: final selected sample format for capture: 32bit integer little-endian
ALSA: use 2 periods for capture
ALSA: final selected sample format for playback: 32bit integer little-endian
ALSA: use 2 periods for playback
  • 輸出aplay --dump-hw-params -D hw:Studio -t raw /dev/zero
Playing raw data '/dev/zero' : Unsigned 8 bit, Rate 8000 Hz, Mono
HW Params of device "hw:Studio":
--------------------
ACCESS:  MMAP_INTERLEAVED RW_INTERLEAVED
FORMAT:  S32_LE
SUBFORMAT:  STD
SAMPLE_BITS: 32
FRAME_BITS: [320 576]
CHANNELS: [10 18]
RATE: [44100 192000]
PERIOD_TIME: [125 297211)
PERIOD_SIZE: [6 13107]
PERIOD_BYTES: [240 524288]
PERIODS: [2 1024]
BUFFER_TIME: (62 594422)
BUFFER_SIZE: [12 26214]
BUFFER_BYTES: [480 1048576]
TICK_TIME: ALL
--------------------
aplay: set_params:1343: Sample format non available
Available formats:
- S32_LE
  • cat /proc/asound/Studio/stream0(僅“播放”)的輸出:
Playback:
 Status: Stop
 Interface 1
   Altset 1
   Format: S32_LE
   Channels: 18
   Endpoint: 1 OUT (ASYNC)
   Rates: 44100, 48000, 88200, 96000, 176400, 192000
   Data packet interval: 125 us
   Bits: 24
 Interface 1
   Altset 2
   Format: S32_LE
   Channels: 18
   Endpoint: 1 OUT (ASYNC)
   Rates: 44100, 48000, 88200, 96000, 176400, 192000
   Data packet interval: 125 us
   Bits: 24
 Interface 1
   Altset 3
   Format: S32_LE
   Channels: 10
   Endpoint: 1 OUT (ASYNC)
   Rates: 44100, 48000, 88200, 96000, 176400, 192000
   Data packet interval: 125 us
   Bits: 24
   Channel map: FL FR FC LFE RL RR FLC FRC RC SL

我明白了,我嘗試使用 sox 自己轉換文件。然後我得到的是以下錯誤:播放 WAVE ‘CONVERTED-test.wav’ : Signed 32 bit Little Endian, Rate 44100 Hz, Stereo aplay: set_params:1349: Channels count non available。使用帶有 sox 命令的通道 18 最終使 aplay 正確且清晰地播放文件!注意:當我使用帶有通道 10 的 sox 轉換文件時,文件也由 aplay 播放,但在這種情況下,文件再次失真。任何其他通道數都將導致通道數不可用錯誤。

所以看起來 10 通道的介面在驅動程序或其他地方有 bug,你需要說服 Pulseaudio 使用 18 通道的介面。

查看module-alsa-sink,您可以將其視為 ALSA 設備。

這可能意味著您需要在~/.asoundrc.

您在hw 外掛中配置通道數,但我自己從未這樣做過,而且我沒有具有這些通道選擇的硬體。

所以我想這需要對各種配置文件進行一些實驗。這很難遠端完成,我無法為您提供分步說明。

另一種選擇是在 ALSA 跟踪器上送出錯誤報告。他們可能會發現驅動程序中的問題(如果是通用 USB 驅動程序,這可能需要一個怪癖),或者給您建議配置文件的外觀。

此處解釋了 ALSA 錯誤跟踪。

引用自:https://unix.stackexchange.com/questions/618497