确保在方向更改后保留视频缓冲区,而无需手动处理配置更改


无论如何

,您可以使应用程序在定向后保留缓冲区,而无需手动处理配置更改。

场景基本上是:

  1. 方向更改时,应保留直到最新点的视频缓冲区。

  2. 需要重新加载新的布局(因为 portait 和 lanscape 具有不同的布局(,因此,我认为让应用程序重新启动活动以重新加载新资源是最好的方法。

  3. 视频组件位于片段中。

我尝试过但不可接受的替代方案:

  1. 第一个解决方法是保存视频的位置,并在创建视图后,使用 seekTo 转到最后一个点。但是,这将导致设备再次重新缓冲。

  2. 我尝试使用片段集保留实例(true(,并确保媒体播放器在方向更改后不会重新初始化。每次onCreateView之后,我只需将mediaplayer.setDisplay((设置为新的surfaceholder。不幸的是,这会导致媒体播放器进入错误状态,进而需要重置媒体播放器。

对此有什么建议/解决方法吗?

编辑:我在堆栈溢出的某个地方看到,当媒体播放器在 android 4.0+ 中处于活动状态时,您可以更改媒体播放器表面支架。但是,我正在开发一个适用于android 3.x的应用程序。

我认为您可以覆盖onConfigurationChanged((并以编程方式重新布局。

您可以在不触摸视频的情况下修改布局。

也许对你来说已经晚了,但可能还有其他人面临同样的问题。您可以使用第二个选项。如果在销毁片段视图之前未将媒体播放器的显示设置为 null,则当您再次访问媒体播放器时,它将进入错误状态。我的解决方案是实现 surfaceHolder 的 surfaceCreated和surfaceDestroy事件。

@Override
public void surfaceCreated(SurfaceHolder holder) {
    mediaPlayer.setDisplay(holder);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    mediaPlayer.setDisplay(null);
}
我认为在不使用

android:configChanges标志的情况下在android中旋转时不可能保持缓冲区。这些是可用的选项:

  1. 允许旋转和活动重新创建,但保存视频位置。这将失去缓冲区,但允许您从最后一个位置继续。这不适用于直播流,仅适用于本地文件或远程 VOD。您必须在onSaveInstanceState中保存您的位置,并将其恢复为活动/片段的onCreate。或者使用 setRetainInstance(true) 保留该值,但不建议使用最后一个选项。

  2. 使用 android:configChanges="orientation|screenSize" 标志并自行管理 UI 大小更改。看看这个 POC 作为参考:https://github.com/caspercba/POCMediaPlayerRotation

  3. 选择像NexStreaming这样的第三方播放器。

干杯

最新更新