Android MediaPlayer не отображает видео, только воспроизводит аудио - PullRequest
0 голосов
/ 26 января 2012

У меня есть видеофайл в папке /sdcard/abc/a.3gp.Теперь, когда я пытаюсь воспроизвести файл в эмуляторе Android с помощью только что созданного медиаплеера, я получаю только аудио, видео не отображается.Экран остается пустым (когда предполагается воспроизведение видео).

Вот код медиаплеера, который я использую:

package com.example.helloandroid;
import com.example.helloandroid.R;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnVideoSizeChangedListener;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;
import android.widget.VideoView;

public class HelloAndroidActivity extends Activity implements
OnBufferingUpdateListener, OnCompletionListener,
OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {

private static final String TAG = "MediaPlayerDemo";

private int mVideoWidth;

private int mVideoHeight;

private MediaPlayer mMediaPlayer;

private SurfaceView mPreview;

private SurfaceHolder holder;

private String path;

private Bundle extras;

private static final String MEDIA = "media";

private static final int LOCAL_AUDIO = 1;

private static final int STREAM_AUDIO = 2;

private static final int RESOURCES_AUDIO = 3;

private static final int LOCAL_VIDEO = 4;

private static final int STREAM_VIDEO = 5;

private boolean mIsVideoSizeKnown = false;

private boolean mIsVideoReadyToBePlayed = false;


/**
 * 
 * Called when the activity is first created.
 */
@Override

public void onCreate(Bundle icicle) {

    super.onCreate(icicle);

    setContentView(R.layout.main);

    mPreview = (SurfaceView) findViewById(R.id.surface_view);

    holder = mPreview.getHolder();

    holder.addCallback(this);

    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    extras = getIntent().getExtras();


}

private void playVideo() {

    doCleanUp();
    try {

             path = "/sdcard/abc/a.3gp";
             if (path == "") {

                    // Tell the user to provide a media file URL.
                    Toast

                            .makeText(

                                    HelloAndroidActivity.this,

                                    "Please edit MediaPlayerDemo_Video Activity, "
                                            + "and set the path variable to your media file path."

                                            + " Your media file must be stored on sdcard.",

                                    Toast.LENGTH_LONG).show();
                }                                   


        // Create a new media player and set the listeners

        mMediaPlayer = new MediaPlayer();

        mMediaPlayer.setDataSource(path);

        mMediaPlayer.setDisplay(holder);

        mMediaPlayer.prepare();

        mMediaPlayer.setOnBufferingUpdateListener(this);

        mMediaPlayer.setOnCompletionListener(this);

        mMediaPlayer.setOnPreparedListener(this);

        mMediaPlayer.setOnVideoSizeChangedListener(this);

        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

    }

     catch (Exception e) {

        Log.e(TAG, "error: " + e.getMessage(), e);

    }
}


public void onBufferingUpdate(MediaPlayer arg0, int percent) {

    Log.d(TAG, "onBufferingUpdate percent:" + percent);


}

public void onCompletion(MediaPlayer arg0) {

    Log.d(TAG, "onCompletion called");

}

public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {

    Log.v(TAG, "onVideoSizeChanged called");

    if (width == 0 || height == 0) {

        Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");

        return;
    }

    mIsVideoSizeKnown = true;

    mVideoWidth = width;

    mVideoHeight = height;

    if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {

        startVideoPlayback();
    }

}

public void onPrepared(MediaPlayer mediaplayer) {

    Log.d(TAG, "onPrepared called");

    mIsVideoReadyToBePlayed = true;

    if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {

        startVideoPlayback();
    }

}

public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {

    Log.d(TAG, "surfaceChanged called");


}

public void surfaceDestroyed(SurfaceHolder surfaceholder) {

    Log.d(TAG, "surfaceDestroyed called");

}


public void surfaceCreated(SurfaceHolder holder) {

    Log.d(TAG, "surfaceCreated called");

    playVideo();



}

@Override

protected void onPause() {

    super.onPause();

    releaseMediaPlayer();
    doCleanUp();

}

@Override

protected void onDestroy() {

    super.onDestroy();

    releaseMediaPlayer();
    doCleanUp();

}

private void releaseMediaPlayer() {

    if (mMediaPlayer != null) {

        mMediaPlayer.release();

        mMediaPlayer = null;

    }
}


private void doCleanUp() {

    mVideoWidth = 0;

    mVideoHeight = 0;

    mIsVideoReadyToBePlayed = false;

    mIsVideoSizeKnown = false;

}

private void startVideoPlayback() {

    Log.v(TAG, "startVideoPlayback");

    holder.setFixedSize(mVideoWidth, mVideoHeight);

    mMediaPlayer.start();

   }
  }

....................................................................

Файл макета-> main.xml:

      <?xml version="1.0" encoding="utf-8"?>
      <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/home_container"  
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent">

       <VideoView 
       android:id="@+id/surface_view" 
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       />

       </FrameLayout>

............................................................................

Я не уверен, есть ли ошибка в файле xml или в коде.

Более того, в журналах нет следов ошибки.

Пожалуйста, помогите мне.1018 * Спасибо.

Ответы [ 3 ]

1 голос
/ 26 января 2012

К сожалению, это один из недостатков широко известного эмулятора Android. Поддержка воспроизведения медиа очень ограничена, поэтому видео в большинстве случаев не может работать хорошо. Даже инженеры Google советуют использовать реальное устройство, а не эмулятор для тестирования проблем, связанных с MediaPlayer.

0 голосов
/ 20 мая 2014

Почему бы вам просто не использовать videoview, это обертка медиаплеера, легко настраиваемая.
P / s: я видел в вашем коде mMediaPlayer.setDisplay(holder); это нонсенс, вы должны использовать mMediaPlayer.setDisplay(surfaceHolder); внутри surfaceCreated или передать SurfaceHolder в качестве параметра в playvideo()

0 голосов
/ 04 ноября 2013

использовать SurfaceView в XML-файле вместо VideoView

  <?xml version="1.0" encoding="utf-8"?>
  <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:id="@+id/home_container"  
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent">

   <SurfaceView 
   android:id="@+id/surface_view" 
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   />

   </FrameLayout>

Сообщите нам, как только вы решили проблему.

...