Android的MediaPlayer的setNextMediaPlayer不工作 [英] Android MediaPlayer setNextMediaPlayer not working

查看:2880
本文介绍了Android的MediaPlayer的setNextMediaPlayer不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的目标是创建一个 VideoView 可在 pre-定义播放列表播放视频

My objective is to create a VideoView that can play videos in a pre-defined play list.

我试图用 MediaPlayer.setNextMediaPlayer(...)来允许两个视频之间的无缝过渡。然而,当第一个影片播放完毕后,第二视频不会自动,因为它应该根据文档开始。

I'm trying to use MediaPlayer.setNextMediaPlayer(...) to allow a seamless transition between two videos. However, when the first video finishes playing, the 2nd video will not start automatically as it should according to the documentation.

Xamarin的Andr​​oid code

    Queue<MediaPlayer> MediaPlayerList = null;
    private void PlayVideo()
    {
        MediaPlayerList = new Queue<MediaPlayer>();

        //Let's go ahead and create all media players
        VideoView_CurrentVideoView = new VideoView(this);

        VideoView_CurrentVideoView.Completion += mVideoView_Completion;
        VideoView_CurrentVideoView.Prepared += mVideoView_Prepared;

        //Let's prepare all MediaPlayer
        for (int i = 0; i < VideoView_CurrentVideoChannel.VideoAssetList.Count; i++)
        {
            string filePath = FilePath[i];
            if (i == 0)
            {
                VideoView_CurrentVideoView.SetVideoPath(filePath);
                VideoContainer.AddView(VideoView_CurrentVideoView);
            }
            else
            {
                MediaPlayer mpNew = new MediaPlayer();
                mpNew.SetDataSource(filePath);
                MediaPlayerList.Enqueue(mpNew);
            }
        }

        VideoView_CurrentVideoView.Start();
    }

    void mVideoView_Completion(object sender, EventArgs e)
    {
        MediaPlayer mp = (MediaPlayer)sender;
        mp.Release();
    }

    void mVideoView_Prepared(object sender, EventArgs e)
    {
        MediaPlayer mp = (MediaPlayer)sender;

        //Take the next available MediaPlayer from the queue
        MediaPlayer nextMediaPlayer = MediaPlayerList.Dequeue();

        //Put the current MediaPlayer at the end of the queue
        MediaPlayerList.Enqueue(mp);


        nextMediaPlayer.Prepare();
        mp.SetNextMediaPlayer(nextMediaPlayer);
    }

任何帮助或建议,将大大AP preciated。这是 codeD Xamarin的Andr​​oid

更新#1:从prepared移动prepare()离开后,()事件

    Queue<string> VideoListQueue = null;
    MediaPlayer NextMediaPlayer = null;
    private void PlayVideo()
    {
        string filePath = FilePath[0];


        //Create video view
        if (VideoContainer.ChildCount == 0)
        {
            //setup the videoview container
            VideoView_CurrentVideoView = new VideoView(this);
            VideoView_CurrentVideoView.Info += VideoView_CurrentVideoView_Info;
            VideoView_CurrentVideoView.Error += VideoView_CurrentVideoView_Error;

            LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FillParent, ViewGroup.LayoutParams.FillParent);
            param.LeftMargin = 0;
            param.RightMargin = 0;
            param.BottomMargin = 0;
            param.TopMargin = 0;

            VideoView_CurrentVideoView.LayoutParameters = param;
            VideoView_CurrentVideoView.LayoutParameters.Width = ViewGroup.LayoutParams.FillParent;
            VideoView_CurrentVideoView.LayoutParameters.Height = ViewGroup.LayoutParams.FillParent;

            VideoView_CurrentVideoView.Completion += VideoView_CurrentVideoView_Completion;
            VideoView_CurrentVideoView.Prepared += VideoView_CurrentVideoView_Prepared;
            VideoContainer.AddView(VideoView_CurrentVideoView);
        }

        VideoView_CurrentVideoView.SetVideoPath(filePath);
        VideoView_CurrentVideoView.SeekTo(0);
        VideoView_CurrentVideoView.Start();
    }

    void VideoView_CurrentVideoView_Prepared(object sender, EventArgs e)
    {
        //Do nothing at this moment
        MediaPlayer mp = (MediaPlayer)sender;
    }

    void VideoView_CurrentVideoView_Completion(object sender, EventArgs e)
    {
        //GC the finished MediaPlayer
        MediaPlayer mp = (MediaPlayer)sender;
        mp.Reset();
        mp.Release();
        mp = null;


        //Preparing the next MediaPlayer
        MediaPlayer currentPlayer = NextMediaPlayer;
        NextMediaPlayer = SetupNextMediaPlayer();
        currentPlayer.SetNextMediaPlayer(NextMediaPlayer);
    }


    MediaPlayer SetupNextMediaPlayer()
    {
        MediaPlayer mp = new MediaPlayer();
        //When the video start playing, let's get ready for next one
        string sourceURL = VideoListQueue.Dequeue();
        VideoListQueue.Enqueue(sourceURL);

        string filePath = sourceURL;


        mp = new MediaPlayer();
        mp.Info += VideoView_CurrentVideoView_Info;
        mp.Completion += VideoView_CurrentVideoView_Completion;
        mp.Prepared += VideoView_CurrentVideoView_Prepared;

        mp.SetDataSource(filePath);
        mp.Prepare();


        //Fire back the created MediaPlayer object to the caller
        return mp;
    }

    void VideoView_CurrentVideoView_Info(object sender, MediaPlayer.InfoEventArgs e)
    {
        Console.WriteLine("What = " + e.What);

        switch (e.What)
        {
            case MediaInfo.VideoRenderingStart:
                {
                    //This is only happening on video first started
                    NextMediaPlayer = SetupNextMediaPlayer();
                    e.Mp.SetNextMediaPlayer(NextMediaPlayer);
                    break;
                }
        }

    }

    void VideoView_CurrentVideoView_Error(object sender, MediaPlayer.ErrorEventArgs e)
    {
        e.Handled = true;
    }

目前时刻,媒体播放器将一旦第一个完成开始播放第2视频。然而,第二个视频只有声音,没有图像显示。

At this moment, the media player will begin playing the 2nd video once the first one is done. However, the 2nd video only have sound and no video showing.

任何人都知道我做错了什么?我有一种感觉,它做的东西的MediaPlayer没有连接到SurfaceView。不过,我创建使用VideoView的观点,我怎么能得到表面从VideoView?

Anyone know what I did wrong? I have a feeling that it has to do something with the MediaPlayer not attached to the SurfaceView. However, I created the view using VideoView, how can I get the Surface from VideoView?

推荐答案

关于打第二只视频有声:尝试实施OnCompletionListener监听每个MediaPlayer的这个:

Regarding playing 2nd video only with sound: try to implement OnCompletionListener listener for each MediaPlayer with this:

mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

    @Override
    public void onCompletion(MediaPlayer mp) {
        mp.setDisplay(null); //for current mediaPlayer
        nextMediaPlayer.setDisplay(getHolder()); //for next video
    }
});

我不能说是无缝是,但不知何故,它的工作原理。要归档这个我不使用标准VideoView,但自定义视图,从SurfaceView延伸。

I can't say that is is gapless, but somehow it works. To archive this I don't use standard VideoView, but custom View, that extends from SurfaceView.

这篇关于Android的MediaPlayer的setNextMediaPlayer不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