在 audio_service 和 just_audio 中更改音频源 (Flutter)
Changing Audio Source In audio_service and just_audio (Flutter)
我正在开发我的第一个实现基本流功能的 Flutter 应用程序。启动后,应用程序从源 A 加载流。应用程序包含导航菜单,允许用户播放来自其他源 B、C、D 等的流。来自源 A 的初始流完全按预期运行,但我无法弄清楚如何将流源从 A 更改为 B、C、D。明确地说,我了解我需要在 UI 内做什么,但我不确定如何更改音频源在 audio_service 和 just_audio 内。通过文档,我发现 AudioHandler 在 audio_service.dart 包 (playMediaItem()) 中提供了一个很好的候选函数,但是,创建一个新的 MediaItem 并将其传递给此函数没有任何效果:
我已经根据 audio_service 文档设置了我的 AudioPlayerHander class:
class AudioPlayerHandler extends BaseAudioHandler {
// Declare MediaItem used for streaming
static const _stream = MediaItem(
id: 'some URL',
title: 'Stream A',
);
// Instantiate a just_audio AudioPlayer
final _player = AudioPlayer();
//Initialize audio handler
AudioPlayerHandler() {
_player.playbackEventStream.map(_transformEvent).pipe(playbackState);
mediaItem.add(_stream);
_player.setAudioSource(AudioSource.uri(Uri.parse(_stream.id)));
}
@override
Future<void> play() => _player.play();
@override
Future<void> pause() => _player.pause();
@override
Future<void> stop() => _player.stop();
用户可以导航到他们单击按钮播放源 B 的路线:
var stream_b = MediaItem(
id: 'some URL', //
title: 'Stream B',
);
audioHandler.playMediaItem(stream_b); //no apparent effect
audioHandler.play(); // If stream A was paused or stopped, it will now resume
在上面显示的 class AudioPlayerHandler 中,我需要添加一个方法:
Future<void> playMediaItem(MediaItem mediaItem) => _player.setUrl(mediaItem.id);
我正在开发我的第一个实现基本流功能的 Flutter 应用程序。启动后,应用程序从源 A 加载流。应用程序包含导航菜单,允许用户播放来自其他源 B、C、D 等的流。来自源 A 的初始流完全按预期运行,但我无法弄清楚如何将流源从 A 更改为 B、C、D。明确地说,我了解我需要在 UI 内做什么,但我不确定如何更改音频源在 audio_service 和 just_audio 内。通过文档,我发现 AudioHandler 在 audio_service.dart 包 (playMediaItem()) 中提供了一个很好的候选函数,但是,创建一个新的 MediaItem 并将其传递给此函数没有任何效果:
我已经根据 audio_service 文档设置了我的 AudioPlayerHander class:
class AudioPlayerHandler extends BaseAudioHandler {
// Declare MediaItem used for streaming
static const _stream = MediaItem(
id: 'some URL',
title: 'Stream A',
);
// Instantiate a just_audio AudioPlayer
final _player = AudioPlayer();
//Initialize audio handler
AudioPlayerHandler() {
_player.playbackEventStream.map(_transformEvent).pipe(playbackState);
mediaItem.add(_stream);
_player.setAudioSource(AudioSource.uri(Uri.parse(_stream.id)));
}
@override
Future<void> play() => _player.play();
@override
Future<void> pause() => _player.pause();
@override
Future<void> stop() => _player.stop();
用户可以导航到他们单击按钮播放源 B 的路线:
var stream_b = MediaItem(
id: 'some URL', //
title: 'Stream B',
);
audioHandler.playMediaItem(stream_b); //no apparent effect
audioHandler.play(); // If stream A was paused or stopped, it will now resume
在上面显示的 class AudioPlayerHandler 中,我需要添加一个方法:
Future<void> playMediaItem(MediaItem mediaItem) => _player.setUrl(mediaItem.id);