Пакет flutter just_audio как проигрывать аудио из байтов

Я использую плагин just_audio, и в его описании есть функция: чтение из байтового потока.

В основном, когда я помещаю файл (из URL-адреса) для воспроизведения, я сохраняю байты из файла, поэтому после этого шага я хочу воспроизвести его локально.

У меня вопрос как играть из байтового потока. Может ли кто-нибудь привести пример, как это сделать? Мне нужно добавить это в свой список воспроизведения, чтобы он был потомком ConcatanatingAudioSource.

Единственный источник звука, который я нашел, использовал его от Ури.

      final _playlist = ConcatenatingAudioSource(
children: [
    AudioSource.uri(
      Uri.parse(
          "https://s3.amazonaws.com/scifri-episodes/scifri20181123-episode.mp3"),
      tag: AudioMetadata(
        album: "Science Friday",
        title: "ddddd",
        artwork:
            "https://media.wnyc.org/i/1400/1400/l/80/1/ScienceFriday_WNYCStudios_1400.jpg",
      ),
    )
]
)

Вот как я сохраняю байты:

      void getBytes() async {
  Uri uri = Uri.parse(url);
  var rng = new Random();
// get temporary directory of device.
  Directory tempDir = await getTemporaryDirectory();
// get temporary path from temporary directory.
  String tempPath = tempDir.path;
// create a new file in temporary path with random file name.
  File file = new File('$tempPath' + (rng.nextInt(100)).toString() + '.mp3');
// call http.get method and pass imageUrl into it to get response.
  http.Response response = await http.get(uri);
// write bodyBytes received in response to file.
  await file.writeAsBytes(response.bodyBytes);
}

заранее спасибо

1 ответ

Итак, похоже, вам нужно создать свой собственный класс как расширение StreamAudioSource.

      import 'dart:typed_data';
import 'package:just_audio/just_audio.dart';

class MyJABytesSource extends StreamAudioSource {
  final Uint8List _buffer;

  MyJABytesSource(this._buffer) : super(tag: 'MyAudioSource');

  @override
  Future<StreamAudioResponse> request([int? start, int? end]) async {
    // Returning the stream audio response with the parameters
    return StreamAudioResponse(
      sourceLength: _buffer.length,
      contentLength: (start ?? 0) - (end ?? _buffer.length),
      offset: start ?? 0,
      stream: Stream.fromIterable([_buffer.sublist(start ?? 0, end)]),
      contentType: 'audio/wav',
    );
  }
}

И затем вызвать его так

      await thePlayer.setAudioSource(MyJABytesSource(bytes));

Вы можете позвонить thePlayer.play().после, но я предпочитаю использовать это в качестве слушателя.

      thePlayer.processingStateStream.listen((ja.ProcessingState state) {
  if (state == ja.ProcessingState.ready) {
    // I'm using flutter_cache_manager, and it serves all the file
    // under the same name, which is fine, but I think this is why
    // I need to pause before I can play again.
    // (For tracks after the first, the first plays fine.)

    // You probably won't need to pause, but I'm not sure.
    thePlayer.pause();
    thePlayer.play();
  } else if (state == ja.ProcessingState.completed) {
    // What to do when it completes.
  }
});

Хорошая часть этого способа заключается в том, что вам на самом деле не нужно awaitключевое слово, которое может быть ситуативно полезным. У меня есть это просто для того, чтобы прояснить, что это asyncфункция.

Другие вопросы по тегам