【Android】20.2 视频播放

分类:C#、Android、VS2015;

创建日期:2016-03-11

一、简介

本节例子和上一节的音频播放例子相似,也是最简单的示例,比如并没有考虑视频播放过程中电话打入的情况,也没有考虑复杂的控制。总之,如果你希望进一步学习复杂的例子,首先要先把最核心的简单例子搞明白,否则你连基本的设计思路都不知道,直接看复杂的例子或者实际项目中的代码肯定“事倍功半”,主要原因是你做不到举一反三,只会照搬,稍微让你修改一下功能你就晕了。

实现视频播放的常见方式有:

1、用VideoView和MediaController类实现视频播放

常用,在布局文件中使用VideoView结合MediaController来实现对其控制。本节主要演示它的基本用法。

VideoView控件可以从各种不同的来源(如文件系统、网站)下载视频文件并将视频播放出来。该控件提供了各种控制选项,例如控制视频界面的大小、缩放、着色等。

如果需要更细粒度的控制,也可以用MediaPlayer类来实现。

2、用SurfaceView和MediaPlayer类实现视频播放

这是早期版本提供的办法,实现代码较多。对这种实现有兴趣的可参考其他资料。

二、基本用法示例

1、运行截图

下面的截图是单击【播放RAW下的视频】按钮后看到的视频播放效果。

image

单击【停止播放】按钮后,可继续单击【播放SD卡Download下的视频】按钮观察,这里就不再截图了。

2、设计步骤

(1)添加视频文件

由于只是为了演示,所以该例子Raw文件夹下和SD卡的Download文件夹下存放的是同一个视频文件(videoviewdemo.mp4)。

至于如何将文件复制到SD卡上,请参看【常见问题解答】。

(2)添加ch2002Main.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:id="@+id/ch2002_btnRawStart"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="播放RAW下的视频" />
  <Button
      android:id="@+id/ch2002_btnSdcardStart"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="播放SD卡Dwonload下的视频" />
  <Button
        android:id="@+id/ch2002_btnStop"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="停止播放" />
    <VideoView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/ch2002_videoView1"
        android:layout_margin="20dp" />
</LinearLayout>

(3)添加ch2002MainActivity.cs

using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget;
using Android.Net;

namespace MyDemos.SrcDemos
{
    [Activity(Label = "例20-2 视频播放基本用法")]
    [IntentFilter(new[] { Intent.ActionMain }, Categories = new[] { ch.MyDemosCategory })]
    public class ch2002MainActivity : Activity
    {
        VideoView mVideoView;
        Button btnRawStart, btnSdcardStart, btnStop;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            SetContentView(Resource.Layout.ch2002Main);
            mVideoView = FindViewById<VideoView>(Resource.Id.ch2002_videoView1);
            btnRawStart = FindViewById<Button>(Resource.Id.ch2002_btnRawStart);
            btnSdcardStart = FindViewById<Button>(Resource.Id.ch2002_btnSdcardStart);

            Uri rawUri = Uri.Parse($"android.resource://{PackageName}/{Resource.Raw.videoviewdemo}");
            Uri sdcardUri = Uri.Parse($"{Environment.ExternalStorageDirectory.Name}/Download/videoviewdemo.mp4");

            btnRawStart.Click += delegate
            {
                StartVideo(rawUri);
            };

            btnSdcardStart.Click += delegate
            {
                StartVideo(sdcardUri);
            };

            btnStop = FindViewById<Button>(Resource.Id.ch2002_btnStop);
            btnStop.Click += delegate
            {
                mVideoView.StopPlayback();
                ChangePlayingState(true, false);
            };
        }

        private void StartVideo(Uri uri)
        {
            mVideoView.SetVideoURI(uri);
            mVideoView.SetMediaController(new MediaController(this));
            mVideoView.Start();
            ChangePlayingState(false, true);
        }

        private void ChangePlayingState(bool startEnabled,bool stopEnabled)
        {
            btnRawStart.Enabled = btnSdcardStart.Enabled = startEnabled;
            btnStop.Enabled = stopEnabled;
        }
    }
}
posted @ 2016-03-11 12:51  rainmj  阅读(425)  评论(0编辑  收藏  举报