Проблема с воспроизведением Android MediaPlayer

У меня возникают проблемы, когда я использую Android MediaPlayer Class для воспроизведения готового видео.

  1. Я просмотрел MediaClass Android SDK и диаграмму состояний. Насколько я могу судить, после завершения воспроизведения видео вы сможете вызвать start () и запустить его с самого начала.
  2. Однако, когда я воспроизводю файл RSTP, я получаю следующие ошибки:

01-10 11: 36: 49.138: E / MediaPlayer (4821): error (-2147483648, 0)
01-10 11:36: 49.146: E / MediaPlayer (4821): error (1, -1) < br> 01-10 11: 36: 49.154: E / MediaPlayer (4821): Ошибка (-2147483648,0)
01-10 11:36: 49.162: E / MediaPlayer (4821): Попытка вызвать getDuration без действительный медиаплеер
01-10 11: 36: 49.162: E / MediaPlayer (4821): error (-38, 0)
01-10 11: 36: 49.169: E / MediaPlayer (4821): Error (1 , -1)
01-10 11: 36: 49.185: E / MediaPlayer (4821): Ошибка (-38,0)

3. Последняя проблема возникает, когда я воспроизводю MPG4 на веб-сайте. После повторного нажатия кнопки воспроизведения видео не отображается, а полоса поиска выходит из синхронизации.

Ниже мой код для Activity.

