AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1004712
Accepted
Ondra Žižka
Ondra Žižka
Asked: 2018-02-10 16:02:39 +0800 CST2018-02-10 16:02:39 +0800 CST 2018-02-10 16:02:39 +0800 CST

如何在使用带有蓝牙耳机的麦克风时将音频配置文件保持在 A2DP?(一键通)

  • 772

我有一个 CEL-TEC F5A 耳机。规范说:

蓝牙 4.0,配置文件:耳机、免提、A2DP、AVRCP/HSP/HFP

它与高保真播放(A2DP 接收器)配置文件配合得很好。

当我想将音频输入切换到耳机麦克风时,输出配置文件会自动更改为Headset Head Unit (HFS/HFP)并且质量很差——比如 8bit 声音或其他东西。当我将它切换回 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

这里的问题不是麦克风不起作用,而是激活时音频质量变差。

sound microphone bash bluetooth 17.10
  • 7 7 个回答
  • 51055 Views

7 个回答

  • Voted
  1. akostadinov
    2020-06-14T11:11:05+08:002020-06-14T11:11:05+08:00

    Ondra,有一个很长的脉冲音频合并请求讨论,其中包含大部分信息。

    tl;博士; 为了让脉冲音频、bluez 和内核工作正常,需要更新(不是微不足道的)。同样hsphfpd需要一个单独的守护进程。

    内核更新没有进展,用户对维护者的输入将有助于推动事情的发展。考虑提供这样的。见这里。

    如果没有内核补丁,使用耳机的麦克风会导致糟糕的音频质量(HSP/HFP 操作模式)。

    但是有可能只有 Pulse 补丁(以及耳机的支持)可以启用 A2DP 双向音频,这对于大多数用途来说应该没问题。

    目前该补丁进展顺利。更多关于它的反馈不应该受到伤害。

    更新:上面提到的拉取请求中的事情升级得非常快,看起来 PulseAudio 可能永远不会实现适当的蓝牙支持。让我们希望Pipewire已经有了一些补丁。

    • 42
  2. Best Answer
    Ondra Žižka
    2018-02-24T13:00:27+08:002018-02-24T13:00:27+08:00

    我正要退回耳机并等待蓝牙 5.0 耳机,但后来意识到,这是我的 BT 4.0 笔记本电脑可以获得的最佳功能。所以我保留了它们。

    尽管如此,用 16 位 8000 Hz 的音频听一个法国人的声音并不是开会的正确方式。几天来,我一直在使用 Ubuntu 的声音设置对话框在两种模式之间切换,但这真的很烦人,你可以想象。

    所以我写了这个脚本,利用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
    

    希望这可以帮助某人:)

    • 22
  3. Ondra Žižka
    2018-02-10T17:37:56+08:002018-02-10T17:37:56+08:00

    根据这篇文章,我担心蓝牙不会让我在听到高质量声音的同时通过耳机说话。:/

    虽然不接受这个答案,但我仍然希望有人能想出一些方法来做到这一点。

    • 7
  4. Weslley S. Pereira
    2020-08-05T05:40:51+08:002020-08-05T05:40:51+08:00

    我建议使用一个简单的脚本来切换按钮https://gist.github.com/weslleyspereira/e8feeb9f1b7008ae1ffad2777e39d0dd以及来自 Ondra Žižka 的脚本:

    #! /usr/bin/python
    
    ''' switchHeadphones.py
    Tkinter toggle button to switch microphone On/Off using a script 
    
    Modification of the solution proposed in
        https://www.daniweb.com/posts/jump/1909448
    for the Mic On/Off script from
        https://gist.github.com/OndraZizka/2724d353f695dacd73a50883dfdf0fc6
    '''
    
    # Define the path for the script below, e.g.,
    script = "./switchHeadphones.sh"
    
    try:
        # Python2
        import Tkinter as tk
    except ImportError:
        # Python3
        import tkinter as tk
    import os
    
    __author__ = "Weslley S Pereira"
    __email__ = "[email protected]"
    
    def toggle(tog=[0]):
        '''
        a list default argument has a fixed address
        '''
        tog[0] = not tog[0]
        if tog[0]:
            os.system(script+' speak')
            t_btn.config(text='Switch Mic Off')
        else:
            os.system(script+' listen')
            t_btn.config(text='Switch Mic On')
    
    root = tk.Tk()
    root.title('Headphone  ')
    
    t_btn = tk.Button(text='Switch Mic On', width=15, command=toggle)
    t_btn.pack(pady=5)
    
    root.mainloop()
    
    • 3
  5. Stephan Windmüller
    2022-03-15T21:54:09+08:002022-03-15T21:54:09+08:00

    在使用或作为会话管理器时,您正在寻找的功能在PipeWire(PulseAudio 的替代品)中可用。第一个是默认的,启用自动配置文件切换是通过设置来实现的pipewire-media-sessionwireplumber

    bluez5.autoswitch-profile = true
    

    在~/.config/pipewire/media-session.d/bluez-monitor.conf

    重启后pipewire-media-session,默认使用A2DP配置文件。只有当检测到声音输入时,Pipewire 才会切换到 HSP/HFP 并在结束时切换回 A2DP。

    Arch Wiki和这篇博客文章对此进行了解释。

    • 2
  6. JanKanis
    2020-11-26T02:03:34+08:002020-11-26T02:03:34+08:00

    我的 Poly Voyager Focus UC 也遇到了同样的问题。太糟糕了(还没有)蓝牙堆栈中的支持。Voyager Focus 还配备了一个 USB 加密狗,可用于连接它。有了加密狗,Linux把耳机看成是声卡,所以不涉及Linux BT栈,双向音质不错。唯一的小问题是,如果我关闭耳机,Linux 不会看到这一点,也不会将音频播放切换回扬声器,所以我需要手动选择声音输出设备。

    在互联网的其他地方,我读到人们也通过使用第三方 USB 蓝牙音频适配器并将他们的耳机连接到该适配器而不是系统蓝牙来成功解决这种问题。根据我的发现,耳机和蓝牙音频适配器都需要在其 HSP(耳机配置文件)中支持“宽带语音”,这是可选的。宽带语音只有 16 kHz / 16 位,但这仍然比 8 kHz 标准 HSP 通道有很大改进。Linux 蓝牙堆栈尚不支持宽带音频。我不知道我的 Voyager Focus 加密狗是使用标准蓝牙和宽带语音,还是使用一些专有的无线协议扩展。

    • 1
  7. thisismydesign
    2021-01-20T06:56:25+08:002021-01-20T06:56:25+08:00

    许多蓝牙耳机显示为 2 个独立的设备,一个作为耳机/扬声器(无麦克风),一个作为耳机(带麦克风)。禁用耳机设备将强制使用 A2DP。这也可以以比该线程中的其他示例更简单的方式编写脚本。

    • 0

相关问题

  • 播放声音时延迟

  • 5.1环绕声[关闭]

  • 声音,在多个程序之间停止

  • 备份 bash 脚本未压缩其 tarball

  • 即使插入耳机,我的扬声器也会发出声音[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve