2012-01-26 14 views
0

私は/sdcard/abc/a.3gpという場所に動画ファイルを持っています。今私が作ったばかりのメディアプレーヤーを使ってアンドロイドエミュレータでファイルを再生しようとすると、オーディオのみが得られ、ビデオは表示されません。画面は空白のままです(ビデオを再生するはずです)。ここで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(); 

    } 
    } 

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

レイアウト - > 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関連の問題をテストするためにエミュレータではなく、実際のデバイスを使用するようアドバイスします。

0

利用の.xmlファイルでSurfaceViewの代わりに、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> 

あなたが問題を解決したら、私たちは知ってみましょう。

0

あなたは単にvideoviewを使用しないでください。なぜなら、Mediaplayerのラッパーであり、セットアップが簡単です。
P/S:私はそれはナンセンスだあなたのコードmMediaPlayer.setDisplay(holder);で見た、あなたはsurfaceCreatedmMediaPlayer.setDisplay(surfaceHolder);を使用するか、playvideo()

でのparamとしてsurfaceHolderを渡す必要があります
関連する問題