我在项目的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的所有帮助。
答案 0 :(得分:3)
我认为更好的方法是使用VideoView而不是MediaPlayer,因为它包装了播放器,表面和持有者,如果你在VideoView中看不到视频,那么可能是视频文件无法在Android上播放。
答案 1 :(得分:0)
创建曲面时需要调用setDisplay
API。
实施SurfaceHolder.Callback
并设置表面类型以推送缓冲区setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS)
您还在哪里调用setDataSource
API?
您可以随时查看VideoView.java,了解媒体播放器的实施方式:)