user1281960
user1281960

Reputation: 11

Video not displayed with 2 instances of mediaplayer

I am trying to use two instances of mediaplayer. When the first instance is played the second instance is prepared in another thread.and when first instance completes the file the second instance is started.

Problem: the second instance plays only audio, video is not visible.

Observation:If i prepare the second instance with the same surface holder as that of the first and start after first instance is completed it works fine. Here is the code

package com.THER;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import com.THER.MessengerServiceActivities.IncomingHandler;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.widget.VideoView;
import android.widget.ViewSwitcher;

public class MediaPlayerActivity extends Activity implements OnCompletionListener, Callback, OnPreparedListener {

private MediaPlayer mMediaPlayer1 = null;
    private SurfaceView mPreview1;
    private SurfaceHolder holder1;
    private ViewSwitcher switcher;

    Integer counter = 0;
    Integer played_files = 1;
    private MediaPlayer mMediaPlayer2 = null;
    private SurfaceView mPreview2;
    private SurfaceHolder holder2;
    boolean mIsBound;
    boolean finish_flag = false;
    /** Messenger for communicating with service. */
    Messenger mService = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        Intent intent; 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.videoview);
        doBindService();
        intent = getIntent();
        counter=intent.getIntExtra("counter",counter);


        mPreview1 =(SurfaceView)findViewById(R.id.surfaceView1);
        holder1 = mPreview1.getHolder();
        holder1.addCallback(this);  
        holder1.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        mPreview2 =(SurfaceView)findViewById(R.id.surfaceView2);
        holder2 = mPreview2.getHolder();
        holder2.addCallback(this);  
        holder2.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        mMediaPlayer1 = new MediaPlayer();
        mMediaPlayer1.setScreenOnWhilePlaying(true);
        mMediaPlayer2 = new MediaPlayer();
        mMediaPlayer2.setScreenOnWhilePlaying(true);
        try {

                mMediaPlayer1.setDataSource("/sdcard/1.mp4");
                mMediaPlayer1.setDisplay(holder1);

            } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                    // TODO Auto-generated catch block
                e.printStackTrace();
            }



        mMediaPlayer1.setOnCompletionListener(this);
        mMediaPlayer1.setOnPreparedListener(this);
        //mMediaPlayer2.setOnPreparedListener(this);
        mMediaPlayer2.setOnCompletionListener(this);




        }
    private class MediaPlayerTask extends AsyncTask<MediaPlayer, Void, String> implements OnCompletionListener {

            String file;
            private SurfaceHolder holder;
        @Override
            protected String doInBackground(MediaPlayer... mp1) {
                // TODO Auto-generated method stub
             //mp1[0].reset();
             if(counter%2 == 0)
             {
                file = "/sdcard/2.mp4";
                holder = holder2;
             }
             else
             {
                file = "/sdcard/1.mp4";
                holder = holder1;
             }

            try {

                    mp1[0].reset();
                    mp1[0].setDataSource(file);
                    mp1[0].setDisplay(holder);
                    mp1[0].prepare();
                    mp1[0].setOnCompletionListener(this);
                    //mp1[0].start();

            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return null;
            }
        public void onCompletion(MediaPlayer mp) {
            // TODO Auto-generated method stub

        }


}



public void onCompletion(MediaPlayer mp)
{

     if(counter%2 == 0)
        {
            played_files++;
            mMediaPlayer1.stop();
            mMediaPlayer1.release();

            mMediaPlayer2.start();


        }
        else
        {
            played_files++;
            mMediaPlayer2.stop();
            mMediaPlayer2.release();

            mMediaPlayer1.start();  

        }
}

public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub

}

public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    try {
        if(counter%2 == 0)
        {
            mMediaPlayer2.prepare();
        }
        else
        {
            mMediaPlayer1.prepare();
        }
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub

}

public void onPrepared(MediaPlayer mp) {
    // TODO Auto-generated method stub
    //if(counter == 1)
        mp.start();

}

}

Upvotes: 1

Views: 2080

Answers (1)

RhonanMS
RhonanMS

Reputation: 46

Please take a look at the following thread: http://groups.google.com/group/android-developers/browse_thread/thread/7d08a124a2e48bb3?pli=1

It looks like using two SurfaceViews was not intended by the Android developers.

Upvotes: 1

Related Questions