在视图寻呼机内的视频视图中实时流式传输会导致空白屏幕

时间:2013-04-04 10:11:31

标签: android video-streaming android-viewpager android-videoview viewpagerindicator

我有一组mp4视频,这些视频会流式传输到VideoView中。视图寻呼机用于在视频之间滑动。

问题:

滑动视图寻呼机时,它可以完美地显示第一页和第二页视频。但是,当滑动到达第三页时,设备屏幕变为空白,我似乎无法再刷页面。

工作代码:

public class VideoActivity extends Activity implements OnClickListener {
private ViewPager videoViewPager;
private CirclePageIndicator videoViewPagerIndicator;
private VideoViewPagerAdapter videoViewPagerAdapter;
private VideoView videoView;
private Context context;
private ArrayList<VideoItem> videoList = new ArrayList<VideoItem>(8);
private int pageIndicatorRadius = 5;
private ProgressBar progressBar = null;
private MediaController mediaController = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /* Flag to set hide the status bar */
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    setContentView(R.layout.activity_main);
    context = this;
    /* Get the video item object list */
    videoList = getVideoList();
    /* Adapter for the view pager */
    videoViewPagerAdapter = new videoViewPagerAdapter();
    videoViewPager = (ViewPager) findViewById(R.id.video_viewpager);
    videoViewPager.setCurrentItem(0);
    videoViewPager.setAdapter(videoViewPagerAdapter);

    // videoViewPager.setOffscreenPageLimit(3);
    /*
     * Page view indicator . Using the external page view indicator library
     */
    videoViewPagerIndicator = (CirclePageIndicator) findViewById(R.id.video_pageindicator);
    videoViewPagerIndicator.setViewPager(videoViewPager);
    videoViewPagerIndicator.setFillColor(getResources().getColor(
            R.color.translucent_blue));
    videoViewPagerIndicator.setRadius(pageIndicatorRadius);

}

private class videoViewPagerAdapter extends PagerAdapter {
    /* Method which returns the number of page viewers */
    @Override
    public int getCount() {
        return videoList.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {

        return (view == object);
    }

    @Override
    public Object instantiateItem(ViewGroup collection, int position) {

        View view = null;
        LayoutInflater inflater = (LayoutInflater) collection.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        // Inflater the xml layout which should be added to the page viewer
        view = inflater.inflate(R.layout.video, null);

        // Create an object of Video Item from the video list
        VideoItem videoItemObject = videoList.get(position);

        /* Initialize video player */
        videoView = (VideoView) view
                .findViewById(R.id.video_view);
        progressBar = (ProgressBar) view
                .findViewById(R.id.video_progressbar);
        Uri video = Uri.parse(videoItemObject.getUrl());
        mediaController = new MediaController(context);
        mediaController.setAnchorView(videoView);
        videoView.setMediaController(mediaController);
        videoView.setVideoURI(video);
        videoView.setKeepScreenOn(true);
        videoView.requestFocus();

        videoView.setOnErrorListener(new OnErrorListener() {

            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                Toast.makeText(context, "Error occured", Toast.LENGTH_SHORT)
                        .show();
                return false;
            }
        });

        videoView.setOnPreparedListener(new OnPreparedListener() {

            public void onPrepared(MediaPlayer arg0) {
                progressBar.setVisibility(View.GONE);
                videoView.start();
            }
        });

        videoView
                .setOnCompletionListener(new OnCompletionListener() {

                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        videoView.stopPlayback();

                    }
                });

        videoView.setSoundEffectsEnabled(true);

        ((ViewPager) collection).addView(view, 0);

        return view;
    }

    @Override
    public void destroyItem(ViewGroup collection, int position, Object view) {
        /** Stop playing the video on activity destroyed */
        try {
            videoView.stopPlayback();
        } catch (Exception e) {
            Log.i("Error :", "Closing video");
        }

        ((ViewPager) collection).removeView((View) view);
    }


}

@Override
protected void onDestroy() {
    try {
        videoView.stopPlayback();
    } catch (Exception e) {
        Log.i("Error :", "Closing application");
    }
    super.onDestroy();
}

@Override
protected void onPause() {
    try {
        videoView.pause();
    } catch (Exception e) {
        Log.i("Error :", "Closing application");
    }
    super.onPause();
}

