【问题标题】:Ensure video buffer is preserved after orientation changes without handling onConfiguration changes manually确保在方向更改后保留视频缓冲区,而无需手动处理 onConfiguration 更改
【发布时间】:2012-05-21 02:51:50
【问题描述】:

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

场景基本:

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

  2. 需要重新加载一个新的布局(因为纵向和横向有不同的布局), 因此,让应用重新启动 Activity 以重新加载新资源是我认为的最佳方式。

  3. 视频组件在片段中。

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

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

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

对此有何建议/解决方法?

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

【问题讨论】:

  • 看看我的回答here有没有帮助。
  • @yorkw 但这意味着破解 android.jar。正确的?你知道有什么方法可以为主流做吗?还要确保 Play 商店接受它?
  • 要么破解 VideoView 的副本(不是实际的 android.jar),要么从 MediaPlayer 构建自己的 VideoView,这里的关键是要正确避免导致重新缓冲或清理缓冲区的方法调用配置更改(更重要的是,在 Activity 的生命周期回调方法和 SurfaceHolder 回调方法中)。
  • 我在片段中使用媒体播放器,我对你的第二个答案很好奇。活动是否重新启动?如果是这样,那么每次活动都会重新初始化活动并导致表面视图重新初始化。如果此时媒体播放器处于暂停状态,调用 mediaplayer.start() 将使其自身进入错误状态。由于我将视频放在片段中,因此我尝试了 2 个场景,重新初始化 SurfaceView 而不是。当我重新初始化时,它会进入错误状态,当我不是时,不会显示任何内容,因为没有绘制视图。
  • @Maziz,你认为 callign invalidate() 或 requestLayout() 怎么样?它是否解决了您的“未绘制视图”问题?

标签: android screen-orientation


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。当涉及的组件很多时,重新布局是不可行的。
  • 那如何使用单独的Fragment来布局和视频视图?
  • 您的意思是 1 个 Fragment 将显示视图,而另一个 Fragment 将被保留?这样做会导致保留片段中的媒体播放器进入错误状态,因为表面视图已更改。
【解决方案2】:

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

@Override
public void surfaceCreated(SurfaceHolder holder) {
    mediaPlayer.setDisplay(holder);
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    mediaPlayer.setDisplay(null);
}

【讨论】:

    【解决方案3】:

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

    1. 允许旋转和活动娱乐,但保存视频位置。这将松开缓冲区,但允许您从最后一个位置继续。这不适用于实时流,仅适用于本地文件或远程 VOD。您必须将您的位置保存在onSaveInstanceState 并在onCreate 中恢复它以进行活动/片段。或者使用setRetainInstance(true) 保留该值,但不建议使用最后一个选项。

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

    3. 选择第三方播放器,例如 NexStreaming。

    干杯

    【讨论】:

      猜你喜欢
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 2021-05-26
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多