public class CustomMediaPlayer extends Activity implements MediaPlayerControl,
        OnCompletionListener, OnErrorListener, OnInfoListener,
        OnPreparedListener, OnSeekCompleteListener, OnVideoSizeChangedListener,
        SurfaceHolder.Callback, OnBufferingUpdateListener {




    // TODO Remove
    String TAG = "VAC";
    public static final String FILE_PATH = "rtsp://v4.cache2.c.youtube.com/CjYLENy73wIaLQkQ7cBxuSy88hMYDSANFEIJbXYtZ29vZ2xlSARSBXdhdGNoYJitofTlp8vjUAw=/0/0/0/video.3gp";

    //

    PowerManager pm;
    PowerManager.WakeLock wl;

    SpeechRecognizer sr;
    ImageView talkImageview;

    Toast toast;

    SurfaceView surfaceView;
    SurfaceHolder surfaceHolder;

    MediaPlayer mediaPlayer;
    MediaController controller;

    ProgressBar progressBar;

    Display currentDisplay;

    int videoWidth = 0;
    int videoHeight = 0;
    boolean readyToPlay = false;

    Handler handler;

    int bufferedPercentage;

    boolean finishedPlaying = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.video_player);

        pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
                | PowerManager.ACQUIRE_CAUSES_WAKEUP
                | PowerManager.ON_AFTER_RELEASE, new String());
        wl.acquire();

        preInitWidgets();
    }

    private void preInitWidgets() {
        toast = Toast.makeText(this, "", Toast.LENGTH_LONG);
        progressBar = (ProgressBar) findViewById(R.id.VideoPlayerProgressBar);
        talkImageview = (ImageView) findViewById(R.id.VideoPlayerTalkImageView);

        sr = SpeechRecognizer.createSpeechRecognizer(this);
        sr.setRecognitionListener(new listener());

        handler = new Handler();

        surfaceView = (SurfaceView) findViewById(R.id.VideoPlayerSurfaceView);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        mediaPlayer = new MediaPlayer();
        mediaPlayerInit();
        currentDisplay = getWindowManager().getDefaultDisplay();
        controller = new MediaController(this);

    }

    void mediaPlayerInit() {

        mediaPlayer.setOnCompletionListener(this);
        mediaPlayer.setOnErrorListener(this);
        mediaPlayer.setOnInfoListener(this);
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setOnSeekCompleteListener(this);
        mediaPlayer.setOnVideoSizeChangedListener(this);
        mediaPlayer.setOnBufferingUpdateListener(this);

        try {
            mediaPlayer.setDataSource(FILE_PATH);

            // mediaPlayer.setDataSource("http://www.blk-burn.com/sandbox/sj.mp4");
        } catch (Exception e) {
            toast.setText("Failed To Load Video");
            toast.show();
        }

    }

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

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mediaPlayer.setDisplay(holder);

        try {
            mediaPlayer.prepareAsync();
        } catch (Exception e) {
            toast.setText("Failed to Prepare");
            toast.show();
        }

        progressBar.setVisibility(View.VISIBLE);

    }

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

    }

    @Override
    public void onVideoSizeChanged(android.media.MediaPlayer mp, int width,
            int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onSeekComplete(android.media.MediaPlayer mp) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onBufferingUpdate(MediaPlayer mp, int bufferedPercent) {
        this.bufferedPercentage = bufferedPercent;

    }

    @Override
    public void onPrepared(android.media.MediaPlayer mp) {
        videoWidth = mp.getVideoWidth();
        videoHeight = mp.getVideoHeight();

        if (videoWidth > currentDisplay.getWidth()
                || videoHeight > currentDisplay.getHeight()) {
            float heightRatio = (float) videoHeight
                    / (float) currentDisplay.getHeight();
            float widthRatio = (float) videoWidth
                    / (float) currentDisplay.getWidth();

            if (heightRatio > 1 || widthRatio > 1) {
                if (heightRatio > widthRatio) {
                    videoHeight = (int) Math.ceil((float) videoHeight
                            / (float) heightRatio);
                    videoWidth = (int) Math.ceil((float) videoWidth
                            / (float) heightRatio);
                } else {
                    videoHeight = (int) Math.ceil((float) videoHeight
                            / (float) widthRatio);
                    videoWidth = (int) Math.ceil((float) videoWidth
                            / (float) widthRatio);
                }
            }
        }

        surfaceView.setLayoutParams(new LinearLayout.LayoutParams(videoWidth,
                videoHeight));

        surfaceView.setLayoutParams(new LinearLayout.LayoutParams(videoWidth,
                videoHeight));
        controller.setMediaPlayer(this);
        controller
                .setAnchorView(findViewById(R.id.VideoPlayerSurfaceViewLinearLayout));
        controller.setEnabled(true);
        controller.show();

        mp.start();

        // TODO - Get Catch Phrase

        talkImageview.setVisibility(View.VISIBLE);
        progressBar.setVisibility(View.GONE);

        // startListeningForVoice();

    }

    @Override
    public boolean onInfo(android.media.MediaPlayer mp, int what, int extra) {
        // TODO
        return false;
    }

    @Override
    public boolean onError(android.media.MediaPlayer mp, int what, int extra) {
        if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) {
            toast.setText("Media Server Died");
            toast.show();
        } else if (what == MediaPlayer.MEDIA_ERROR_UNKNOWN) {
            toast.setText("Unknown Error");
            toast.show();
        }
        return false;
    }

    @Override
    public void onCompletion(android.media.MediaPlayer mp) {



    }

    public boolean canPause() {
        return true;
    }

    public boolean canSeekBackward() {
        return true;
    }

    public boolean canSeekForward() {
        return true;
    }

    public int getBufferPercentage() {
        return bufferedPercentage;

    }

    public int getCurrentPosition() {
        return mediaPlayer.getCurrentPosition();
    }

    public int getDuration() {
        return mediaPlayer.getDuration();
    }

    public boolean isPlaying() {
        return mediaPlayer.isPlaying();
    }

    public void pause() {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.pause();
        }
    }

    public void seekTo(int pos) {
        mediaPlayer.seekTo(pos);
    }

    public void start() {
        mediaPlayer.start();

    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            if (controller.isShowing()) {
                controller.hide();
            } else {
                controller.show();
            }
        }
        return false;
    }

    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        mediaPlayer.stop();
        mediaPlayer.release();
        wl.release();

    }





}

person ControlAltDelete    schedule 10.01.2013    source источник
comment
Я не знаком с упомянутым SDK, но что произойдет, если вы поместите mediaPlayer.getDuration() в блок if, где вы проверяете, является ли mediaPlayer.isPlaying() истинным, и вернете, скажем, ноль, в противном случае. Просто догадываюсь.   -  person harism    schedule 10.01.2013


Ответы (1)


Проблема в вашем setDataSource. Android не поддерживает потоки rtsp. Я несколько раз пробовал rtsp, но безуспешно. Если вы попытаетесь передать поток с http, он определенно должен работать, если формат видео поддерживается. Взгляните на библиотеку Vitamio здесь, http://vitamio.org/. Он поддерживает потоки rtsp, а также многие другие аудио и видео форматы, которые не поддерживаются Android.

person Peshal    schedule 20.02.2013
comment
Android поддерживает RTSP (developer.android.com/guide/appendix/media-formats .html) Должно быть, были другие проблемы. - person Mike T; 08.11.2013