想在手机上播放一段视频,无奈一直报错,代码如下
animation.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
     <SurfaceView android:id = "@+id/surface"
                  android:layout_width = "wrap_content"
                  android:layout_height = "wrap_content"
                  android:visibility="visible" 
                  android:layout_centerVertical="true" 
                  android:layout_centerHorizontal="true">
     </SurfaceView>
</RelativeLayout>animation.java:package wood.recorder.animation;import java.io.IOException;import android.app.Activity;
import android.os.Bundle;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.view.SurfaceHolder;
import android.view.SurfaceView;public class Animation extends Activity implements OnCompletionListener {
    /** Called when the activity is first created. */
SurfaceView mPreview;
SurfaceHolder holder;
String path;
MediaPlayer mPlayer;

    @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.animation);
mPreview = (SurfaceView)findViewById(R.id.surface);
holder = mPreview.getHolder();
path = "/sdcard/title.mp4";
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(path);
mPlayer.prepare();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("IOException");
e.printStackTrace();
}
mPlayer.setOnCompletionListener(this);
mPlayer.setDisplay(holder);
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.start();


        
    } @Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.pause();
mp.stop();
mp.release();
// mp.reset();

}

@Override
public void onStop(){
mPlayer.stop();
super.onStop();
}
}
DDMS报错情况如下:
07-08 09:05:33.818: ERROR/PlayerDriver(31): Command PLAYER_PREPARE completed with an error or info PVMFErrResourceConfiguration
07-08 09:05:33.818: ERROR/MediaPlayer(242): error (1, -16)
07-08 09:05:33.829: INFO/System.out(242): IOException
07-08 09:05:33.829: WARN/System.err(242): java.io.IOException: Prepare failed.: status=0x1
07-08 09:05:33.838: WARN/PlayerDriver(31): PVMFInfoErrorHandlingComplete
07-08 09:05:33.848: WARN/System.err(242):     at android.media.MediaPlayer.prepare(Native Method)
07-08 09:05:33.848: WARN/System.err(242):     at wood.recorder.animation.Animation.onCreate(Animation.java:30)
07-08 09:05:33.848: WARN/System.err(242):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-08 09:05:33.848: WARN/System.err(242):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
07-08 09:05:33.848: WARN/System.err(242):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
07-08 09:05:33.848: WARN/System.err(242):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
07-08 09:05:33.858: WARN/System.err(242):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
07-08 09:05:33.858: WARN/System.err(242):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 09:05:33.858: WARN/System.err(242):     at android.os.Looper.loop(Looper.java:123)
07-08 09:05:33.858: WARN/System.err(242):     at android.app.ActivityThread.main(ActivityThread.java:4363)
07-08 09:05:33.858: WARN/System.err(242):     at java.lang.reflect.Method.invokeNative(Native Method)
07-08 09:05:33.858: WARN/System.err(242):     at java.lang.reflect.Method.invoke(Method.java:521)
07-08 09:05:33.868: WARN/System.err(242):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-08 09:05:33.868: WARN/System.err(242):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-08 09:05:33.878: WARN/System.err(242):     at dalvik.system.NativeStart.main(Native Method)手机模拟器显示是黑的,除了一个标签
另外有一点要说明的是,当我把path = "/sdcard/title.mp4"改为path = "/sdcard/try.mp3时,可以播放,try.mp3是一个音频文件,title.mp4是一个很短的视频文件
在线等高手指点...

