使用Android的MediaPlayer类播放资源视频

时间:2011-08-24 05:58:10

标签: android android-mediaplayer

我在项目的test.mp4目录中保存了一段视频res/raw。我已将SurfaceView声明为:

  <SurfaceView android:id="@+id/surface"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center">
  </SurfaceView>

然后,在我的活动的onCreate ()方法中,我有以下内容:

private MediaPlayer mp;
private SurfaceView view;
private SurfaceHolder holder;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    view = (SurfaceView) findViewById (R.id.surface);
    holder = view.getHolder();
    holder.setKeepScreenOn (true); 
    mp = MediaPlayer.create(this.getBaseContext (), R.raw.test);
    mp.setDisplay (holder);
    mp.setLooping (true);
    mp.start();
}

即使我设置了显示器,我也不明白为什么它不显示视频。我正在运行API 7(2.1.1),我得到了音频。我需要一个只有视频类型的界面,没有控制面板。据我所知,VideoView虽然比MediaPlayer简单,但却有内置的控制层。此外,我没有看到在资源上使用VideoView的方法。如果我有这两个问题的解决方法,或者如果我对VideoView的假设是错误的,我会很高兴被告知。


更新:我目前正在使用VideoView课程。关于自动拥有UI控制面板,我的假设确实是错误的。尽管如此,我还是无法通过res/raw课程播放存储在MediaPlayer中的视频;当我拨打prepare ()或播放音频时,它总是会失败,但视频却没有。因此,我的问题仍然存在。

如果有人遇到我关于如何使用VideoView的问题,请告诉我在res/raw中查找如何检索视频时遇到的麻烦。以下代码段假设您在布局文件VideoView中有view,其ID为main.xml

public class generalActivity extends Activity {
    @Override
    public void onCreate (Bundle icicle) {
        super.onCreate (icicle);
        this.setContent (R.layout.main);

        // You know the that view is an instance of VideoView, so cast it as such
        VideoView v = (VideoView) this.findViewById (R.id.view);

        // This is the name of the video WITHOUT the file extension.
        // In this example, the name of the video is 'test.mp4'
        String videoName = "test"

        // You build the URI to your video here
        StringBuilder uriPathBuilder = new StringBuilder ();
        uriPathBuilder.append ("android.resource://");
        uriPathBuilder.append (this.getPackageName ());
        uriPathBuilder.append (File.separator);
        uriPathBuilder.append ("raw");
        uriPathBuilder.append (File.separator);
        uriPathBuilder.append (videoName);
        Uri uri = Uri.parse (uriPathBuilder.toString ());

        view.setVideoURI (uri);
        view.start ();
    }
}

以下是我用作获取uri路径的参考的链接:reference link

我要离开这个,因为我问我是否可以使用MediaPlayer在res/raw中播放视频,而不是VideoView。即使我按照我想要的方式使用VideoView工作,据我所知,仍有MediaPlayer可以执行VideoView无法做到的事情。我可能错了,所以如果你只是需要展示视频并且不需要任何高级内容,我很确定VideoView就足够了。

哦,感谢@Ravi的所有帮助。

2 个答案:

答案 0 :(得分:3)

我认为更好的方法是使用VideoView而不是MediaPlayer,因为它包装了播放器,表面和持有者,如果你在VideoView中看不到视频,那么可能是视频文件无法在Android上播放。

答案 1 :(得分:0)

创建曲面时需要调用setDisplay API。

实施SurfaceHolder.Callback并设置表面类型以推送缓冲区setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS)

您还在哪里调用setDataSource API?

您可以随时查看VideoView.java,了解媒体播放器的实施方式:)