pulseaudio가 BT 장치에 대한 음질 연결을 처리하는 이유는 무엇입니까?

pulseaudio가 BT 장치에 대한 음질 연결을 처리하는 이유는 무엇입니까?

저는 Linux를 처음 접했고 Bluetooth 스크립팅을 처음 접했습니다. 지금까지 내가 찾은 내용은 다음과 같습니다.

  1. Bluez는 기본 BT 스택입니다.
  2. BluezTools는 Bluez와 보다 쉽게 ​​상호 작용하는 데 사용할 수 있는 유틸리티 세트입니다.
  3. DBus는 Bluez가 하드웨어와 직접 상호 작용할 때 연결하는 인터페이스입니다.
  4. PulseAudio는 시스템에서 오디오 생성을 담당하는 하위 시스템입니다.

이것은 의미가 있습니다. 블루투스 헤드폰 세트가 있다고 가정해 보겠습니다. 제가 기대하는 것은 (페어링 및 신뢰 후) BT 헤드폰의 특정 프로필에 직접 연결할 수 있는 명령을 실행할 수 있다는 것입니다.

제가 염두에 두고 있는 기술적 경로는 다음과 같습니다.

  1. 헤드폰을 켜십시오.
  2. BluezTools 명령 실행 - 예:BT 오디오-C
  3. 장치가 내가 원하는 서비스에 연결될 때까지 기다리세요
  4. PulseAudio는 이제 새로운 출력 장치를 선택해야 합니다.
  5. 오디오를 원래 오디오에서 새 출력 오디오(BT 헤드폰)로 변경하려면 다른 명령을 실행하십시오.
  6. 원활한 청취 경험을 즐겨보세요.

이 모든 것이 매우 논리적으로 보이지만 실제 구현은 그렇지 않으며 문제를 더 잘 이해하고 해결하려고 노력할 수 있도록 이유를 찾고 있습니다.

실제로 일어나는 일은 다음과 같습니다.

  1. 헤드폰을 켜십시오.
  2. BluezTools 명령 실행 - 예:BT 오디오-C
  3. 장치가 내가 원하는 서비스에 연결될 때까지 기다리세요
  4. PulseAudio는 이제 새로운 출력 장치를 선택해야 합니다.
  5. PulseAudio 명령을 실행하여 오디오 프로필을 전화 품질에서 고품질로 변경하십시오.

이에 대해 조금 더 확장해 보겠습니다. Bluetooth 헤드셋은 2가지 음질 모드(전화 및 Hi-Fi)를 제공합니다. 단 1개만 음악을 듣는 데 정말 적합합니다.

BT 헤드폰이 각 품질 모드를 서비스로 공개했으면 좋겠죠? 이 가정은 틀렸을 수도 있지만 다음과 같은 것을 기대했습니다.

bt-audio-c 고음질 프로필

또는

bt-audio-changeProfile 고음질 프로필

대신 Bluez는 장치에 대한 RAW 연결만 처리하는 것으로 보이며 여기에서 다음을 실행해야 합니다.pacmd 세트 카드 구성 파일 $INDEX a2dp

이것은 근본적으로 잘못된 것 같습니다. 따라서 오디오 하위 시스템의 품질 관리를 위해 펄스나 alsa 또는 기타 사운드 하위 시스템에 대해 다른 구현이 필요한 이유는 무엇입니까?

내가 무엇을 놓치고 있나요? Bluez/BluezTools 등을 사용하여 프로필에 직접 연결할 수 없는 이유는 무엇입니까?

답변1

Bluetooth 연결은 단순한 유선 헤드폰이나 스피커에 비해 대기 시간이 상당히 깁니다. 또한 연결 지연 시간은 Bluetooth 수신기의 속성에 따라 달라질 수 있으며 사용자가 움직일 때 무선 신호 강도에 따라 달라질 수도 있습니다.

애플리케이션과 PulseAudio 간의 인터페이스는 "여기 PCM 오디오 데이터가 있습니다. 재생해 보세요."처럼 간단할 수 있습니다. 그러나 더 복잡할 수도 있습니다. "여기 PCM 오디오 데이터가 있습니다. 이 데이터를 재생하고 50밀리초마다 얼마나 멀리 갔는지 알려주세요. 그러면 비디오 스트림과 동기화되지 않은 것 같으면 알려 드릴 수 있습니다. 다음으로 건너뛰세요. 아, 그리고 데이터가 하드웨어에서 직접 지원할 수 없는 샘플링 속도이기 때문에 리샘플링도 해야 합니다. 후자의 경우 PulseAudio는 오디오 장치에서 일부 입력을 제공할 수 있어야 합니다. 주어진 시간에 오디오 데이터가 실제로 얼마나 멀리 재생되는지 정확하게 결정하기 위한 피드백입니다.

따라서 PulseAudio가 Bluetooth 오디오 처리에 상당히 깊이 관여한다는 것은 이해가 됩니다. 중간 계층이 많을수록 정확한 피드백을 유지하지 않고 데이터가 버퍼링되어 립싱크가 손실될 가능성이 커집니다.