解决方案 »

  1.   

    对了,我是用eclipse IDE和android SDK2.1开发的
      

  2.   

    public class test extends Activity  {  /** Called when the activity is first created. */  @Override  public void onCreate(Bundle savedInstanceState)  {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  /* 创建VideoView对象 */  final VideoView videoView = (VideoView) findViewById(R.id.VideoView01);  /* 操作播放的三个按钮 */  Button PauseButton = (Button) this.findViewById(R.id.PauseButton);  Button LoadButton = (Button) this.findViewById(R.id.LoadButton);  Button PlayButton = (Button) this.findViewById(R.id.PlayButton);  /* 装载按钮事件 */  LoadButton.setOnClickListener(new OnClickListener()  {  public void onClick(View arg0)  {  /* 设置路径 */  videoView.setVideoPath(“/sdcard/test.mp4″);  /* 设置模式-播放进度条 */  videoView.setMediaController(new MediaController(test.this));  videoView.requestFocus();  }  });  /* 播放按钮事件 */  PlayButton.setOnClickListener(new OnClickListener()  {  public void onClick(View arg0)  {  /* 开始播放 */  videoView.start();  }  });  /* 暂停按钮 */  PauseButton.setOnClickListener(new OnClickListener()  {  public void onClick(View arg0)  {  /* 暂停 */  videoView.pause();  }  });  }  }
      

  3.   

    这位牛人...我的API里压根没有VideoView这个类呀..
      

  4.   

     视频播放我没用过MediaPalyer , 
    我给的那段代码只是一个用VideoView的一个简单例子哈 , 仅做参考
      

  5.   

     视频播放我没用过MediaPalyer , 
    我给的那段代码只是一个用VideoView的一个简单例子哈 , 仅做参考
      

  6.   

    之前我也写过一个简单的播放器,貌似和楼主的差不多啊,只是数据放在系统里,而不是在sdcard里。当时我是在《Android SDK范例开发大全》里找到的代码,稍稍修改而成的。建议楼主查查。
      

  7.   

    开发方式比较多,多看点书,   Android SDK范例开发大全    里面有例子
      

  8.   

    《Android SDK范例开发大全》好书!顶
      

  9.   

    给楼主 提供一个 强大的播放器 还可以下载源码
    http://www.blogjava.net/zh-weir/archive/2010/01/24/310617.html
      

  10.   

    楼主说的那本书是我之前提到的《Android SDK范例开发大全》吗?结贴的时候把最后的结果也贴上来吧,大家可以学习一下。
      

  11.   

    应楼上要求,把代码发一下,不过因为这段播放视频是处在工程里的一段小代码,我把跟播放有关的代码截出来,可能不是很完整,大家学习的时候自己整理下应该就能用了......
    public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.voicechanger);
           mMediaPlayer = new MediaPlayer();
           bt_play = (Button) findViewById(R.id.play);
           bt_play.setOnClickListener(this);
    }
    public void onClick(View v) {
    switch (v.getId()) {
    case R.id.play:
    if (!mMediaPlayer.isPlaying() && !paused)
    startPlay();
    else if (!mMediaPlayer.isPlaying() && paused) {
    mMediaPlayer.start();
    paused = false;
    } else {
    mMediaPlayer.pause();
    buttonState(0, 2, 1);
    paused = true;
    }
    public void startPlay() {
    System.out.println("startPlay");

    paused = false;
    mMediaPlayer.setOnCompletionListener(this);
    mMediaPlayer.reset();
    System.out.println(filepath + "!!!!!!!!");
    try {
    mMediaPlayer.setDataSource(filepath);
    mMediaPlayer.prepare();
    mWakeLock.acquire();
    mMediaPlayer.start();
    } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalStateException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    filepath就是你存放视频文件的路径了,需要是3GP格式的
      

  12.   

    http://www.anddevs.com/?p=4
    大家可以看下这个原文如下看Android官方的Dev Guide时,在Audio and Video这章节中,其中Playing from a File or Stream 中有一段代码,如下:    MediaPlayer mp = new MediaPlayer();
        mp.setDataSource(PATH_TO_FILE);
        mp.prepare();
        mp.start();定义好PATH_TO_FILE,可以通过以下代码进行定义,String SDCardRoot =  Environment.getExternalStorageDirectory().getAbsolutePath();
    String path= SDCardRoot + File.separator + “video” + File.separator + “life.mp4″; 此处根据实际情况进行定义。定义完后,在模拟器中播放的时候报异常,java.io.IOException: Prepare failed.: status=0×1;通过上网查找资料,得知可以通过以下方案可以播放视频文件,如下:mp.setDataSource(somePathToAudioFile);这个方法中调用的是setDataSource(String);在Java中有一个FileDescriptor;我们可以通过getFD()方法得到一个FileDescriptor;以避免这些错误;代码如下:MediaPlayer mp = new MediaPlayer();
    try {
    File file = new File(path);
    FileInputStream fis = new FileInputStream(file);
    mp.setDataSource(fis.getFD());
    mp.prepare();
    } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalStateException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    mp.start(); 但是,有一个疑问,一直没有搞清楚,当我把life.mp4换成xin.rm后,即.rm格式的视频,却播放不了,找了好多资料,一直没有找到,在此先把问题留着了,不知道是不是不支持rm格式的视频。
      

  13.   

    还有一个方法是:
    把mediaPlayer.prepare;改成
    mediaPlayer.prepareAsync();
    试试