OnVideoSizeChanged从未调用过

时间:2013-09-01 12:00:23

标签: android

我正在使用VideoView来显示视频流。因为我需要将MediaController附加到视图本身,我想防止视频视图导致的黑屏闪烁。我在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方法中进行测试,但这会带回屏幕闪烁问题,并使mediacontroller无法连接。此行为也由LogCat中的日志信息显示,ONPREP标记显示但从不显示ONSIZECHANGE。在我的N7都显示,显然导致背景颜色改变。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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