5

我正在使用 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 上的问题相同。

4

2 回答 2

2

onVideoSizeChanged is triggered by an event from the low-level player implementation, which can be different on different platforms. It is perfectly legal for the player to call onVideoSizeChanged before onPrepared.

Actually VideoView is setting its own OnVideoSizeChangedListener callback for managing surface size, so you probably shouldn't use it at all. From your example it is not clear to me why you are using it, setMediaController should be called in onPrepared, not onVideoSizeChanged (which can be called multiple times).

于 2013-09-01T14:28:10.553 回答
2

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

于 2015-06-17T07:47:22.577 回答