zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    第二十九课 循环链表的实现
    第二十八课 再论智能指针(下)
    第二十七课 再论智能指针(上)
    第二十六课 典型问题分析(Bugfix)
    普通new和placement new的重载
    leetcode 581. Shortest Unsorted Continuous Subarray
    leetcode 605. Can Place Flowers
    leetcode 219. Contains Duplicate II
    leetcode 283. Move Zeroes
    leetcode 217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/xidongyu/p/5732610.html
Copyright © 2011-2022 走看看