【问题标题】:My Android MediaPlayer synchronization problems我的 Android MediaPlayer 同步问题
【发布时间】:2016-07-27 01:18:09
【问题描述】:

我有一个简单的 Android 媒体播放器,可以在一个屏幕上同时播放多个视频。所以基本上一个媒体播放器屏幕分为 4 个部分,4 个 mediaPlayer 实例粘在一起,每个部分播放一个​​给定的视频。

当我的视频文件本地存储在设备上时,它几乎可以正常工作。有同步问题,但很小。但是当我输入 HTTP 流的 URL 时,会出现严重的同步问题。问题是什么?一般来说,我怎样才能消除同步问题?

我唯一能做的就是首先实例化媒体播放器和prepare() 它们,然后一个接一个地调用start(),这样至少开始时间彼此接近。不过效果不大。

这里我有一个返回每个 mediaplayer 实例的方法:

MediaPlayer mediaPreparation(String filename, boolean setMute) {
    String url = "myURL"; // your URL here
    // create mediaplayer instance
    MediaPlayer mediaPlayer = new MediaPlayer();
    if (setMute) {
        mediaPlayer.setVolume(0, 0);
    }
    try {

        mediaPlayer.setDataSource(url);
        mediaPlayer.prepare();

    } catch (IOException e) {
    }

    mediaPlayer.setLooping(true);
    // mediaPlayer.start();
    return mediaPlayer;
}

然后我一一开始:

mp[0].start();
mp[1].start();
mp[2].start();
mp[3].start();

【问题讨论】:

  • Tina J,你解决了这个问题吗?我有同样的问题,我想知道是否有任何解决方案。

标签: android performance video video-streaming android-mediaplayer


【解决方案1】:

在流式传输的情况下,始终存在数据无法持续可用的风险,因此播放器在开始播放之前会缓冲相当多的帧。在这种情况下,多个流可能需要不同的时间来缓冲足够的数量。我看到了一种可以尝试的方法,媒体编解码器。参考这个,https://developer.android.com/reference/android/media/MediaCodec.html

特别是 releaseOutputBuffer() 及其变体。您可以更好地控制渲染(如果需要,可以更改时间戳,但我不建议播放,因为播放不流畅)。您可以跟踪所有 4 个实例是否都解码了特定的时间戳帧,然后立即渲染它们。

【讨论】:

  • 有趣的见解!基于 URL 的流媒体如何工作?当调用prepare() 时,它只下载前几秒,而不是全部,对吧?我现在要问一个单独的问题......
  • 那么我如何跟踪所有 4 个实例是否都解码了特定的时间戳帧?!有什么例子吗?
  • 这只是解码。当您获得解码帧时,您将获得相应的时间戳。跟踪所有 4 个时间戳,当它们都解码特定时间戳时,全部渲染。基本的解码和渲染在Android文档里,跟踪逻辑,你自己写吧。
【解决方案2】:

我不确定是否有任何 Android 媒体播放器提供此功能。

我怀疑也可能存在设备依赖性,因为不同的设备在硬件中可能具有不同的功能来解码和播放多个视频,如果您的某些视频必须使用软件解码等,它们会慢得多。

它可能无法满足您的需求,但在终端设备上提供此类视频网格的常用方法是在服务器端将视频合并在一起,并将其作为单个视频流传送到设备。

更新

如果使用 MediaCodec 并利用硬件编解码器,还需要注意另一件事 - 如果视频具有不同的视频配置文件,这也可能导致不同的解码延迟。

这与视频的编码方式有关 - 简单来说,如果特定帧引用来自它之后的帧的信息(一种常见的压缩方法),那么解码器需要缓冲该帧直到它得到裁判框也。使用基线配置文件的更简单的压缩方法不使用此技术,因此不必缓冲,因此可能具有较低的延迟。对于不同的硬件供应商,这似乎也有所不同 - 请参阅英特尔的这篇说明,特别是最后的低延迟部分:

我怀疑解决这个特定方面的最佳方法是瞄准最低的共同支配 - 要么只使用基线配置文件,要么尝试将所有视频显示延迟某个因素,该延迟比您可以从任何单个视频预期的最大延迟更长的时间。

【讨论】:

  • 已经实现了。问题是改善同步的任何方法......
  • 感谢您提供有用的更新。实际上我所有的视频都使用完全相同的配置文件,并且实际上是相同的大小和相同的分辨率。
猜你喜欢
  • 2022-12-05
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多