我正在使用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");
}
});
}
Run Code Online (Sandbox Code Playgroud)
视频播放应该是这样,我通过删除OnVideoSizeChangedListener并将代码放在onPrepared方法中进行测试,但这会带回屏幕闪烁问题并使mediacontroller无法连接.此行为也由LogCat中的日志信息显示,ONPREP标记显示但从不显示ONSIZECHANGE.在我的N7上都显示,显然会导致背景颜色发生变化.
这是设置和启动视频的代码:
videoview.setOnPreparedListener(MainActivity.this);
mc = new MediaController(MainActivity.this);
mc.setMediaPlayer(videoview);
videoview.setVideoURI(videourI);
videoview.start();
Run Code Online (Sandbox Code Playgroud)
那么为什么要在一台设备上调用而不在另一台设备上呢?
编辑:在我的Note 2上测试它,与SGS2上的问题相同.
onVideoSizeChanged由低级播放器实现中的事件触发,该事件在不同平台上可能有所不同。onVideoSizeChanged玩家之前跟注是完全合法的onPrepared。
实际上 VideoView 正在设置自己的OnVideoSizeChangedListener回调来管理表面大小,因此您可能根本不应该使用它。从您的示例中,我不清楚您为什么使用它,setMediaController应该在 中调用onPrepared,而不是onVideoSizeChanged(可以多次调用)。
| 归档时间: |
|
| 查看次数: |
2571 次 |
| 最近记录: |