我正在使用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上的问题相同。
答案 0 :(得分:1)
onVideoSizeChanged
由来自低级别播放器实现的事件触发,在不同平台上可能会有所不同。玩家在onVideoSizeChanged
之前拨打onPrepared
是完全合法的。
实际上VideoView正在设置自己的OnVideoSizeChangedListener
回调来管理表面大小,所以你可能根本就不应该使用它。在您的示例中,我不清楚您使用它的原因,setMediaController
应该在onPrepared
中调用,而不是onVideoSizeChanged
(可以多次调用)。
答案 1 :(得分:1)
这似乎是三星设备的一个错误。 我在我的应用程序中注意到,如果视频视图大小为0x0(可能也是如果它不可见/消失),则不会调用onVideoSizeChange。一旦我将视频视图大小设置为非0x0值,就会正确调用onVideoSizeChange。