/* Function to create a video item object */
public VideoItem createVideoItem(String title, String url) {
    VideoItem videoItem = new VideoItem();
    videoItem.setTitle(title);
    videoItem.setUrl(url);
    return videoItem;
}

/* Function that returns a list of video item objects */
public ArrayList<VideoItem> getvideoList() {
    ArrayList<VideoItem> video = new ArrayList<VideoItem>(8);
    video.add(createVideoItem("A",
            "http://10.0.1.15:8081/media/big_buck.mp4"));
    video.add(createVideoItem("B",
            "http://10.0.1.15:8081/media/big_buck_bunny.mp4"));
    video.add(createVideoItem("C",
            "http://10.0.1.15:8081/media/big_buck.mp4"));
    video.add(createVideoItem("D",
            "http://10.0.1.15:8081/media/big_buck_bunny.mp4"));
    video.add(createVideoItem("E",
            "http://10.0.1.15:8081/media/big_buck_bunny.mp4"));
    video.add(createVideoItem("F",
            "http://10.0.1.15:8081/media/big_buck_bunny.mp4"));
    video.add(createVideoItem("G",
            "http://10.0.1.15:8081/media/big_buck_bunny.mp4"));
    video.add(createVideoItem("H",
            "http://10.0.1.15:8081/media/big_buck_bunny.mp4"));
    return video;
}
   }

logcat的:

    04-05 12:45:27.139: W/SurfaceView(10963): CHECK surface infomation creating=false formatChanged=false sizeChanged=false visible=false visibleChanged=true surfaceChanged=true realSizeChanged=false redrawNeeded=false left=false top=false
