首页 > 技术文章 > android之视频播放

xidongyu 2016-08-04 23:37 原文

  视频播放和音频播放一样,都是使用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>

 

推荐阅读