실제로 PulseAudio 이전에는 Bluetooth 오디오용 ALSA 백엔드가 있었지만 더 이상 사용되지 않습니다. 문제는 당시 ALSA의 인터페이스가 주로 기존 사운드 카드용으로 설계되었으며, Bluetooth의 잠재적으로 가변적인 오디오 대기 시간을 처리하기 어려웠다는 점이라고 생각합니다.

PulseAudio의 인터페이스는 처음부터 다양한 사운드 장치를 처리하고 스트림이 재생되는 동안 오디오 스트림을 전환할 수 있도록 설계되었으므로 내 생각에는 매우 진보된 오디오 지연 개념도 내장되어 있습니다.

예, PulseAudio 모듈이 아닌 BlueZ에서 구현할 수 있습니다. 그러나 BlueZ는 애플리케이션에 대한 오디오 인터페이스를 제공해야 합니다. PulseAudio는 시스템의 "모든" 오디오를 처리하려고 하기 때문에(현재 재생 중인 오디오를 스피커에서 Bluetooth로 또는 그 반대로 전송할 수 있도록) 어쨌든 PulseAudio와 인터페이스해야 합니다.

답변2

마침내 해결책을 찾았다고 생각합니다(두 개의 Linux Mint 시스템에서 테스트됨). 하지만 왜 다음과 같은 정확한 단계를 따라야 하는지는 모르겠습니다.

초기 단계:

  1. 블루맨 설치:sudo apt-get 설치 블루맨
  2. 블루투스 파일 편집:sudo nano/etc/bluetooth/main.conf마지막에 다음 줄을 추가하세요.비활성화 = 헤드폰

각 실행에 대해 다음을 수행합니다.

  1. Bluetooth 서비스를 다시 시작하십시오.sudo 서비스 블루투스 다시 시작
  2. 시스템 트레이의 blueman에서 장치를 엽니다.또는유형블루맨 매니저터미널에서
  3. 찾다Bluetooth 오디오 장치의 경우
  4. 장치를 마우스 오른쪽 버튼으로 클릭하고 다음과 같이 연결하십시오.이어폰
  5. 가다소리시스템 설정에서
  6. 한 번의 클릭으로 장치를 선택하세요
  7. 이제 다시 로 이동블루맨 매니저
  8. Bluetooth 장치를 마우스 오른쪽 버튼으로 클릭하고 오디오 프로필을 다음으로 설정하십시오.고음질 재생(A2DP 수신기)

단계를 놓친 경우 1단계로 이동하여 다시 시도하세요. 이것이 효과가 있는지 알려주세요.

편집하다: Linux Mint 19에서는 기본 Bluetooth 관리자가 고음질 재생과 완벽하게 작동하며 구성이 전혀 필요하지 않습니다!

답변3

구성에 따라 다를 수 있지만 다음은 잘 테스트된 몇 가지 명령입니다.

장치를 신뢰할 수 있는 장치로 설정해야 합니다. 이는 GUI를 통해 수행할 수 있습니다.

SDP 도구 탐색대상 장치에서 사용할 수 있는 프로토콜 및 채널에 대한 자세한 내용이 제공됩니다.

동기화된 오디오 출력을 사용할 때 Bluetooth a2p 오디오 수신기 설정이 더 쉽습니다. 설정하려면 도구를 참조하세요.파프스.

sudo apt install bluetooth 
sudo apt install bluez bluez-tools
sudo apt install rfkill rfcomm

장치를 부팅합니다. 어쨌든 hci0이어야 합니다.

sudo hciconfig hci0 up

원격 장치 나열:

sudo rfkill list

블루투스 네트워크 나열:

hcitool scan

사용 가능한 프로토콜을 찾아보세요:

sdptool browse 43:23:00:02:23:A7

연결된 장치:

sudo rfcomm connect hci0 43:23:00:02:23:A7

파일 보내기:

sudo bt-obex -p 43:23:00:02:23:A7 ~/images/tof.png

파일 수신:

sudo bt-obex -s /

채널(여기서는 채널 19)의 데이터를 스캔/대기하고 기본 폴더에 있는 dump라는 파일에 데이터를 씁니다.

sudo apt install bluez-hcidump

hcidump -i hci0 -O 19 -w ~/dump

대안: 때로는 페어링에 유용합니다.

sudo apt install bluetoothctl

bluetoothctl
power on
connect 43:23:00:02:23:A7
trust 43:23:00:02:23:A7
info 43:23:00:02:23:A7

[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# discoverable on
[bluetooth]# pairable on
[bluetooth]# scan on
[bluetooth]# pair 43:23:00:02:23:A7
[agent]PIN code: ####
[bluetooth]# trust 43:23:00:02:23:A7
[bluetooth]# connect 43:23:00:02:23:A7
[bluetooth]# info 43:23:00:02:23:A7

관련 정보