web-dev-qa-db-ja.com

Bluetoothヘッドセットでマイクを使用しながら、A2DPでオーディオプロファイルを保持する方法は? (プッシュツートーク)

CEL-TEC F5Aヘッドセットを持っています。仕様には次のように書かれています:

Bluetooth 4.0、プロファイル:ヘッドセット、ハンズフリー、A2DP、AVRCP/HSP/HFP

High Fidelity Playback(A2DP sink)プロファイルでうまく再生されます。

音声入力をヘッドセットのマイクに切り替えたい場合、出力プロファイルは自動的にHeadset Head Unit(HFS/HFP)に変わり、品質はひどくなります- 8ビットサウンドか何かのように。 A2DPに戻すと、入力はデスクトップマイクに戻ります。

他の質問をいくつか読んだことがありますが、A2DPは入力をサポートしないと思われますよね?しかし、HFS/HFPのHFP部分は高忠実度再生です。それはヘッドセットとして動作するように聞こえますが、それでも1950年代の電話のようには聞こえません。

話をするときにHFS/HFPになり、聞くときにA2DPになるように、プロファイル間の切り替えをどのように簡素化できますか?プッシュツートークとして。

Ubuntu 17.10、サウンドカスタマイズなしIIRC、すべて最新。
https://www.kabelmanie.cz/cel-tec-f5a-active-noise-bluetooth-stereo-sluchatka-s-mikrofonem/

私の出力:

$ pactl list cards
Card #0
        Name: alsa_card.pci-0000_00_03.0
...

Card #4
        Name: bluez_card.00_19_5D_25_6F_6C
        Driver: module-bluez5-device.c
        Owner Module: 30
        Properties:
                device.description = "F5A"
                device.string = "00:19:5D:25:6F:6C"
                device.api = "bluez"
                device.class = "sound"
                device.bus = "bluetooth"
                device.form_factor = "headset"
                bluez.path = "/org/bluez/hci0/dev_00_19_5D_25_6F_6C"
                bluez.class = "0x240404"
                bluez.alias = "F5A"
                device.icon_name = "audio-headset-bluetooth"
                device.intended_roles = "phone"
        Profiles:
                a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 10, available: yes)
                headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 20, available: yes)
                off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
        Active Profile: a2dp_sink
        Ports:
                headset-output: Headset (priority: 0, latency offset: 0 usec, available)
                        Part of profile(s): a2dp_sink, headset_head_unit
                headset-input: Headset (priority: 0, latency offset: 0 usec)
                        Part of profile(s): headset_head_unit

ここでの問題は、マイクが機能しないことではなく、アクティブにすると音質が悪化することです。

2
Ondra Žižka

ヘッドセットを返してBluetooth 5.0ヘッドセットを待つところだったのですが、それがBT 4.0ラップトップで得られる最高の機能であることに気付きました。だから私はそれらを保管しました。

それでも、16ビット8000​​ Hzのオーディオでフランス人を聞くことは、実際に会議を行う正しい方法ではありませんでした。数日間、Ubuntuのサウンド設定ダイアログを使用して2つのモードを切り替えていましたが、想像できるように、本当に面倒です。

そこで、2つのモードを切り替える pacmd を利用してこのスクリプトを作成しました。

  • クラッピーオーディオ、マイクオン
  • CDに近い品質のオーディオ、マイクはオフ

それは洗練されておらず、いくつかのデッドコードがあり、私は自分の電話IDを使用していますが、それはあなた自身のスクリプトのインスピレーションかもしれません。最新バージョン こちら

#!/bin/bash

####  Restart Bluetooth
if [ "$1" == "resetBT" ] ; then
  Sudo rfkill block bluetooth && sleep 0.1 && Sudo rfkill unblock bluetooth;
  exit;
fi;

#### Toggle listen/speak
if [ "$1" == "" -o "$1" == "toggle" ] ; then
  LINE=`pacmd list-sinks  | grep '\(name:\|alias\)' | grep -B1 F5A  | head -1`
  if [ "$LINE" == "" ] ; then echo "F5A headset not found"; exit; fi

  SINK_NAME="bluez_sink.00_19_5D_25_6F_6C.a2dp_sink"
  if $(echo "$LINE" | grep $SINK_NAME &> /dev/null) ; then
    echo "Detected quality sound output, that means we can't speak; switch that."
    $0 speak;
  else
    echo "Quality sound not found, switch to the good sound."
    $0 listen;
  fi
fi

#### Change the output to F5A
if [ "$1" == "listen" ] ; then
  LINE=`pacmd list-sinks  | grep '\(name:\|alias\)' | grep -B1 F5A  | head -1`
  if [ "$LINE" == "" ] ; then echo "F5A phones not found"; exit; fi
  #        name: <bluez_sink.00_19_5D_25_6F_6C.headset_head_unit>

  ## Get what's between <...>
  SINK_NAME=`echo "$LINE" | tr '>' '<' | cut -d'<' -f2`;

  ## The above gives an ID according to the active profile.
  ## To set manually:
  #SINK_NAME="bluez_sink.00_19_5D_25_6F_6C.headset_head_unit"
  #SINK_NAME="bluez_sink.00_19_5D_25_6F_6C.a2dp_sink"

  ## Switch the output to that.
  echo "Switching audio output to $SINK_NAME";
  pacmd set-default-sink "$SINK_NAME"

  #### Change profile to quality output + no mic. From `pacmd list-cards`:
  CARD="bluez_card.00_19_5D_25_6F_6C"
  PROFILE="a2dp_sink"   
  echo "Switching audio profile to $PROFILE";
  pacmd set-card-profile $CARD $PROFILE
  exit;
fi;

#### Input
if [ "$1" == "speak" ] ; then
  ## Change profile to crappy output + mic. From `pacmd list-cards`:
  CARD="bluez_card.00_19_5D_25_6F_6C"
  pacmd set-card-profile $CARD headset_head_unit

  LINE=`pacmd list-sources | grep '\(name:\|alias\)' | grep -B1 F5A  | head -1`
  if [ "$LINE" == "" ] ; then echo "F5A mic not found"; exit; fi
  SOURCE_NAME=`echo "$LINE" | tr '>' '<' | cut -d'<' -f2`;
  #SOURCE_NAME="bluez_source.00_19_5D_25_6F_6C.headset_head_unit"
  #SOURCE_NAME="bluez_sink.00_19_5D_25_6F_6C.a2dp_sink.monitor"
  echo "Switching audio input to $SOURCE_NAME";
  pacmd set-default-source "$SOURCE_NAME" || echo 'Try `pacmd list-sources`.';
fi;


####  Resources:

##  Why this is needed
# https://jimshaver.net/2015/03/31/going-a2dp-only-on-linux/

##  My original question
# https://askubuntu.com/questions/1004712/audio-profile-changes-automatically-to-hsp-bad-quality-when-i-change-input-to/1009156#1009156

##  Script to monitor plugged earphones and switch when unplugged (Ubuntu does that, but Nice script):
# https://github.com/freundTech/linux-helper-scripts/blob/master/padevswitch/padevswitch

これが誰かを助けることを願っています:)

1
Ondra Žižka

この記事 に基づいて、Bluetoothが高品質のサウンドを聞きながら同時にヘッドセットで話す喜びを私に与えないのではないかと心配しています。 :/

しかし、この答えを受け入れないで、誰かがそうする方法を思いつくことをまだ望んでいます。

0
Ondra Žižka