audioplayers
audioplayers copied to clipboard
Error: NotSupportedError: Failed to load because no supported source was found.
I am using audioplayers
for playing audio in web but facing upper given error.
I am using as :
return PlayerWidget( voiceUrl: message.uri, player: audioPlayer, );
where PlayerWidget is:
` class PlayerWidget extends StatefulWidget { final AudioPlayer player; final String voiceUrl; Color? timerColor;
PlayerWidget({ Key? key, required this.player, required this.voiceUrl, this.timerColor, }) : super(key: key);
@override State<StatefulWidget> createState() { return _PlayerWidgetState(); } }
class _PlayerWidgetState extends State<PlayerWidget> { PlayerState? _audioPlayerState; Duration? _duration; Duration? _position;
PlayerState _playerState = PlayerState.STOPPED; StreamSubscription? _durationSubscription; StreamSubscription? _positionSubscription; StreamSubscription? _playerCompleteSubscription; StreamSubscription? _playerStateChangeSubscription;
bool get _isPlaying => _playerState == PlayerState.PLAYING; // bool get _isPaused => _playerState == PlayerState.PAUSED; String get _durationText => _duration?.toString().split('.').first ?? ''; String get _positionText => _position?.toString().split('.').first ?? '';
AudioPlayer get player => widget.player;
@override void initState() { super.initState(); _initStreams(); player.setUrl(widget.voiceUrl); //player.stop(); }
@override void dispose() { _durationSubscription?.cancel(); _positionSubscription?.cancel(); _playerCompleteSubscription?.cancel(); _playerStateChangeSubscription?.cancel(); super.dispose(); }
@override Widget build(BuildContext context) { return Column( children: <Widget>[ Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ InkWell( onTap: () { if (_isPlaying) { _pause(); } else { _play(); }
setState(() {});
log("_isPlaying = $_isPlaying");
// _isPlaying = !_isPlaying;
},
child: Icon(
_isPlaying ? Icons.pause : Icons.play_arrow,
color: Colors.white,
size: 30,
),
),
Slider(
activeColor: Colors.white,
onChanged: (v) {
final duration = _duration;
if (duration == null) {
return;
}
final position = v * duration.inMilliseconds;
player.seek(Duration(milliseconds: position.round()));
},
value: (_position != null &&
_duration != null &&
_position!.inMilliseconds > 0 &&
_position!.inMilliseconds < _duration!.inMilliseconds)
? _position!.inMilliseconds / _duration!.inMilliseconds
: 0.0,
),
],
),
Text(
_position != null
? '$_positionText / $_durationText'
: _duration != null
? _durationText
: '',
style: TextStyle(
fontSize: 12.0, color: widget.timerColor ?? Colors.black),
),
// Text('State: $_audioPlayerState'),
],
);
}
void _initStreams() { _durationSubscription = player.onDurationChanged.listen((duration) { setState(() => _duration = duration); });
_positionSubscription = player.onAudioPositionChanged.listen(
(p) => setState(() => _position = p),
);
_playerCompleteSubscription = player.onPlayerCompletion.listen((event) {
// player.stop();
setState(() {
_playerState = PlayerState.COMPLETED;
_position = _duration;
_stop();
});
});
_playerStateChangeSubscription =
player.onPlayerStateChanged.listen((state) {
setState(() {
_audioPlayerState = state;
});
});
}
Future
Future
Future
audioPlayer.play(UrlSource(url!));
You have to setSource
or hand over a valid UrlSource
before start playing. See example