audioplayers icon indicating copy to clipboard operation
audioplayers copied to clipboard

Error: NotSupportedError: Failed to load because no supported source was found.

Open UmairSaqibBhutta opened this issue 2 years ago • 0 comments

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 _play() async { // player.play(widget.voiceUrl); final position = _position; if (position != null && position.inMilliseconds > 0) { await player.seek(position); } await player.resume(); setState(() => _playerState = PlayerState.PLAYING); }

Future _pause() async { await player.pause(); setState(() => _playerState = PlayerState.PAUSED); }

Future _stop() async { await player.stop(); setState(() { _playerState = PlayerState.STOPPED; _position = const Duration(); }); } } `

UmairSaqibBhutta avatar Jun 24 '22 12:06 UmairSaqibBhutta

audioPlayer.play(UrlSource(url!));

Alyy2021 avatar Aug 21 '22 10:08 Alyy2021

You have to setSource or hand over a valid UrlSource before start playing. See example

Gustl22 avatar Aug 30 '22 12:08 Gustl22