您的位置:首页 > 移动开发 > Android开发

Android SurfaceView+ mediaplayer 重复播放视频

2016-09-30 11:23 411 查看
      

Android MediaPlayer使用方法简单介绍

[align=left]1)如何获得MediaPlayer实例:[/align]
[align=left]可以使用直接new的方式:[/align]
[align=left]MediaPlayer mp = new MediaPlayer();[/align]
[align=left]也可以使用create的方式,如:[/align]
[align=left]MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]2) 如何设置要播放的文件:[/align]
[align=left]MediaPlayer要播放的文件主要包括3个来源:[/align]
[align=left]a. 用户在应用中事先自带的resource资源[/align]
[align=left]例如:MediaPlayer.create(this, R.raw.test);[/align]
[align=left]b. 存储在SD卡或其他文件路径下的媒体文件[/align]
[align=left]例如:mp.setDataSource("/sdcard/test.mp3");[/align]
[align=left] [/align]
[align=left]c. 网络上的媒体文件[/align]
[align=left]例如:mp.setDataSource("http://www.baidu.xxvideo.mp4");[/align]
[align=left] [/align]
[align=left]MediaPlayer的setDataSource一共四个方法:[/align]
setDataSource (String path)

setDataSource (FileDescriptor fd)

setDataSource (Context context, Uri uri)

[align=left]setDataSource (FileDescriptor fd, long offset, long length)[/align]
[align=left] [/align]
[align=left]其中使用FileDescriptor时,需要将文件放到与res文件夹平级的assets文件夹里,然后使用:[/align]
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");

m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
来设置datasource

[align=left]3)对播放器的主要控制方法:[/align]
[align=left]Android通过控制播放器的状态的方式来控制媒体文件的播放,其中:[/align]
[align=left]prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。[/align]
[align=left]start()是真正启动文件播放的方法,[/align]
[align=left]pause()和stop()比较简单,起到暂停和停止播放的作用,[/align]

seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。
[align=left]release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。[/align]
[align=left]reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。[/align]
[align=left]
[/align]
[align=left]4)设置播放器的监听器:[/align]
[align=left]MediaPlayer提供了一些设置不同监听器的方法来更好地对播放器的工作状态进行监听,以期及时处理各种情况,[/align]
[align=left]如: setOnCompletionListener(MediaPlayer.OnCompletionListener listener)、[/align]
setOnErrorListener(MediaPlayer.OnErrorListener listener)等,设置播放器时需要考虑到播放器可能出现的情况设置好监听和处理逻辑,以保持播放器的健壮性。

   我的Demo是播放res下raw路径的xx.MP4格式文件:

      代码:

       package com.wude.mediaplaytest;

import android.app.Activity;

import android.media.AudioManager;

import android.media.MediaPlayer;

import android.net.Uri;

import android.os.Bundle;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

public class MainActivity extends Activity implements SurfaceHolder.Callback{

    private SurfaceView surface;

    private MediaPlayer mp;

    private int position = 0;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        surface = (SurfaceView) findViewById(R.id.sf);

        SurfaceHolder myHolder = surface.getHolder();//得到SurfaceView的控制接口

        myHolder.addCallback(this);//得到当前的回调接口

        Uri uri = Uri.parse("android.resource://com.wude.mediaplaytest/"+R.raw.loginvideo);

        mp = MediaPlayer.create(MainActivity.this,uri);

    }

    @Override

    public void surfaceCreated(SurfaceHolder holder) {

        try {

            mp.setDisplay(holder);//视频显示在SurfaceView上

            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);//媒体声音类型

            mp.setLooping(true);

            mp.start();

            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                @Override

                public void onCompletion(MediaPlayer mp) {

//                    MainActivity.this.finish();

                    mp.seekTo(0);

                    mp.start();

                }

            });

        } catch (IllegalArgumentException e) {

        } catch (SecurityException e) {

        } catch (IllegalStateException e) {

        }

    }

    @Override

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override

    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    @Override

    protected void onDestroy() {

        super.onDestroy();

        if (mp.isPlaying()) {

            mp.stop();

        }

        mp.release();

    }

}

  布局文件  :

        <?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/activity_main"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context="com.wude.mediaplaytest.MainActivity">

    <SurfaceView

        android:id="@+id/sf"

        android:layout_width="match_parent"

        android:layout_height="match_parent"/>

    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="标题1"

        android:textSize="18sp"/>

</RelativeLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息