我的目标是向用户显示录制的9帧视频,以便他可以选择其中之一。
所以我做的是一个活动,以录制视频,并将URI从视频发送到另一个活动,该活动将显示该录制的视频中的9帧。
界面中有9个VideoView,每个ViewView都通过一个seekTo进行更改,该值由此变量计算:]
video_frames_to_jump = (mediaPlayer.getDuration() - MILISECONDS_TO_JUMP)/10;
换句话说,我将视频分成10个部分,从视频开头开始使用MILISECONDS_TO_JUMP。
此后,我使用mediaPlayer.seekTo(video_seek);
方法中的onPrepared
中的seekTo在不同的时间启动每个VideoView。
完整的代码是这样的:
// Activity OnCreated OnCreated(){ // preparing the Video file for the VideoView video_file_string = getIntent().getStringExtra("video_file"); video_file = new File(video_file_string); Uri videoUri = Uri.fromFile(video_file); // Using OnPrepared so we can use the mediaPlayer.getDuration() and to avoid further problems MediaPlayer.OnPreparedListener onpreparedlistener = new MediaPlayer.OnPreparedListener() { // Make some important initialization explained above to calculate video_frames_to_jump and // video_seek videoseek_initialization(); // here i update the variable, so the next video will seekTo a later point in the video video_seek = (video_seek > mediaPlayer.getDuration())? (mediaPlayer.getDuration()-1) : (video_seek+video_frames_to_jump); mediaPlayer.seekTo(video_seek); Log.v(TAG, "FramesSelection VideoSeek(" + video_seek + ") MaxDuration(" +mediaPlayer.getDuration() +")"); // the two lines below was me trying to fix the black screen error, but it didn't work // some people said that playing and pause the video would update the VideoView and fix the // black screen mediaPlayer.start(); mediaPlayer.pause(); } // here i'm initializing the videoviews VideoView video_view1 = (VideoView) this.findViewById(R.id.video_view1); VideoView video_view2 = (VideoView) this.findViewById(R.id.video_view2); ... VideoView video_view8 = (VideoView) this.findViewById(R.id.video_view8); VideoView video_view9 = (VideoView) this.findViewById(R.id.video_view9); video_view1.setVideoURI(videoUri); video_view1.setZOrderOnTop(false); // The line above was a possible fix for the black screen, i changed it to true/false but // when false - nothing changes and my problem continues. // when true - the issue continues but instead of black screen, i got a white screen video_view1.setOnPreparedListener(onpreparedlistener); video_view2.setVideoURI(videoUri); video_view2.setZOrderOnTop(false); video_view2.setOnPreparedListener(onpreparedlistener); ... video_view8.setVideoURI(videoUri); video_view8.setZOrderOnTop(false); video_view8.setOnPreparedListener(onpreparedlistener); video_view9.setVideoURI(videoUri); video_view9.setZOrderOnTop(false); video_view9.setOnPreparedListener(onpreparedlistener); }
来自应用程序的日志显示我正在计算所需的正确毫秒数。
例如,在每帧之间跳跃256毫秒,并在视频中跳跃前10帧,结果是:
myapplication: FramesSelection VideoSeek(266) MaxDuration(2576) myapplication: FramesSelection VideoSeek(522) MaxDuration(2576) myapplication: FramesSelection VideoSeek(778) MaxDuration(2576) myapplication: FramesSelection VideoSeek(1034) MaxDuration(2576) myapplication: FramesSelection VideoSeek(1290) MaxDuration(2576) myapplication: FramesSelection VideoSeek(1546) MaxDuration(2576) myapplication: FramesSelection VideoSeek(1802) MaxDuration(2576) myapplication: FramesSelection VideoSeek(2058) MaxDuration(2576) myapplication: FramesSelection VideoSeek(2314) MaxDuration(2576)
注意,我不是在播放视频,只是在VideoView中显示了固定的“图像”或“帧”。
所以问题在于某些VideoView随机显示黑屏。
例如,有时第一个VideoView(video_view1)显示来自录制视频的图像,有时不显示。所有其他VideoView也会发生相同的情况,有时它们可以正常工作,有时却不能。
所以我的问题是:为什么显示黑屏,我在做什么错,我该如何解决?
我已经搜索了问题,并且在上面的代码中显示了一些修复它的尝试。问题在大多数时候都会发生。至少3个VideoView显示黑屏。
下图显示了一个示例...感谢您的帮助!抱歉,详细说明
我的目标是向用户显示9帧已录制的视频,以便他可以选择其中之一。因此,我要做的是进行一个活动来录制视频,并将URI从视频发送到另一个活动...
好吧,我找不到黑屏的原因,但是由于我只需要显示图像(而不是视频),所以我找到了解决问题的方法,我将在此处发布。