android - VideoView 循环播放视频 补充

标签 android android-videoview

我有一个带有 VideoView 的应用程序,它将不断循环播放相同的视频,直到用户对设备(触摸屏等)进行操作为止。目前,我正在使用 OnCompletionListener() 在视频结束后重新启动视频。这在我测试过的每台设备上都能正常工作,除了 Samsung Replenish。

这是我的代码:

    mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        public void onCompletion(MediaPlayer mp) {
            mVideoView.setVideoPath(file.getAbsolutePath());
            mVideoView.start();
        }
    });

Replenish 发生的情况是视频一直播放一次,但之后再也没有开始播放,屏幕全黑(但背光灯仍然打开)。在我用完全相同的代码测试过的所有其他设备上,它都可以重复播放视频。有谁知道有关 Replenish 的任何具体信息可能会导致此错误?我认为也许将对 setVideoPath() 和 start() 的调用延迟 200-300 毫秒可能会有所帮助,但这没有任何影响。我在这里真的很茫然。

我在我的日志中看到这些消息:

ERROR/QCvdec(87): Omx Flush issued when vdec is not initialized yet.

ERROR/QCvdec(87): OMXCORE-SM:Recieved command DISABLE (2)

ERROR/QCvdec(87): Omx Flush issued when vdec is not initialized yet.

ERROR/QCvdec(87): OMXCORE-SM:Recieved command ENABLE (3)

但是这些日志在视频开始播放(第一次播放)和再次播放失败时都会发生。所以我不确定它们是否与我的问题有关

编辑:

我刚刚尝试将 mVideoView 设置为 null,然后在 setVideoPath() 之前使用 findViewById() 获取对它的新引用。我知道这会使 OnCompletionListener 的设置方式复杂化。但无论如何它都没有用,仍然是同样的黑屏。

编辑 2:

我开始注意到有时视频甚至没有在第一次开始播放。我第一次使用这两行来启动它:

        mVideoView.setVideoPath(file.getAbsolutePath());
        mVideoView.start();

它似乎开始比较稳定,但第一次播放时并不是 100%。

编辑 3:这就是我现在的设置方式。我正在手动设置 OnPreparedListener 来为我启动视频。所以我将它添加到我的 onCreate()

        mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        
            @Override
            public void onPrepared(MediaPlayer arg0) {
                 mVideoView.start();
            }
        });

然后,当我准备好重新开始播放视频时,我只需调用 setVideoPath() 方法,如下所示:

mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        mVideoView.setVideoPath(file.getAbsolutePath());
        
    }
});

这似乎可以解决问题。不过,我让它运行了一段时间,以便确定。

编辑 4:

@MByD 在 VideoView setVideoPath() 的代码中是 setVideoUri() 的包装器。 setVideoURI() 正在设置 mStartWhenPrepared = false; 默认的 OnPreparedListener 检查此开关以决定是否开始播放。这就是为什么它不以默认监听器开头的原因。我没有深入研究它,但可能有一个 setter 方法可以让我将 mStartWhenPrepared 值更改为 true,这会导致视频从默认监听器启动。

最佳答案

您是否尝试过在调用 .start() 之前准备好您的视频?

来自文档:http://developer.android.com/reference/android/media/MediaPlayer.html#prepare%28%29

带有 OnPreparedListener您可以在视频准备就绪后开始播放。

关于android - VideoView 循环播放视频 补充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7011534/

相关文章:

android - 找不到适合 fragment 的 onCreate() 等价物

android - MediaController 定位 - 绑定(bind)到 VideoView

Android VideoView 播放控件最初显示 "Play"而不是 "Pause"即使文件已经在播放

android - 在 Android 中播放 RTSP 流媒体视频时如何保持纵横比?

android - 在一个 VideoView 中同时播放两个视频

android - 无法为适用于 Android 平台的 AWS C++ SDK 构建库

android - 展开前如何确定 View 的最终大小?

java - API 级别的抽象 View

android - 当我将 View 留给前一个 child 时,取景器中的视频 View 仍在播放

android - Android-导入jar文件时定义了多个dex文件