在flutter中,我无法使用just_audio包通过WebSocket流式传输时将uint8List类型作为音频播放

0kjbasz6  于 2023-10-22  发布在  Flutter
关注(0)|答案(1)|浏览(187)

下面是我的代码:

try {
      _channel = IOWebSocketChannel.connect(
          'wss://api.elevenlabs.io/v1/text-to-speech/$voiceId/stream-input?model_id=$model');

      _channel!.stream.listen(
        (data) async {
          final response = jsonDecode(data);
          if (response['audio'] != null) {
            try{
              final audioChunk = response['audio'] as String;
              final uint8List = Uint8List.fromList(base64.decode(audioChunk));

              await _audioPlayer.setAudioSource(
                ConcatenatingAudioSource(
                  children: [
                    AudioSource.uri(

                      Uri.dataFromBytes(
                        uint8List,
                        mimeType: 'audio/mpeg',
                      ),
                    ),
                  ],
                ),
              );
              await _audioPlayer.play();
            }
            catch (e){
              print("Error setting audio source and playing: $e");

            }

我能够得到响应,并将其转换为uint 8List,并试图播放它,但它没有播放任何东西,我得到错误:
flutter:设置音频源和播放时出错:(-11828)无法打开扑动:设置音频源和播放时出错:MissingPluginException(No implementation found for method load on channel com.ryanheise.just_audio.methods.abaa9b2-f8ed-4c88-9d89-4623ab523beb)flutter:设置音频源和播放时出错:(-11828)无法打开
我该怎么玩?有没有其他软件包可以做到这一点?我成功地得到了回应,但我只是不能发挥它

g52tjvyc

g52tjvyc1#

这个例子来自just_audio自述文件:

// Feed your own stream of bytes into the player
class MyCustomSource extends StreamAudioSource {
  final List<int> bytes;
  MyCustomSource(this.bytes);
  
  @override
  Future<StreamAudioResponse> request([int? start, int? end]) async {
    start ??= 0;
    end ??= bytes.length;
    return StreamAudioResponse(
      sourceLength: bytes.length,
      contentLength: end - start,
      offset: start,
      stream: Stream.value(bytes.sublist(start, end)),
      contentType: 'audio/mpeg',
    );
  }
}

await player.setAudioSource(MyCustomSource(...));
player.play();

您可以定义自己的StreamAudioSource的自定义子类,将音频数据提供给just_audio。由于返回的StreamAudioResponse的一部分是一个流,您可以将WebSocket流转换并重定向到这个StreamAudioResponse。因此,而不是:

Stream.value(bytes.sublist(start, end)),

你可以使用类似的东西:

channel!.stream
        .map(json.decode)
        .map((data) => data['audio'])
        .map(base64.decode),

由于这个音频源会连续地将音频数据流传输到just_audio,因此只需调用setAudioSource一次,而不会重复。

相关问题