当视频刚刚加载或暂停时,它们是完全黑色的(在Android上) [英] When videos are just loaded or paused, they are completely black (on Android)

查看:12
本文介绍了当视频刚刚加载或暂停时,它们是完全黑色的(在Android上)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这种情况仅在Android上发生。视频在iOS和模拟器上工作正常。

问题是,当我的视频加载到MediaPlayer中时,显示的帧是并保持完全黑色。按下播放后,视频可以正确显示。通过按暂停,可正确显示发生暂停的帧。但是,如果应用程序切换到后台,然后再切换到前台,暂停的视频将恢复为完全黑色。

如何解决此问题?

我的代码的相关部分大致如下:

        Media video = MediaManager.createMedia(videoFilePath, true, () -> {
            Runnable callback = runOnVideoCompletion.get();
            if (callback != null) {
                callback.run();
            }
        });
        video.setNativePlayerMode(false);
        video.prepare();
        MediaPlayer mediaPlayer = new MediaPlayer(video) {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(size, size);
            }
        };
        mediaPlayer.setHideNativeVideoControls(true);
        mediaPlayer.setMaximize(false);
        mediaPlayer.hideControls();
        mediaPlayer.setAutoplay(false);

        Container mediaPlayerCnt = new Container(new LayeredLayout(), "NoMarginNoPadding") {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(size, size);
            }
        };
        mediaPlayerCnt.add(mediaPlayer);

        [...]

推荐答案

更新:请参阅评论Reduce the impact of videos in memory to prevent crashes,因为有比我在此提出的解决方案更好的方法。


在等待适当的解决方案时,我想出了一个解决办法,似乎可以完美地解决我的Android手机上的问题。

此代码位于为创建每个视频而调用的方法中,因此在form.show()之前执行,因此在显示表单约半秒后调用UITmer Runnable。

        /*
         * Workaround for the issue: https://stackoverflow.com/q/66144759
         * "video" is a Media instance returned by MediaManager.createMedia
         * This workaround is for Android only and it assumes we don't use autoplay
         */
        if (form != null && DeviceUtilities.isAndroidNative()) {
            UITimer.timer(500, false, form, () -> {
                CN.invokeAndBlock(() -> {
                    video.play();
                    video.setVolume(0);
                    while (!video.isPlaying()) {
                        /*
                         * When in a scrollable container there are many videos,
                         * play does not start immediately, but only when the
                         * video becomes visible, so we must wait.
                         */
                        Util.sleep(100);
                    }
                    Util.sleep(100); // extra wait to be sure that the waiting is not zero
                    video.pause();
                    video.setVolume(100);
                });
                form.addShowListener(l -> {
                    CN.invokeAndBlock(() -> {
                        video.play();
                        video.setVolume(0);
                        while (!video.isPlaying()) {
                            // same as above
                            Util.sleep(100);
                        }
                        Util.sleep(100); // as above
                        video.pause();
                        video.setVolume(100);
                    });
                });
            });
        }

这篇关于当视频刚刚加载或暂停时,它们是完全黑色的(在Android上)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