2012-01-26 145 views
0

我在位置/sdcard/abc/a.3gp中有一個視頻文件。現在,當我嘗試使用剛剛創建的媒體播放器在Android模擬器中播放文件時,我只獲取音頻,不顯示視頻。屏幕保持空白(當它應該播放視頻時)。Android MediaPlayer不顯示視頻,只播放音頻

這裏是我使用媒體播放器代碼:

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(); 

    } 
    } 

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

Layout-> 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文件還是在代碼中。

此外在日誌中沒有錯誤的痕跡。

請幫我一把。

謝謝。

回答

1

不幸的是,它似乎是廣爲人知的Android模擬器的缺點之一。它對媒體播放的支持非常有限,所以在大多數情況下,視頻效果不佳。即使Google工程師建議使用真實設備,而不是仿真器來測試MediaPlayer相關問題。在.xml文件,而不是VideoView

0

使用SurfaceView

<?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> 

讓我們知道,一旦你解決問題。

0

爲什麼你不使用videoview,它是mediaplayer的包裝,很容易安裝。
P/S:我在你的代碼mMediaPlayer.setDisplay(holder);看到它的廢話,你應該使用mMediaPlayer.setDisplay(surfaceHolder);surfaceCreatedplayvideo()

通過surfaceHolder作爲PARAM
相關問題