我正在使用 ExoPlayer 在 Android 应用程序中播放媒体。
当您在我的应用程序中打开视频时,我希望视频在您可以听到音频的同时可见 - 就像任何普通的媒体播放器一样。
但是,当您关闭应用程序时,我希望音频继续在后台服务中播放,并通知播放、暂停和重新启动内容。
我知道如果 ExoPlayer 在服务中实例化,我可以让音频以这种方式运行。然而,为了让视频可见,ExoPlayer 实例必须传递给 PlayerView 并且 PlayerView 必须在 UI 线程上运行。
如果 ExoPlayer 实例是在 Service 中定义的,并在 Service 的工作线程上运行,而 PlayerView 是在 Activity 中定义并在 UI 线程上运行,那么如何将 ExoPlayer 实例传递给 PlayerView? AIDL 仅限于原始类型(String、long、boolean 等),因此似乎不可能。
我希望在您关闭应用程序时音频没有停止并重新启动(如果我有两个单独的播放器 - 一个在服务中,一个在 UI 线程中)。我希望服务处理所有媒体下载、解码和音频播放,并且我想以某种方式绑定(bind)到服务以显示从 ExoPlayer 踢回的解码帧。
最佳答案
正如我在问题中指出的那样,您不能将 ExoPlayer 实例同时传递给 PlayerView 和服务 - 但如果 ExoPlayer 实例可以通过单例访问,那么 PlayerView 和服务都可以使用直接访问它辛格尔顿的方法。
我遇到的问题是,当我以这种方式创建应用程序时,Singleton(和 ExoPlayer 实例)存在于应用程序的进程空间中,而不是前台服务中。因此,当应用程序被终止时,服务继续运行,但其 ExoPlayer 实例被破坏(通知保持 Activity 状态,但音频中断)
我还不确定如何将 Singleton 保留在服务的进程空间中。这可能只是确保服务在应用程序之前访问 Singleton 的问题。
关于android - ExoPlayer 背景音频和前景视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56433726/