【问题标题】:OnVideoSizeChanged never calledOnVideoSizeChanged 从未调用过
【发布时间】:2013-09-04 16:15:45
【问题描述】:

我正在使用 VideoView 来显示视频流。因为我需要将 MediaController 附加到视图本身,并且我想防止由 videoview 引起的黑屏闪烁。我已经在我的 Nexus 7 上测试了以下代码,效果很好。但现在我在我的 SGS2 上对其进行了测试,出于某种原因,从未调用过 OnVideoSizeChanged。

@Override
public void onPrepared(MediaPlayer mp) {
    // TODO Auto-generated method stub
    Log.i("ONPREP", "called");
    mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {

            videoview.setMediaController(mc);
            mc.setAnchorView(videoview);
            videoview.setBackgroundColor(Color.TRANSPARENT);

            Log.i("ONSIZECHANGE", "called");
        }
    });
}

视频播放正常,我通过删除 OnVideoSizeChangedListener 并将代码放入 onPrepared 方法进行了测试,但这会导致屏幕闪烁问题并导致媒体控制器未连接。此行为也由 LogCat 中的日志信息显示,ONPREP 标记显示,但从不显示 ONSIZECHANE。在我的N7上都显示,明显是背景颜色变了。

这是设置和启动视频的代码:

videoview.setOnPreparedListener(MainActivity.this);
            mc = new MediaController(MainActivity.this);
            mc.setMediaPlayer(videoview);
            videoview.setVideoURI(videourI);
            videoview.start();

那么为什么在一台设备上调用它而不在另一台设备上调用呢?

编辑: 在我的 Note 2 上进行了测试,与 SGS2 上的问题相同。

【问题讨论】:

标签: android


【解决方案1】:

onVideoSizeChanged 由来自低级播放器实现的事件触发,在不同平台上可能不同。玩家在onPrepared 之前调用onVideoSizeChanged 是完全合法的。

实际上 VideoView 正在设置自己的 OnVideoSizeChangedListener 回调来管理表面大小,因此您可能根本不应该使用它。从您的示例中,我不清楚您为什么要使用它,setMediaController 应该在 onPrepared 中调用,而不是 onVideoSizeChanged(可以多次调用)。

【讨论】:

  • 只使用 OnPreparedListener 不起作用的是 setAnchorView 方法。它不附加到视频视图本身。当 OnVideoSizeChanged 被调用时,它可以被附加。
【解决方案2】:

这似乎是三星设备的错误。 我在我的应用程序中注意到,如果视频视图大小为 0x0(如果它不可见/消失也可能),则不会调用 onVideoSizeChange。一旦我将视频视图大小设置为非 0x0 值,就会正确调用 onVideoSizeChange。

【讨论】:

    猜你喜欢
    • 2014-11-23
    • 2017-08-27
    • 2012-08-09
    • 2011-05-13
    • 2019-06-01
    • 2012-12-15
    • 2015-01-14
    • 2013-01-25
    • 2016-02-09
    相关资源
    最近更新 更多