경고:이것은 Android에서 블루투스 스택 수정과 관련된 고급 가이드입니다. 이 가이드 전체를 읽고 주어진 지침을 정확히 따르세요.
Bluetooth 헤드셋과 Bluetooth 오디오가 꽤 대중화되었다는 사실에도 불구하고 Bluetooth 스트리밍을 통해 오디오 정보와 주파수의 일부가 공중에서 손실되기 때문에 Bluetooth가 오디오 품질을 감소시키는 것으로 입증되었기 때문에 오디오 애호가에게는 약간의 문제입니다.
이것이 일부 제조업체가 모든 헤드폰 및 대부분의 Bluetooth 장치에서 지원하는 표준 SBC Bluetooth 코덱보다 음질을 향상시키기 위해 aptX 및 LDAC 코덱을 출시하는 이유입니다. 그러나 aptX 및 LDAC 코덱이 있는 장치는 이러한 코덱이 있기 때문에 훨씬 더 비쌉니다. 소비자가 장기적으로 지불하는 라이선스 비용이 필요합니다.
SBC 블루투스 코덱의 낮은 오디오 품질은 현재 모든 블루투스 스택과 헤드폰 구성의 인위적인 제한으로 인해 발생하며 이 제한은 기존 장치에서 우회할 수 있습니다.
Bluetooth 오디오에 관심이 있는 경우 이 가이드의 끝에서 Bluetooth 오디오 로그 덤프를 가져오고 검사하여 Android의 Bluetooth 수신기에서 어떤 종류의 오디오 품질과 주파수가 나오는지 확인하는 방법을 보여드리겠습니다.
이 가이드의 대부분은 표준 SBC Bluetooth 코덱의 출력 품질을 크게 향상시키기 위해 Bluetooth 오디오 출력을 읽는 몇 가지 간단한 조정과 방법에 중점을 둡니다. 기기 모델에 따라 깜박이거나 조정합니다.
이 가이드의 끝 부분에는 많은 인기 있는 Android 기기에 대해 사전 패치된 Bluetooth 스택 목록이 있습니다. 이러한 스택은 다른 플래시 가능한 .zip과 마찬가지로 복구 시 플래시할 수 있습니다. Android에서 블루투스 스택 수정 가이드를 따르세요.
SBC 코덱에 대한 간략한 기술 정보
SBC에는 연결 설정 단계에서 협상되는 다양한 매개변수가 있습니다.
- 오디오 채널 유형 및 번호:통합 스테레오, 스테레오, 듀얼 채널, 모노
- 주파수 대역 수:4 또는 8,
- 한 패킷의 오디오 블록 수:4, 8, 12, 16,
- 양자화 비트 할당 알고리즘:Loudness, SNR;
- 양자화 프로세스에 사용되는 최대 및 최소 비트 풀:일반적으로 2-53입니다.
디코더는 이러한 매개변수의 조합을 지원해야 합니다. 인코더는 그 중 일부만 구현할 수 있습니다.
기존 Bluetooth 스택은 일반적으로 다음 프로파일을 협상합니다. 조인트 스테레오, 8밴드, 16블록, 음량, 비트풀 2..53. 이 프로필은 328kbps의 비트 전송률로 44.1kHz 오디오를 인코딩합니다.
Bitpool 매개변수는 동일한 프로필 내에서 비트 전송률에 직접적인 영향을 미칩니다. 높을수록 비트 전송률이 높아져 품질이 향상됩니다.
그러나 bitpool 매개변수는 특정 프로필에 바인딩되지 않습니다. 비트 전송률은 오디오 채널 유형, 주파수 대역 수, 오디오 블록 수와 같은 다른 매개변수의 영향도 크게 받습니다. 비트 풀을 변경하지 않고 비표준 프로필을 협상하여 간접적으로 비트 전송률을 높일 수 있습니다.
예를 들어 이중 채널은 각 채널에 대해 전체 비트풀을 사용하여 채널을 별도로 인코딩합니다. 장치가 공동 스테레오 대신 듀얼 채널을 사용하도록 강제하면 동일한 최대 비트풀인 617kbps에서 거의 두 배의 비트 전송률을 얻을 수 있습니다.
나에게 bitpool은 내부 변수여야 한다고 생각합니다. 비트풀 값이 다른 코덱 매개변수에 구속되지 않고 전역 값으로만 정의되는 것은 A2DP 사양 설계 오류입니다.
이러한 고정 Bitpool 및 Bitrate 값은 고품질 오디오에 대한 권장 값에서 비롯됩니다. 그러나 권장 사항은 프로필을 이러한 값으로 제한하는 변명이 아닙니다.
2007년부터 2015년까지 활성화된 A2DP 사양 v1.2에서는 모든 디코더가 최대 512kbps의 비트 전송률로 올바르게 작동해야 합니다.
SNK의 디코더는 최대 비트율을 초과하지 않는 가능한 모든 비트풀 값을 지원해야 합니다. 이 프로필은 사용 가능한 최대 비트 전송률을 모노의 경우 320kb/s, 2채널 모드의 경우 512kb/s로 제한합니다.
사양의 새 버전에는 비트레이트 제한이 없습니다. 2015년 이후에 출시된 최신 헤드폰은 최대 1000kbps 비트 전송률을 지원할 수 있다고 가정합니다. .
어떤 이유로 현재 테스트된 모든 Bluetooth 스택(Linux(PulseAudio), Android, Blackberry 및 macOS)에는 최대 비트 전송률에 직접적인 영향을 미치는 최대 비트풀 매개변수에 대한 인위적인 제한이 있습니다. 그러나 이것이 가장 큰 문제는 아니며 거의 모든 헤드폰도 최대 비트풀 값을 53으로 제한합니다.
대부분의 장치는 비트 전송률이 507kbps인 수정된 Bluetooth 스택에서 인터럽트 및 크랙 없이 잘 작동합니다. 그러나 이러한 비트 전송률은 표준 Bluetooth 스택이 있는 정상적인 조건에서는 절대 협상되지 않습니다.
***아래 가이드를 사용한 테스트에 필요함: bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent
PC에서 테스트하는 방법
높은 비트 전송률 SBC 헤드폰 호환성 테스트는 Bluetooth 어댑터가 있는 PC에서 가장 쉽게 수행할 수 있습니다. 가상 머신(가상 머신 내부의 USB 장치로 Bluetooth 어댑터를 연결하여 랩톱에 내장된 어댑터와도 작동함)에서 실행하거나 다음에서 부팅하여 실행할 수 있는 수정된 Bluetooth 스택이 있는 Ubuntu 이미지를 준비했습니다. USB 플래시 드라이브. 이 이미지는 485kbps 비트 전송률을 제공하는 듀얼 채널, 8밴드, 16블록, 음량, 비트풀 2..41, 44.1kHz 프로필을 사용합니다.
VM에서 실행
- Virtualbox 및 Virtualbox 확장 팩 다운로드:https://www.virtualbox.org/wiki/Downloads;
- Virtualbox를 설치하고 시작합니다.
- 파일 → 환경 설정 → 확장을 사용하여 확장 팩 설치
- 새 가상 머신 생성:Linux, Ubuntu(64비트), 1024 RAM. HDD를 생성하지 마십시오.
- 가상 머신 설정으로 이동하여 저장소에서 컨트롤러:IDE, 비어 있음을 선택하고 CD 아이콘을 누르고 → 가상 광 디스크 파일 선택
- 다운로드한 bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso를 선택합니다.
- 설정 창을 저장하고 닫고 가상 머신을 시작합니다.
- 오른쪽 하단의 USB 케이블 아이콘을 마우스 오른쪽 버튼으로 클릭하고 Bluetooth 어댑터를 선택합니다.
PC에서 실행
이미지는 BIOS/CSM 및 UEFI 부팅을 지원합니다.
- Etcher(https://www.balena.io/etcher/)를 사용하여 USB 플래시 드라이브에 이미지를 굽습니다. 이 작업은 USB 드라이브에 있는 모든 기존 파일을 삭제합니다.
- PC를 끕니다.
- USB 플래시 드라이브를 삽입하고 PC를 켜고 부팅 순서 버튼(보통 Esc 또는 F12)을 누릅니다.
- USB 플래시 드라이브를 선택합니다.
테스트 수행
- (선택 사항이지만 권장됨) 바탕 화면에서 "Btsnoop Dump" 스크립트를 두 번 클릭합니다. 나중에 분석을 위해 Bluetooth 데이터 캡처를 시작합니다. 터미널 창을 닫지 마십시오.
- 헤드폰을 페어링 모드로 전환합니다.
- 오른쪽 상단의 화살표를 클릭하고 블루투스 아이콘 → 블루투스 설정을 선택합니다.
- 헤드폰을 선택하고 페어링이 완료될 때까지 기다렸다가 창을 닫습니다.
- Ubuntu 볼륨을 약 2/3로 설정합니다. 또한 페어링 후에는 매우 클 수 있으므로 헤드셋 버튼을 사용하여 볼륨을 줄이십시오.
- "music" 폴더를 열고 "testrecord1.flac"를 재생합니다.
- (선택 사항이지만 권장됨) 플레이어를 닫고 터미널 창을 닫습니다. 데이터 캡처가 중지됩니다.
- (선택 사항이지만 권장됨) Firefox 브라우저를 열고 데이터 덤프(데스크톱의 btsnoop_hci.btsnoop)를 https://btcodecs.valdikss.org.ru/에 업로드
음악 폴더에서 다른 음악을 듣거나 자신의 음악을 업로드할 수 있습니다.
헤드폰에서 딱딱거리는 소리, 오디오 중단 또는 기타 사운드 왜곡이 없어야 합니다. 좋은 고품질 사운드가 들리면 헤드폰이 485kbps의 비트 전송률로 오디오를 지원한다는 의미입니다.
Android 기기에서 테스트하는 방법
Android 스마트폰이나 태블릿에서 테스트하려면 루트 권한이 필요한 수정된 블루투스 스택을 사용해야 합니다.
Android에서 블루투스 데이터 덤프를 캡처하는 방법
- 블루투스 끄기
- 개발자 설정에서 "Bluetooth HCI 스눕 로그 사용" 스위치를 활성화합니다.
- Bluetooth를 켜고 Bluetooth 메뉴를 사용하여 헤드셋에 연결합니다(중요합니다! 자동 연결을 허용하지 마십시오!).
- 짧은 오디오 샘플 재생
- 개발자 설정을 열고 'Bluetooth HCI 스눕 로그 사용' 스위치를 비활성화합니다.
- /storage/emulated/0/btsnoop_hci.log 또는 /data/misc/bluetooth/logs/btsnoop_hci.log가 생성되어야 합니다. 누락된 경우 텍스트 편집기로 /etc/bluetooth/bt_stack.conf를 열고 BtSnoopFileName 옵션에서 경로를 확인하세요.
헤드폰에서 딱딱거리는 소리, 오디오 중단 또는 기타 사운드 왜곡이 없어야 합니다. 패치된 라이브러리에서 좋은 고품질 사운드가 들리면 헤드폰이 512kbps의 비트 전송률로 오디오를 지원한다는 의미입니다.
위의 알고리즘을 주의 깊게 따르십시오. 특히, 헤드폰의 전원을 끄거나 페어링 후 연결을 끊는 경우 블루투스 설정에서 수동으로 헤드폰에 연결하는 것이 중요하며 자동 연결을 허용하지 마십시오!
최소 512kbit/s SBC를 지원하는 기기
- iBFree 1개 추가
- JBL 에베레스트 310
- JBL 에베레스트 700
- 스컬캔디 HESH 3
- 소니 WI-C400
- 소니 MDR-1ABT
- 소니 MDR-ZX770BT
- 소니 MDR-XB650BT
- 소니 MDR-XB950B1
- 소니 SBH50
- Bluedio T4s(Bitpool max 39. 듀얼 채널을 지원하지 않는 것에 응답하지만 강제 실행 시 462kbit/s로 작동합니다. A2DP 사양을 준수하지 않습니다.)
- Bluedio T5(듀얼 채널을 지원하지 않는 경우 응답하지만 강제로 작동하면 작동합니다. A2DP 사양을 준수하지 않습니다.)
- Bluedio T6 (듀얼채널을 지원하지 않는다고 응답하나 강제로 동작하면 동작함. A2DP 규격에 맞지 않음. Max 97220 칩을 채택)
- Marshall Major II 블루투스
- RealForce D1 오버드라이브
- 에디파이어 W830BT
- DEXP BT-250
- Logitech BT 어댑터
- Noname 자동차 헤드 유닛(CSR8645 칩)
- 소니 DSX-A400BT 자동차 헤드 유닛
512kbit/s 이상의 SBC를 지원하는 기기
- JBL 에베레스트 310(617-660kbit/s)
- 소니 WI-C400(576kbit/s)
- 소니 MDR-ZX770BT(617-660kbit/s)
- Marshall Major II Bluetooth(617-660kbit/s)
- Overdrive RealForce D1(730kbit/s, 듀얼 채널, 4개의 서브밴드)
높은 비트 전송률 또는 이중 채널에서 작동하지 않는 기기
- Harper HB-202(딱딱, Beken BK3256 칩)
- Sony Ericsson MW600(고주파 왜곡, 딱딱거리는 소리, 2009년 장치)
중요한 이유:SBC 328k 및 485k 대 aptX
aptX 음질에 대한 대중의 믿음과 달리 경우에 따라 표준 328k 비트 전송률을 사용하는 SBC보다 더 나쁜 음질을 생성할 수 있습니다.
SBC는 주파수 대역에 대해 양자화 비트를 동적으로 할당하여 "아래에서 위로" 기반으로 작동합니다. 전체 비트 전송률이 하위 및 중간 주파수에 사용된 경우 상위 주파수는 "차단"(음소거)됩니다.
aptX는 동일한 비트 수로 주파수 대역을 지속적으로 양자화하여 일정한 비트 전송률 코덱으로 만듭니다. 44.1kHz의 경우 352kbps, 48kHz의 경우 384kbps입니다. 대부분 필요한 주파수로 "비트를 전송"할 수 없습니다. SBC와 달리 aptX는 주파수를 "차단"하지 않지만 주파수에 양자화 노이즈를 추가하여 오디오의 동적 범위를 줄이고 때로는 딱딱거리는 소리를 발생시킵니다. 반대로 SBC는 "세부 사항을 먹습니다" – 가장 조용한 영역을 버립니다.
평균적으로 SBC 328k에 비해 aptX는 넓은 주파수 범위의 음악에서는 왜곡이 적지만 좁은 주파수 범위와 넓은 동적 범위의 음악에서는 SBC 328k가 때때로 이깁니다.
특별한 경우인 피아노 녹음을 고려해 보겠습니다. 스펙트로그램은 다음과 같습니다.
가장 많은 에너지는 0-4kHz 주파수에 있으며 최대 10kHz까지 지속됩니다.
aptX 파일의 스펙트로그램은 다음과 같습니다.
다음은 SBC 328k입니다.
SBC 328k가 주기적으로 16kHz 이상의 범위를 완전히 차단하고 이 값 미만의 범위에 대해 사용 가능한 모든 비트 전송률을 사용했음을 알 수 있습니다. 그러나 aptX는 인간의 귀가 들을 수 있는 주파수 스펙트럼에 더 많은 왜곡을 도입했으며, 이는 aptX 스펙트로그램에서 뺀 원본 스펙트로그램에서 볼 수 있습니다(밝을수록 더 많은 왜곡).
SBC 328k가 0에서 10kHz 범위의 신호 왜곡을 덜 도입했지만, 나머지는 생략했습니다:
SBC용 비트레이트 485k는 대역을 차단하지 않고 전체 주파수 범위를 저장하기에 충분했습니다.
이 오디오 샘플의 SBC 485k는 0-15kHz 범위에서 aptX보다 훨씬 우수하며 15-22kHz(어두울수록 왜곡이 적음)에서 작지만 여전히 눈에 띄는 차이가 있습니다.
높은 비트 전송률의 SBC로 전환하면 대부분의 경우 모든 헤드폰에서 aptX보다 우수한 사운드를 얻을 수 있습니다.
- original_and_aptx.zip
- sbc.zip
Android 5 – 7에서 블루투스 스택을 수정하는 방법
이러한 수정 사항은 재고 Android 블루투스 스택 Bluedroid(Android 5) 및 Fluoride(Android 6-7)에 적용해야 합니다. Qualcomm 수정 스택은 지원되지 않습니다.
표준 SBC 구성에서 공동 스테레오를 듀얼 채널로 교체
android/platform/external/bluetooth/bluedroid/btif/co/bta_av_co.c:99
코드:
CONST tA2D_SBC_CIE btif_av_sbc_default_config ={BTIF_AV_SBC_DEFAULT_SAMP_FREQ / * samp_freq * / A2D_SBC_IE_CH_MD_JOINT / * ch_mode * / A2D_SBC_IE_BLOCKS_16 / * block_len * / A2D_SBC_IE_SUBBAND_8 / * num_subbands * / A2D_SBC_IE_ALLOC_MD_L / * alloc_mthd * / BTA_AV_CO_SBC_MAX_BITPOOL / * max_bitpool * / A2D_SBC_IE_MIN_BITPOOL /* min_bitpool */};
A2D_SBC_IE_CH_MD_JOINT를 A2D_SBC_IE_CH_MD_DUAL로 바꿉니다.
이중 채널 우선순위 증가
android/platform/external/bluetooth/bluedroid/btif/co/bta_av_co.c:41
코드:
if (src_cap.ch_mode &A2D_SBC_IE_CH_MD_JOINT) pref_cap.ch_mode =A2D_SBC_IE_CH_MD_JOINT; else if (src_cap.ch_mode &A2D_SBC_IE_CH_MD_STEREO) pref_cap.ch_mode =A2D_SBC_IE_CH_MD_STEREO; else if (src_cap.ch_mode &A2D_SBC_IE_CH_MD_DUAL) pref_cap.ch_mode =A2D_SBC_IE_CH_MD_DUAL; else if (src_cap.ch_mode &A2D_SBC_IE_CH_MD_MONO) pref_cap.ch_mode =A2D_SBC_IE_CH_MD_MONO;A2D_SBC_IE_CH_MD_DUAL이 있는 경우 맨 위로 이동
<올 시작="3">
Android 블루투스 스택에는 비트풀 제한뿐만 아니라 비트 전송률 제한인 328kbit/s도 있습니다. 예를 들어 헤드폰이 48kHz용 비트풀 53을 지원하는 경우 Android는 328kbit/s 제한에 맞도록 비트풀을 줄입니다. 이것은 인코딩 단계에서 코덱 협상 후에 발생하며 Bluetooth SetCapabilities 패킷의 비트풀 값을 고려하지 않습니다.
android/platform/external/bluetooth/bluedroid/btif/src/btif_media_task.c:172
코드:
#define DEFAULT_SBC_BITRATE 328
512로 교체하십시오.
- (실험 전용) MTU 제한을 비활성화합니다.
~580kbit/s보다 높은 비트 전송률에 필요합니다.
btif/src/btif_media_task.c:174
코드:
/* 679바이트의 2DH5 페이로드 크기 - (4바이트 L2CAP 헤더 + 12바이트 AVDTP 헤더) */#define MAX_2MBPS_AVDTP_MTU 663
Android 8 – 9에서 블루투스 스택을 수정하는 방법
이러한 수정 사항은 테스트되지 않았지만 작동해야 합니다.
A2DP SBC 소스에 이중 채널 지원 추가
/platform/system/bt/stack/a2dp/a2dp_sbc.cc:55
코드:
/ * SBC SRC 코덱 기능 * / const 정적 tA2DP_SBC_CIE a2dp_sbc_caps ={A2DP_SBC_IE_SAMP_FREQ_44 / * samp_freq * / (A2DP_SBC_IE_CH_MD_MONO | A2DP_SBC_IE_CH_MD_JOINT) / * ch_mode * / (A2DP_SBC_IE_BLOCKS_16 | A2DP_SBC_IE_BLOCKS_12 | A2DP_SBC_IE_BLOCKS_8 | A2DP_SBC_IE_BLOCKS_4) / * block_len * / A2DP_SBC_IE_SUBBAND_8 / num_subbands * * / A2DP_SBC_IE_ALLOC_MD_L / alloc_method * * / A2DP_SBC_IE_MIN_BITPOOL / min_bitpool * * / A2DP_SBC_MAX_BITPOOL / max_bitpool * * / BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16 / bits_per_sample * * /} 사전>ch_mode에서 A2DP_SBC_IE_CH_MD_DUAL을 추가합니다.
기본 구성에서 조인트 스테레오를 듀얼 채널로 교체
/platform/system/bt/stack/a2dp/a2dp_sbc.cc:82
코드:
/ * 초기 SBC 코덱 설정 * / CONST tA2DP_SBC_CIE a2dp_sbc_default_config ={A2DP_SBC_IE_SAMP_FREQ_44 / * samp_freq * / A2DP_SBC_IE_CH_MD_JOINT / * ch_mode * / A2DP_SBC_IE_BLOCKS_16 / * block_len * / A2DP_SBC_IE_SUBBAND_8 / * num_subbands * / A2DP_SBC_IE_ALLOC_MD_L / * alloc_method * / A2DP_SBC_IE_MIN_BITPOOL, /* min_bitpool */ A2DP_SBC_MAX_BITPOOL, /* max_bitpool */ BTAV_A2DP_CODEC_BITS_16sample/}*_당 최대 비트풀A2DP_SBC_IE_CH_MD_JOINT를 A2DP_SBC_IE_CH_MD_DUAL로 교체하십시오.
듀얼 채널 우선 순위 높이기
/platform/system/bt/stack/a2dp/a2dp_sbc.cc:1155
코드:
static bool select_best_channel_mode (uint8_t ch_mode, ta2dp_sbc_cie * p_result, btav_a2dp_codec_config_t * p_codec_config) {if (ch_mode &a2dp_sbc_ie_ch_md_joint) {p_sult-> ch_mode =a2dp_sbc_ie_ch_md_joint; p_codec_config->channel_mode =BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; true를 반환합니다. } if (ch_mode &A2DP_SBC_IE_CH_MD_STEREO) { p_result->ch_mode =A2DP_SBC_IE_CH_MD_STEREO; p_codec_config->channel_mode =BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; true를 반환합니다. } if (ch_mode &A2DP_SBC_IE_CH_MD_DUAL) { p_result->ch_mode =A2DP_SBC_IE_CH_MD_DUAL; p_codec_config->channel_mode =BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; true를 반환합니다. } if (ch_mode &A2DP_SBC_IE_CH_MD_MONO) { p_result->ch_mode =A2DP_SBC_IE_CH_MD_MONO; p_codec_config->channel_mode =BTAV_A2DP_CODEC_CHANNEL_MODE_MONO; true를 반환합니다. } false를 반환합니다.}A2DP_SBC_IE_CH_MD_DUAL이 있는 경우 맨 위로 이동합니다.
비트 전송률 제한 증가
/platform/system/bt/stack/a2dp/a2dp_sbc_encoder.cc:42
코드:
#define A2DP_SBC_DEFAULT_BITRATE 328512로 교체하십시오.
- (실험 전용) MTU 제한 비활성화
~580kbit/s보다 높은 비트 전송률에 필요합니다.
/platform/system/bt/stack/a2dp/a2dp_sbc_encoder.cc:47
코드:
#define MAX_2MBPS_AVDTP_MTU 663