音頻在脈衝/alsa 上失真,在 JACK 上工作正常。如何分析 JACK 為何正常工作並使用該知識來修復脈衝/alsa 配置?
為了測試和解決這個問題,我使用全新安裝的 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 錯誤跟踪。