04-05 12:45:27.826: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:30.873: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:30.873: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:32.787: I/MediaPlayer(10963): path is null
04-05 12:45:32.787: D/MediaPlayer(10963): Couldn't open file on client side, trying server side
04-05 12:45:32.826: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:32.826: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:33.444: D/MediaPlayer(10963): getMetadata
04-05 12:45:33.444: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:33.490: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:33.584: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:34.514: W/SurfaceView(10963): CHECK surface infomation creating=false formatChanged=false sizeChanged=false visible=false visibleChanged=true surfaceChanged=true realSizeChanged=false redrawNeeded=false left=false top=false
04-05 12:45:36.662: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:36.662: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:39.248: I/MediaPlayer(10963): path is null
04-05 12:45:39.248: D/MediaPlayer(10963): Couldn't open file on client side, trying server side
04-05 12:45:39.295: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:39.303: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:39.944: D/MediaPlayer(10963): getMetadata
04-05 12:45:39.951: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:39.959: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:40.139: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:42.701: W/SurfaceView(10963): CHECK surface infomation creating=false formatChanged=false sizeChanged=false visible=false visibleChanged=true surfaceChanged=true realSizeChanged=false redrawNeeded=false left=false top=false
04-05 12:45:42.709: E/libEGL(10963): call to OpenGL ES API with no current context (logged once per thread)
04-05 12:45:42.709: W/HardwareRenderer(10963): EGL error: EGL_BAD_SURFACE
04-05 12:45:42.733: W/HardwareRenderer(10963): Mountain View, we've had a problem here. Switching back to software rendering.
04-05 12:45:44.701: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:44.701: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:45.444: D/dalvikvm(10963): GC_CONCURRENT freed 318K, 12% free 7922K/8967K, paused 3ms+6ms, total 53ms
04-05 12:45:45.740: I/MediaPlayer(10963): path is null
04-05 12:45:45.740: D/MediaPlayer(10963): Couldn't open file on client side, trying server side
04-05 12:45:45.834: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:45.834: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:46.420: D/MediaPlayer(10963): getMetadata
04-05 12:45:46.428: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:46.436: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:46.592: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:49.006: W/SurfaceView(10963): CHECK surface infomation creating=false formatChanged=false sizeChanged=false visible=false visibleChanged=true surfaceChanged=true realSizeChanged=false redrawNeeded=false left=false top=false
04-05 12:45:49.061: I/MediaPlayer(10963): path is null
04-05 12:45:49.061: D/MediaPlayer(10963): Couldn't open file on client side, trying server side
04-05 12:45:49.162: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:49.162: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:49.772: D/MediaPlayer(10963): getMetadata
04-05 12:45:49.772: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:49.795: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:49.990: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:50.514: W/SurfaceView(10963): CHECK surface infomation creating=false formatChanged=false sizeChanged=false visible=false visibleChanged=true surfaceChanged=true realSizeChanged=false redrawNeeded=false left=false top=false
04-05 12:45:50.592: I/MediaPlayer(10963): path is null
04-05 12:45:50.592: D/MediaPlayer(10963): Couldn't open file on client side, trying server side
04-05 12:45:51.076: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:51.076: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:51.311: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:51.311: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:51.381: D/MediaPlayer(10963): getMetadata
04-05 12:45:51.381: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:51.436: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:51.709: I/MediaPlayer(10963): sendBroadcast android.media.IMediaPlayer.videoexist
04-05 12:45:51.834: W/SurfaceView(10963): CHECK surface infomation creating=false formatChanged=false sizeChanged=false visible=false visibleChanged=true surfaceChanged=true realSizeChanged=false redrawNeeded=false left=false top=false
04-05 12:45:51.912: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:51.912: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:45:59.506: I/MediaPlayer(10963): path is null
04-05 12:45:59.506: D/MediaPlayer(10963): Couldn't open file on client side, trying server side
04-05 12:45:59.561: I/MediaPlayer(10963): path is null
04-05 12:45:59.561: D/MediaPlayer(10963): Couldn't open file on client side, trying server side
04-05 12:45:59.662: D/dalvikvm(10963): GC_CONCURRENT freed 338K, 12% free 8045K/9095K, paused 13ms+9ms, total 77ms
04-05 12:45:59.678: I/MediaPlayer(10963): path is null
04-05 12:45:59.678: D/MediaPlayer(10963): Couldn't open file on client side, trying server side
04-05 12:46:00.311: E/MediaPlayer(10963): stop called in state 4
04-05 12:46:00.311: E/MediaPlayer(10963): error (-38, 0)
04-05 12:46:00.444: W/SurfaceView(10963): CHECK surface infomation creating=false formatChanged=false sizeChanged=false visible=false visibleChanged=true surfaceChanged=true realSizeChanged=false redrawNeeded=false left=false top=false
04-05 12:46:00.451: W/SurfaceView(10963): CHECK surface infomation creating=false formatChanged=false sizeChanged=false visible=false visibleChanged=true surfaceChanged=true realSizeChanged=false redrawNeeded=false left=false top=false
04-05 12:46:00.475: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:46:00.475: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:46:00.483: D/MediaPlayer(10963): getMetadata
04-05 12:46:00.483: D/MediaPlayer(10963): getMetadata
04-05 12:46:00.483: W/MediaPlayer(10963): mediaplayer went away with unhandled events
04-05 12:46:01.467: I/MediaPlayer(10963): path is null
04-05 12:46:01.467: D/MediaPlayer(10963): Couldn't open file on client side, trying server side
04-05 12:46:01.498: I/MediaPlayer(10963): path is null
04-05 12:46:01.498: D/MediaPlayer(10963): Couldn't open file on client side, trying server side
04-05 12:46:01.756: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:46:01.756: E/SpannableStringBuilder(10963): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-05 12:46:02.061: E/MediaPlayer(10963): stop called in state 4
04-05 12:46:02.061: E/MediaPlayer(10963): error (-38, 0)
04-05 12:46:02.123: W/SurfaceView(10963): CHECK surface infomation creating=false formatChanged=false sizeChanged=false visible=false visibleChanged=true surfaceChanged=true realSizeChanged=false redrawNeeded=false left=false top=false
04-05 12:46:02.186: W/SurfaceView(10963): CHECK surface infomation creating=false formatChanged=false sizeChanged=false visible=false visibleChanged=true surfaceChanged=true realSizeChanged=false redrawNeeded=false left=false top=false
04-05 12:46:02.201: W/SurfaceView(10963): CHECK surface infomation creating=false formatChanged=false sizeChanged=false visible=false visibleChanged=true surfaceChanged=true realSizeChanged=false redrawNeeded=false left=false top=false
04-05 12:46:02.389: W/MediaPlayer(10963): mediaplayer went away with unhandled events
04-05 12:46:02.389: D/MediaPlayer(10963): getMetadata

1 个答案:

答案 0 :(得分:0)

您的 ViewPager 默认情况下在其内存中有两个页面。

尝试删除第一个视图以加载第三页时崩溃。

您可以使用

设置ViewPager在其内存中保留的页数

.setOffscreenPageLimit(X)

这会影响您的应用内存消耗,所以请注意。