具有多个SurfaceView的MediaPlayer

时间:2012-06-06 23:20:16

标签: android surfaceview android-mediaplayer

我有一个充当服务的媒体播放器,想要更改显示表面视图并让视频继续进行不同的活动。

在文档中,它声明我可以在媒体播放器的任何状态下调用setDisplay,当在ICS上设置显示时,我会得到一个闪烁的视频图像。只有这样我才能看到视频是通过拉下通知栏或执行某些操作导致像素更改音量一样。

设置简单...... 活动A |绑定到服务实例化媒体播放器附加表面并播放视频。 点击活动A中的链接,打开活动B ... 绑定到服务确保视频当前正在播放并将setDisplay设置为不同的surfaceview。

我尝试将surfaceview的可见性设置为在之前的活动中不可见/消失...首先调用setDisplay(null)....暂停然后恢复视频..并关闭绘图缓存。

非常感谢任何帮助或建议。

编辑: Android上的视频绝对可怕。 MediaPlayer对象应该保存一个可以检查的状态的私有变量。错误代码也非常模糊。除非你想播放视频,否则VideoView本身没有用。基本上,操纵表面视图从来都不是微不足道的,我假设是因为surfaceview的绘制方式与常规视图不同。

1 个答案:

答案 0 :(得分:0)

您应该使用TextureView进行显示,并使用mediaPlayer.setSurface而不是mediaPlayer.setDisplay。

从活动A调用活动B并传递视频位置参数。 在活动B中 - 当表面可用时,将其设置为MediaPlayer并点击开始。

我没有看到任何可能失败的原因,除非您丢失媒体播放器中发生的事情。

是的,Android非常糟糕(不仅仅是操纵视频)。

这是我的VideoFullScreenActivity代码

public class FullScreenVideoActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener {

    private EventBus bus = EventBus.getDefault();
    private CustomVideoView mAdapterVideoPlayer;
    private TextureView mFullScreenTextureView;
    private RelativeLayout container;
    private boolean mIsPortrait;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_full_screen_video);

        container = (RelativeLayout) findViewById(R.id.container);

        mFullScreenTextureView = (TextureView) findViewById(R.id.fullscreen_texture_surface);
        mFullScreenTextureView.setSurfaceTextureListener(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (!bus.isRegistered(this))
            bus.register(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (bus.isRegistered(this))
            bus.unregister(this);
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        if (mAdapterVideoPlayer != null)
            mAdapterVideoPlayer.setSeekPosition(PiplMediaPlayer.getInstance().getCurrentPosition());
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void fullscreen(VideFullscreenParams videFullscreenParams) {
        this.mAdapterVideoPlayer = videFullscreenParams.customVideoView;

        mIsPortrait = videFullscreenParams.customVideoView.getWidth() < videFullscreenParams.customVideoView.getHeight();
        if (mIsPortrait)
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        CustomMediaPlayer.getInstance().changeSurface(new Surface(surface));
        CustomMediaPlayer.getInstance().prepareController(container);
        CustomMediaPlayer.getInstance().setControllerTouchView(mFullScreenTextureView);
        CustomMediaPlayer.getInstance().start();
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        return false;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
    }

    public static class VideFullscreenParams {

        private final CustomVideoView customVideoView;

        public VideFullscreenParams(CustomVideoView customVideoView) {
            this.customVideoView = customVideoView;
        }
    }
}

正如您所看到的,我还使用了名为CustomMediaPlayer的类。这是一个包含MediaPlayer并在整个应用程序中管理其生命周期的singelton。 如果您要在RecyclerView或LinearLayout中加载多个视频,则必须这样做。