【问题标题】:How to prepare mediaplayer in android while another playing?如何在另一个播放时在 android 中准备媒体播放器?
【发布时间】:2015-02-27 20:09:32
【问题描述】:

我使用 MediaPlayer 来播放来自 http 流的视频,是否有任何解决方案可以在第一个媒体播放器仍在播放时使用另一个 http url 准备第二个媒体播放器? 我想播放两个没有黑屏的视频,第一个结束第二个立即开始。

这是我的代码:

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 秒,然后停止并出现一些错误,例如媒体服务器死机、音频投掷器死机、错误 (100,0)、错误 (38,0)

【问题讨论】:

    标签: android android-mediaplayer surfaceview


    【解决方案1】:

    您可能需要实现 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());
    

    【讨论】:

    • 我已经使用了两个媒体播放器,并且已经实现了 onPrepared onCompleted,正如您在我的代码中看到的那样....当我调用 prepareAsync 或准备视频停止并且我收到错误 media server die error (100, 0 )
    • 你在什么设备上运行这个?该设备可能一次不支持多个视频。另外,您是否尝试过使用VideoView? In 为你封装了很多这样的东西,那么你只需要担心切换视图。
    • 您也可以尝试实现 onErrorLIstener 来尝试缩小错误范围。设备支持这两种视频格式吗?尝试通过默认播放器应用单独播放它们,看看是否仍然出现错误。
    • 设备没有问题...可能是 HTTP 连接,因为我需要两个视频的两个并行连接...当我调用第一个 evrething 的 oncompletedListener 中的第二个媒体播放器准备工作时,视频没有问题,但是准备视频时黑屏 3-5 秒。
    • 除非您将视频存储在本地设备上,否则我认为您将无法删除该黑屏。较新的 Android 设备虽然功能强大,但其内存量仍然有限。 3-5 秒对于网络上的视频流来说还不错。 Android 中的默认 MediaPlayer 也非常基本。如果您想要更好的结果,您可以随时尝试其他媒体播放器,例如 ExoPlayer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多