I have met nearly the same problem, I am implementing the Mediaplayer to my
hardware board. I haven't tried videoview, I just implemented the video player
from API demo.But It can't show video. I guess there is some trick with this
"holder" surface, it is strange that when I delete this sentence, my emulator
will not show video just as the real board,
holder.addCallback(this);
but I added the sentence, although my emulator can successfully play video, my
real hardware still like before.
and I am a little bit curious you didn't use this "holder.addCallback(this);"
here is my program, I haven't solved my problem yet:
public class MediaPlayerDemo_Video extends Activity implements
OnBufferingUpdateListener, OnCompletionListener,
MediaPlayer.OnPreparedListener, 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;
/**
*
* Called when the activity is first created.
*/
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.mediaplayer_2);
mPreview = (SurfaceView) findViewById(R.id.surface);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
extras = getIntent().getExtras();
}
private void playVideo(Integer Media) {
try {
switch (Media) {
case LOCAL_VIDEO:
/*
* TODO: Set the path variable to a local media file path.
*/
path = "";
/* if (path == "") {
// Tell the user to provide a media file URL.
Toast
.makeText(
MediaPlayerDemo_Video.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();
}*/
break;
case STREAM_VIDEO:
/*
* TODO: Set path variable to progressive streamable mp4 or
* 3gpp format URL. Http protocol should be used.
* Mediaplayer can only play "progressive streamable
* contents" which basically means: 1. the movie atom has to
* precede all the media data atoms. 2. The clip has to be
* reasonably interleaved.
*
*/
path = "";
if (path == "") {
// Tell the user to provide a media file URL.
Toast
.makeText(
MediaPlayerDemo_Video.this,
"Please edit MediaPlayerDemo_Video
Activity,"
+ " and set the path variable
to your media file URL.",
Toast.LENGTH_LONG).show();
}
break;
}
// Create a new media player and set the listeners
mMediaPlayer = new MediaPlayer();
AssetFileDescriptor afd = getResources().openRawResourceFd
(R.raw.movie);
Log.v(TAG,afd.toString());
mMediaPlayer.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(), afd.getLength());
// mMediaPlayer.setDataSource(path);
mMediaPlayer.setDisplay(holder);
mMediaPlayer.prepare();
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
Log.d(TAG, "mMediaPlayer.start is to be called");
mMediaPlayer.start();
} catch (Exception e) {
Log.e(TAG, "error: " + e.getMessage(), e);
}
}
public void onBufferingUpdate(MediaPlayer arg0, int percent) {
Log.d(TAG, "onBufferingUpdate percent:" + percent);
}
/**
* you don't call onPrepared() yourself. If you set an
*PreparedListener, its onPrepared() method will be called for you.
*/
public void onCompletion(MediaPlayer arg0) {
Log.d(TAG, "onCompletion called");
}
public void onPrepared(MediaPlayer mediaplayer) {
Log.d(TAG, "onPrepared called");
mVideoWidth = mMediaPlayer.getVideoWidth();
mVideoHeight = mMediaPlayer.getVideoHeight();
if (mVideoWidth != 0 && mVideoHeight != 0) {
holder.setFixedSize(mVideoWidth, mVideoHeight);
}
}
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) {
// TODO Auto-generated method stub
Log.d(TAG, "surfaceCreated called");
playVideo(extras.getInt(MEDIA));
}
@Override
protected void onDestroy() {
super.onDestroy();
// TODO Auto-generated method stub
if (mMediaPlayer != null) {
mMediaPlayer.release();
mMediaPlayer = null;
}
}
}
在2009-03-04,zypsg <[email protected]> 写道:
>
>Hi, A surprising problem occurs when I try to play Video, I can only
>hear the sound part of the video. My code snippet is below:
>
>public class VideoDemo extends Activity {
>
> public static final int MENU_PLAYER=Menu.FIRST;
> public static final int MENU_VIDEO=MENU_PLAYER+1;
> private final static String VIDEOURL="/sdcard/10-58-26.3gp";
> /** Called when the activity is first created. */
> @Override
> public void onCreate(Bundle savedInstanceState) {
> super.onCreate(savedInstanceState);
> setContentView(R.layout.main);
> // playVideoByVideoView(VIDEOURL);
> }
> private void playVideoByVideoView(String fileURL){
>// this.getWindow().setFormat(PixelFormat.TRANSLUCENT);
> setContentView(R.layout.videoview);
> VideoView videoView=(VideoView)findViewById(R.id.surface_view);
>
>// videoView.setVisibility(SurfaceView.VISIBLE);
> videoView.bringToFront();
> videoView.setVideoPath(fileURL);
> videoView.setMediaController(new MediaController(this));
> videoView.requestFocus();
>// videoView.start();
> }
> private void playVideoByMediaPlayer(String fileURL){
> MediaPlayer mp = new MediaPlayer();
> SurfaceView sv =new SurfaceView(this);
> try {
> mp.setDataSource(fileURL);
> mp.setDisplay(sv.getHolder());
> mp.prepare();
> mp.start();
> } catch (IllegalArgumentException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> mp.release();
>
> } catch (IllegalStateException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> mp.release();
> } catch (IOException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> mp.release();
> }
> }
> @Override
> public boolean onCreateOptionsMenu(Menu menu) {
> // TODO Auto-generated method stub
> boolean ret= super.onCreateOptionsMenu(menu);
> menu.add(0, MENU_PLAYER, 0, "MediaPlayer");
> menu.add(0, MENU_VIDEO, 0, "VideoView");
> return ret;
> }
> @Override
> public boolean onMenuItemSelected(int featureId, MenuItem item) {
> // TODO Auto-generated method stub
> boolean ret= super.onMenuItemSelected(featureId, item);
> switch(item.getItemId()){
> case MENU_PLAYER:
> playVideoByMediaPlayer(VIDEOURL);
>
> break;
> case MENU_VIDEO:
> playVideoByVideoView(VIDEOURL);
> break;
> }
> return ret;
> }
>}
>
>
>
>But when I invoke playVideoByVideoView() method in onCreate() ,I can
>see the video part. Can anybody tell me why this problem happen? How
>can I solve this problem. Thanks Very Much!
>
>>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---