音频播放器无法在iOS上运行|Flutter插件

2q5ifsrm  于 2023-02-13  发布在  Flutter
关注(0)|答案(5)|浏览(277)

我正在创建一个Flutter插件。目前,代码:
1.将字符串合成为音频文件
1.获取文件的路径
1.使用audioplayers播放音频文件
当我在Android中运行应用程序时,它完美地工作。然而,当我在iOS中运行它时,它不工作(假设相关权限/限制)

await flutterTts
        .synthesizeToFile(
            "This is my first audio synthesizer in Flutter", audioFileName)
        .then((success) => {
              if (success == 1)
                {
                  print('Successfully synthesized!!'),

                  // Gets the path to the generated file depending on the platform
                  pathFile =
                      Platform.isAndroid ? pathToFileAndroid : pathToFileIos,
                  pathFile
                      .then((pathToAudioFile) => {
                            print('Path to file: ' + pathToAudioFile),
                            // Speakers/earpiece
                            // int result = await player.earpieceOrSpeakersToggle();
                            // Sets the path to the file
                            audioPlayer.setUrl(pathToAudioFile),
                            audioPlayer.setVolume(1.0),
                            // Gets the duration of the audio file to be reproduced
                            // Plays the audio file
                            playLocal(audioPlayer, pathToAudioFile),
                          }) // pathFile
                      .catchError((e) {
                    print('Error: Unable to get the path to the audio file');
                  }),
                }, // success
            }) //synthesizeToFile
        .catchError((e) {
      print('Error during the synthesisation: $e');
    });
  }



/// Gets the path to the file to be accessed (iOS)
  static Future<String> get pathToFileIos async {
    Directory appDocDir = await getApplicationDocumentsDirectory();
    String appDocPath = appDocDir.path;
    print('appDocPath: $appDocPath');
    return '$appDocPath/$audioFileName';
  }

我实现了audioPlayer.onDurationChanged.listen来确认文件的路径是正确的(它实际上获得了文件的持续时间),但是文件并没有播放。
我正在使用模拟器测试应用程序,这是存储文件的路径
/本地用户/设备/设备ID/数据/容器/数据/应用程序/应用程序ID/文档/temp_audio_cue. caf
我阅读了关于此主题的不同问题,但没有找到适合我的案例的解决方案
我试过:
按照文档建议编辑传输安全性

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

使用AudioCachequestion
任何人有任何其他建议吗?我是否需要将文件移动到我的本地资产并使用AudioCache来复制文件?

    • 更新**

我还尝试添加标志isLocal

playLocal() async {
    int result = await audioPlayer.play(localPath, isLocal: true);
  }

根据documentation是需要的原因
之所以需要isLocal标志,只是因为iOS和macOS在这方面存在差异
返回1,所以我猜是成功的意思,但是声音还是没有触发,会不会是模拟器出故障了?

"iOS => call startHeadlessService, playerId ID"
"iOS => call setUrl, playerId ID"
"iOS => call setVolume, playerId ID"
"iOS => call play, playerId ID"
2021-02-03 11:59:33.149925+0100 Runner[61496:850044] flutter: Played successfully?: 1

我还测试了用错误的路径调用playLocal(),它一直返回1,但在返回后显示以下错误:
图文件叉打开主文件按CFURL指示错误= 2(错误号)(打开失败)
尽管如此,使用正确的localPath调用方法不会触发错误,因此我假设它应该正确地播放它。

    • 注**

如果不调用playLocal(),而是调用flutter_tts.speak('test'),它就可以工作,因此,错误可能与audioplayers有关。
我使用的版本是flutter_tts ^2.1.0audioplayers: ^0.17.3

evrscar2

evrscar21#

final AudioContext audioContext = AudioContext(
    iOS: AudioContextIOS(
      defaultToSpeaker: true,
      category: AVAudioSessionCategory.ambient,
      options: [
        AVAudioSessionOptions.defaultToSpeaker,
        AVAudioSessionOptions.mixWithOthers,
      ],
    ),
    android: AudioContextAndroid(
      isSpeakerphoneOn: true,
      stayAwake: true,
      contentType: AndroidContentType.sonification,
      usageType: AndroidUsageType.assistanceSonification,
      audioFocus: AndroidAudioFocus.none,
    ),
  );
  AudioPlayer.global.setGlobalAudioContext(audioContext);

将其添加到主.dart文件中,然后运行App(App());

5rgfhyps

5rgfhyps2#

最后,我意识到这个问题与AVAudioSession及其会话管理有关,flutter_ttsaudioplayers这两个库都使用它,因此它们可以覆盖其他库。
我不得不将方法更改为以下内容:

/// Synthesises the current audio cue into an audio file
  static Future<void> synthesiseStringToAudioFile() async {
    int synthesized = await flutterTts.synthesizeToFile(
        "This is my first audio synthesizer in Flutter", audioFileName);
    if (synthesized == 1) {
      String pathFile =
          await (Platform.isAndroid ? pathToFileAndroid : pathToFileIos);
      print('Path to file: ' + pathFile);
      playAudioFile(pathFile);
    } else {
      print('Error during the synthesisation');
    }
  }

开始触发iOS中的一些音频。尽管如此,通知中还是有一些问题,但我认为答案已经得到了回答。

rhfm7lfc

rhfm7lfc3#

当您使用audio players播放声音并使用flutter_tts说话时,会使flutter_tts在iOS上无法正常工作
因此,只有其中一个包可以工作,但是一旦两个包同时使用,tts会在一段时间后停止工作,有时会持续更长时间,但有时会立即停止。
现实中,这是由于iOS端的冲突。
假设它在Android上工作,这意味着你的代码应该没有问题。
必须找到另一种替代办法。

bvn4nwqk

bvn4nwqk4#

今天我修正了这个问题,我用的是来自URL的音频,我用的是这一行

var res = await audioPlayer.play(url, isLocal: true);

我必须在代码中使用下面这行代码

var res = await audioPlayer.play(url, isLocal: false);

isLocal代表您的文件是否存储在本地。如果文件存储在远程,即以URL的形式,则设置为isLocal:false
希望它能解决你的问题。

vulvrdjw

vulvrdjw5#

在使用IOS时使用play()方法代替playBytes()。int结果=0;如果(平台.isIOS){结果=等待player.play(“音频网址”,是本地的:错误); }

相关问题