使用 just_audio & audio_service 在用户停止播放 mediaItem 的地方播放

Playing where a user left off on a mediaItem using just_audio & audio_service

我正在开发一个播客应用程序,该应用程序的一个功能是它可以保存用户离开播客以播放另一个播客或完全离开该应用程序的位置。如果不首先使用 audioHandler.play() 播放所述播客并使用 audioHandler.seek(lastPlayed) 寻找用户停止的位置,我找不到从其 lastPlayed 时间戳播放保存的播客的方法。使用这种播放方法,我得到了这个错误:播客从头开始播放,而不是从头开始播放。有什么建议吗?

W/System.err(27454): com.google.android.exoplayer2.IllegalSeekPositionException W/System.err(27454): at com.google.android.exoplayer2.ExoPlayerImpl.seekTo(ExoPlayerImpl.java:611) W/System.err(27454): at com.google.android.exoplayer2.SimpleExoPlayer.seekTo(SimpleExoPlayer.java:1527) W/System.err(27454): at com.ryanheise.just_audio.AudioPlayer.seek(AudioPlayer.java:953) W/System.err(27454): at com.ryanheise.just_audio.AudioPlayer.onMethodCall(AudioPlayer.java:455) W/System.err(27454): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233) W/System.err(27454): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85) W/System.err(27454): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:818) W/System.err(27454): at android.os.MessageQueue.nativePollOnce(Native Method) W/System.err(27454): at android.os.MessageQueue.next(MessageQueue.java:335) W/System.err(27454): at android.os.Looper.loop(Looper.java:206) W/System.err(27454): at android.app.ActivityThread.main(ActivityThread.java:8512) W/System.err(27454): at java.lang.reflect.Method.invoke(Native Method) W/System.err(27454): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) W/System.err(27454): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) E/flutter (27454): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: PlatformException(Illegal state: null, null, null, null)

您可以通过两种方式实现:

  1. 等待 seek 完成后再调用 play。或者,
  2. 使用 just_audio 的 setAudioSourceinitialPosition 参数在特定位置预加载音频。

我会尝试在您的音频处理程序中透明地处理播放器保存位置的恢复。这样,您的音频处理程序的客户端就不需要知道它是如何处理的,只需在它想播放时调用 audioHandler.play(),音频处理程序就会在内部知道从哪个位置开始播放。

实现此目的的方法是从音频处理程序的构造函数中恢复播放器的状态。因此,例如,您的音频处理程序的初始化代码可能包括:

player = AudioPlayer();
await player.setAudioSource(source,
    initialPosition: savedPosition);

你得到一个 IllegalSeekPositionException 因为 Android 上的 ExoPlayer 库认为你正在寻找一个不在该文件时间轴内的位置。您可能想要检查搜索位置的值与持续时间的比较,并确保它更小。