• android之视频播放


      视频播放和音频播放一样,都是使用MediaPlayer来播放的,区别就是MediaPlayer播放视频时是直接在Activity中实现的,而音频播放则需要写到服务中去。使用MediaPlayer只支持MP4和3gp格式的文件,如果想要播放其他格式的文件需要使用第三方库,这里推荐使用vitamio

    MediaPlayer


    使用MediaPlayer类来播放视频文件

    布局文件


    在布局文件中使用了SurfaceView控件来显示视频,该控件是为显示视频而生的。SurfaceView有一个很不好的特性就是。当Activity变为后台时该对象会被直接销毁,而Activity切换到前台时该对象会重新被创建。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <SurfaceView
        android:id="@+id/player"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    </LinearLayout>

    Activity


    在Activity中获取SuerfaceView对象,创建MediaPlayer对象,进行一些设置后调用mp.setDisplay()方法就可以通过SurfaceView对象来显示视频。由于构建SuerfaceView对象比较耗时,所以播放的设置应该放置在其构建完成后的回调函数中去。SurfaceView对象被销毁后会调用surfaceDestroyed方法

    package xidian.dy.com.chujia;
    
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    
    import java.io.IOException;
    
    
    public class MainActivity extends AppCompatActivity {
        MediaPlayer  mp;
        int current;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            SurfaceView sv = (SurfaceView) findViewById(R.id.player);
            SurfaceHolder sh = sv.getHolder();
    
            sh.addCallback(new SurfaceHolder.Callback() {
                @Override
                public void surfaceCreated(SurfaceHolder holder) {
                    if(mp == null){
                        mp = new MediaPlayer();
                        mp.reset();
                        try {
                            mp.setDataSource("/sdcard/a.mp4");
                            mp.setDisplay(holder);
                            mp.prepare();
                            mp.start();
                            mp.seekTo(current);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
    
                @Override
                public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    
                }
    
                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                     if(mp != null){
                         current = mp.getCurrentPosition();
                         mp.stop();
                         mp.release();
                         mp=null;
                     }
                }
            });
        }
    }

    还有一个API叫VideoView,也可以通过他来进行视频的播放,VideoView只是将MediaPlayer和SurfaceView结合起来而已,并没有做过多的扩展。由于这两个API支持的视频格式有限,所以在开发中用的很少。

     Vitamio


    这是一个第三方的开源框架,github地址https://github.com/yixia/VitamioBundle

    在AS下的导入Vitamio方式:http://www.cnblogs.com/happyhacking/p/5365192.html

    布局文件


     

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
     <io.vov.vitamio.widget.VideoView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:id="@+id/vv"/>
    </LinearLayout>

    Activity


    package xidian.dy.com.chujia;
    
    import android.os.Bundle;
    import android.os.Environment;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    
    import java.io.File;
    
    import io.vov.vitamio.widget.MediaController;
    import io.vov.vitamio.widget.VideoView;
    
    
    public class MainActivity extends AppCompatActivity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this))
                return;
            VideoView vv = (VideoView) findViewById(R.id.vv);
            File f = new File(Environment.getExternalStorageDirectory(), "a.avi");
            Log.e("path", f.getPath());
            if(vv != null){
                vv.setVideoPath(f.getPath());
                vv.start();
                vv.setMediaController(new MediaController(this));
            }
        }
    }

    清单文件


    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xidian.dy.com.chujia">
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="主界面">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="io.vov.vitamio.activity.InitActivity"
            android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
            android:launchMode="singleTop"
            android:theme="@android:style/Theme.NoTitleBar"
            android:windowSoftInputMode="stateAlwaysHidden" />
    </application>
    </manifest>
  • 相关阅读:
    mysql各个版本下载地址
    hadoop-0.20.2完全分布式集群
    04_Spring中使用Quartz
    03_CronTrigger
    02_SimpleTrigger
    02_ActiveMQ入门
    01_JMS概述
    01_Quartz基础结构
    Java开发高性能网站需要关注的事
    06_Jedis完成MySQL的条件查询案例
  • 原文地址:https://www.cnblogs.com/xidongyu/p/5732610.html
Copyright © 2020-2023  润新知