使用 just_audio 和 audio_service 播放用户在 mediaItem 上停止的位置

Posted

技术标签:

【中文标题】使用 just_audio 和 audio_service 播放用户在 mediaItem 上停止的位置【英文标题】:Playing where a user left off on a mediaItem using just_audio & audio_service 【发布时间】:2021-10-13 06:08:43 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

您可以通过两种方式实现这一目标:

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

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

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

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

您收到 IllegalSeekPositionException 是因为 Android 上的 ExoPlayer 库认为您正在寻找不在该文件时间线内的位置。您可能需要检查搜索位置的值与持续时间相比,并确保它更小。

【讨论】:

以上是关于使用 just_audio 和 audio_service 播放用户在 mediaItem 上停止的位置的主要内容,如果未能解决你的问题,请参考以下文章

歌曲添加到队列未播放(使用 just_audio 和 audio_service)

使用 just_audio 和 audio_service 播放用户在 mediaItem 上停止的位置

将 unsigned char 音频转换为 short

如何将“均衡器”与“audio_service”包一起使用

如何捕捉音频文件 url 问题?

Flutter audio_service 设置评分