音频播放器不适用于 iOS |颤振插件

时间:2021-02-02 08:46:35

标签: ios flutter file audio

我正在创建一个 Flutter 插件。目前,代码:

  1. 将字符串合成为音频文件
  2. 获取文件路径
  3. 使用 audioplayers
  4. 播放音频文件

当我在 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 以确认文件路径是正确的(它实际上获取了文件的持续时间)。尽管如此,该文件并未播放。

我用模拟器测试应用程序,这是文件存放的路径

<块引用>

/localPaty/Devices/deviceID/data/Containers/Data/Application/appID/Documents/temp_audio_cue.caf

我阅读了有关此主题的不同问题,但没有找到适合我的案例的解决方案

我试过了:

按照文档的建议编辑传输安全

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

使用 AudioCache (question)

大家还有什么建议吗?我是否需要将文件移动到我的本地资产并使用 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 但之后它显示以下错误:

<块引用>

FigFileForkOpenMainByCFURL 发出信号 err=2 (errno)(打开失败)

尽管如此,使用正确的 localPath 调用方法不会触发错误,所以我认为它应该正确播放。

注意

如果不是调用 playLocal(),而是调用 flutter_tts.speak('test'),它会起作用。因此,错误应该与 audioplayers 相关。

我使用的版本是 flutter_tts ^2.1.0audioplayers: ^0.17.3

2 个答案:

答案 0 :(得分:0)

最后,我意识到问题与 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 中的一些音频。尽管如此,通知中仍有一些问题,但我认为答案已经得到了解答。

答案 1 :(得分:0)

当你使用 audio players 播放声音并使用 flutter_tts 说词时,它会使 Flutter_tts 在 iOS 上功能失调

因此,只有一个包可以工作,但是一旦同时使用这两个包,tts 会在一段时间后停止工作。有时它会持续更长时间,但有时它会立即停止。

<块引用>

实际上,这是由于 iOS 端的冲突。

假设它适用于 Android,这意味着您的代码应该没有问题。

必须找到另一种选择。