如何在Android中准备媒体播放器而另一个播放?

时间:2015-02-27 20:09:32

标签: android android-mediaplayer surfaceview

我使用MediaPlayerto从http流播放视频是否有任何解决方案,准备第二个媒体播放器与另一个http网址,而第一个仍在播放? 我想播放两个没有黑屏的视频,当第一个第二个结束时立即开始。

这是我的代码:

public class VideoActivity extends Activity implements SurfaceHolder.Callback {


private MediaPlayer mediaPlayer;
private SurfaceHolder surfaceHolder;
private SurfaceView playerSurfaceView;
private String videoSrc  = "http://192.168.1.101:8090/api/video/";
private String android_id;

private MediaPlayer next;
private static boolean firstCall = true;
private String secondVideoSrc = "http://192.168.1.101:8090/api/secondvideo/";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_video);

    playerSurfaceView = (SurfaceView)findViewById(R.id.playersurface);
    surfaceHolder = playerSurfaceView.getHolder();
    surfaceHolder.addCallback(this);

    GetDeviceId();
    videoSrc += android_id;
    secondVideoSrc += android_id;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
    prepareVideoPlayer();

}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

private void GetDeviceId() {
    android_id = Settings.Secure.getString(getBaseContext().getContentResolver(),
            Settings.Secure.ANDROID_ID);
}



private void prepareVideoPlayer() {
    try {
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setDisplay(surfaceHolder);
        mediaPlayer.setDataSource(this, Uri.parse(videoSrc));
        mediaPlayer.setScreenOnWhilePlaying(true);
        mediaPlayer.prepareAsync();
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                if(firstCall) {
                    mediaPlayer.start();
                    firstCall = false;
                }
                new AsyncPrepareNext().execute();
            }
        });
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                next.start();
            }
        });
    }
    catch(Exception ex) {
    }
}
private void prepareNext() {
    try {
        next = new MediaPlayer();
        next.setDisplay(surfaceHolder);
        next.setDataSource(this, Uri.parse(secondVideoSrc));
        next.setScreenOnWhilePlaying(true);
        next.prepareAsync();
        next.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {

            }
        });
        next.setAudioStreamType(AudioManager.STREAM_MUSIC);
        next.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {

            }
        });
    }
    catch(Exception ex) {
    }
}
private class AsyncPrepareNext extends AsyncTask<Void,Void,Void> {

    @Override
    protected Void doInBackground(Void... params) {
        prepareNext();
        return null;
    }
}

}

当我运行时,第一个视频开始2或3秒然后因媒体服务器死亡等一些错误而停止,音频flinger死亡,错误(100,0),错误(38,0)

1 个答案:

答案 0 :(得分:0)

您可能需要实现OnPreparedListener()和OnCompletedListener()才能完成此操作,您可能还需要2个媒体播放器。

    @Override
    public void onPrepared(MediaPlayer mp){
        // Set Video Source for second video
        mp.setDataSource(path);
        // Prepare second video
        mp.prepareAsync();
    }
    @Override
    public void onCompletion(MediaPlayer mp){
        // Start second video here
        mp.start();
    }

并将它们设置为:

    mediaPlayer.setOnPreparedListener(new OnPreparedListener());
    mediaPlayer.setOnCompletedListener(new OnCompletionListener());