【问题标题】:Play a resource video using Android's MediaPlayer class使用 Android 的 MediaPlayer 类播放资源视频
【发布时间】:2011-08-24 05:58:09
【问题描述】:

我将视频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 控制面板,我的假设确实是错误的。尽管如此,我仍然无法通过MediaPlayer 类播放存储在res/raw 中的视频;当我拨打prepare () 或播放音频时,它总是失败,但视频没有。因此,我的问题仍然存在。

如果有人遇到关于我如何使用 VideoView 的问题,让我为您省去一些麻烦,让您在寻找如何检索 res/raw 中的视频时免去一些麻烦。以下 sn-p 假设您在布局文件 main.xml 中有一个 ID 为 viewVideoView

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 提供的所有帮助。

【问题讨论】:

  • 我认为这里缺少 VideoView。
  • 据我所知,VideoViewMediaPlayer 的包装。我选择使用MediaPlayer 而不是VideoView
  • 我认为从 VideoView 播放更容易。
  • 但是VideoView没有控制面板吗?我需要在没有控制面板的情况下播放视频。
  • 您可以在 VideoView 中不使用控制面板播放视频。

标签: android android-mediaplayer


【解决方案1】:

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

【讨论】:

  • 有没有办法阻止videoview的控件,因为我需要隐藏控件
  • @BinyaminSharet 是的,但视图泄漏上下文。如果您需要以用户愉快的方式持续播放,那么不幸的是,VideoView 不是一个选项。您必须保留 MediaPlayer 并销毁并重新创建 Surface[View]。
【解决方案2】:

您需要在创建表面时调用setDisplay API。

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

还有你在哪里调用setDataSource API?

您可以随时查看VideoView.java 了解媒体播放器是如何实现的:)

【讨论】:

  • 我没有打电话给setDataSource ()。我的印象是MediaPlayer.create () 为我解决了这个问题。此外,API 声明 SurfaceHolder.setType () 已弃用。
  • 我现在看到它确实已被弃用,当我提到它时我并没有道歉。但是您需要将资源 id 传递给 MediaPlayer.create() 但您似乎正在传递表面保持器 obj..
  • 抱歉,我拉错了代码。我正在尝试MediaPlayer.create () 的 3 参数版本。您可以在哪里指定SurfaceHolder
  • 好了,onCreate方法中没有创建surface,需要告诉android在surface创建的时候通知你。所以注册来自SurfaceHolder 的回调并在SurfaceCreated 回调中使用surfaceholder obj 来设置显示,然后启动媒体播放器。
  • 还是不行。我让我的班级实现了SurfaceHolder.Callback,并让surfaceCreated 调用mpaddDisplay ()start () 方法,但我仍然得到一个空白屏幕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多