Пакет 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
функция.