颤振音频无法在连接的音频设备(Airpods/蓝牙扬声器)上播放,而仅在手机主扬声器上播放

Flutter audio not playing on connected audio device(Airpods/bluetooth speakers) but only on phone main speaker

提问人:Kanwarpreet Singh 提问时间:10/19/2023 最后编辑:jraufeisenKanwarpreet Singh 更新时间:11/20/2023 访问量:56

问:

Pubspec.Yaml 文件

name: relationsguiden
description: App.
version: 1.0.0+2
environment:
  sdk: ">=2.7.0 <3.0.0"
dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  shared_preferences: ^2.0.13
  http: ^0.13.4
  url_launcher: ^6.0.20
  path_provider: ^2.0.9
  in_app_purchase: ^3.0.2
  signalr_client: ^0.1.6
  audioplayers: ^4.1.0
  flutter_local_notifications: ^12.0.3

  firebase_messaging: ^14.0.4
  cupertino_icons: ^1.0.5

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true
  assets:
    - images/

运行音频文件的代码。

  void _clickedPlayIcon(IntroTileType type) async {
    if (this._currentType == type) {
      if (this.audioPlayer.state == PlayerState.paused) {
        await this.audioPlayer.resume();
        setState(() => this._playerState = App.PlayerState.playing);
        return;
      } else if (this.audioPlayer.state == PlayerState.playing) {
        await this.audioPlayer.pause();
        setState(() => this._playerState = App.PlayerState.paused);
        return;
      }
    }

    if (this._currentType != null) {
      await this.audioPlayer.stop();
    }

    String url;
    if (type == IntroTileType.cheated) url = 'https://dev.recaptureit.se/relationsguiden/relationsguidenapi/Sound/Introduction/letDown.mp3';
    if (type == IntroTileType.letDown) url = 'https://dev.recaptureit.se/relationsguiden/relationsguidenapi/Sound/Introduction/letDown.mp3';
    if (type == IntroTileType.prevent) url = 'https://dev.recaptureit.se/relationsguiden/relationsguidenapi/Sound/Introduction/letDown.mp3';
    if (type == IntroTileType.suspect) url = 'https://dev.recaptureit.se/relationsguiden/relationsguidenapi/Sound/Introduction/letDown.mp3';
    if (type == IntroTileType.responsibility) url = 'https://dev.recaptureit.se/relationsguiden/relationsguidenapi/Sound/Introduction/letDown.mp3';

    if (url == null) return;

    setState(() {
      this._currentType = type;
      this._playerState = App.PlayerState.loading;
    });

    await audioPlayer.play(UrlSource(url));
    return;      
  }

flutter doctor总结:

[✓] Flutter (Channel stable, 3.7.7, on macOS 13.3.1 22E261 darwin-arm64, locale en-IN)
[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0-rc4)
[✓] Xcode - develop for iOS and macOS (Xcode 14.2)
[✓] Chrome - develop for the web
[✓] Android Studio
[✓] Android Studio (version 2022.3)
[✓] Android Studio (version 3.5)
[✓] Connected device (3 available)
[✓] HTTP Host Availability

• No issues found!

音频问题仅出现在 iOS 上,而不是 Android 上。

安卓 iOS 颤振

评论


答:

0赞 jraufeisen 11/20/2023 #1

你最好的办法是尝试全局,参见问题 #1545 中的讨论。AudioContext

  AudioPlayer.global.setGlobalAudioContext(
    AudioContext(
      iOS: AudioContextIOS(
        category: AVAudioSessionCategory.playAndRecord,
        options: const [
          AVAudioSessionOptions.mixWithOthers,
        ],
      ),
    ),
  );

目前有一个关于允许在不同音频设备之间切换的未解决问题 #1401

0赞 jbryanh 11/20/2023 #2

您可以使用包audio_session来设置会话,如果不需要录制,请设置会话:

final session = await AudioSession.instance;
await session.configure(AudioSessionConfiguration(
  avAudioSessionCategory: AVAudioSessionCategory.playback,
  avAudioSessionCategoryOptions: AVAudioSessionCategoryOptions.allowBluetooth,
  avAudioSessionMode: AVAudioSessionMode.spokenAudio,
  avAudioSessionRouteSharingPolicy: AVAudioSessionRouteSharingPolicy.defaultPolicy,
  avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none,
  androidAudioAttributes: const AndroidAudioAttributes(
    contentType: AndroidAudioContentType.speech,
    flags: AndroidAudioFlags.none,
    usage: AndroidAudioUsage.voiceCommunication,
  ),
  androidAudioFocusGainType: AndroidAudioFocusGainType.gain,
  androidWillPauseWhenDucked: true,
));

最重要的是

avAudioSessionCategory: AVAudioSessionCategory.playback,

其余的取决于您的喜好和需求。如果您还需要录制,取决于您要从哪里录制。