1

我有一个关于 MediaPlayer 与表面视图相结合的错误:

我正在通过从 Internet 流式传输的方式在表面视图中播放视频,如下所示:

    mPreview = (SurfaceView) findViewById(R.id.surface);
    videoFL = (FrameLayout) findViewById(R.id.videoFL);
    SurfaceHolder holder = mPreview.getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

后来我尝试将我的第一个 MediaPlayer 附加到它:

    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setDataSource(videos.get(position));
    mediaPlayer.prepareAsync();
    mediaPlayer.setOnBufferingUpdateListener(this);
    mediaPlayer.setOnCompletionListener(this);
    mediaPlayer.setOnPreparedListener(this);
    mediaPlayer.setOnVideoSizeChangedListener(this);
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.setDisplay(holder);

在流式传输第一个视频时,我已经在缓冲第二个视频以节省我的用户时间。要将第二个已经准备好的 MediaPlayer 实例附加到我的 SurfaceView,我执行以下操作以释放旧的实例:

        mediaPlayer.release();
        mediaPlayer = null;
        ....
        mediaPlayer2.setDisplay(holder);

在 ICS 和 Jelly Bean 上,此解决方案运行良好,但在 Gingerbread 上却无法按计划运行。视频正在播放但未显示(黑屏,仅在视频中某处显示图片),我通过以下方式识别:

mediaPlayer2.getCurrentPosition();

我总是在我的 SeekBar 上获得正确的位置。我在 HTC Wildfire S 上试过。

有没有人猜到为什么这个错误会发生在姜饼上?

带着敬意,

策曼

4

1 回答 1

0

我现在确实将我的版本减少到一个 MediaPlayer,因为正如我在我的问题中所说的那样,某些 2.x 设备确实没有能力在同一个 Activity 中使用第二个 MediaPlayer 实例。所以我总是通过为即将到来的视频调用prepare()方法来重新实例化我的 MediaPlayer 。

于 2013-10-18T07:49:12.003 回答