MediaPlayer音视频播放

MediaPlayer介绍
MediaPlayer类可用于控制音频/视频文件或流的播放。

MediaPlayer函数:
实例化方式
使用直接new的方式:

MediaPlayer mp = new MediaPlayer();

使用create的方式:

MediaPlayer mp = MediaPlayer.create(this, R.raw.test);

设置播放源

setDataSource(String path)//指定装载path路径所代表的文件。
setDataSource(Context context, Uri uri, Map

配置播放参数

setAudioStreamType(int streamtype)//设置音频流的类型。
setDisplay(SurfaceHolder sh)//设置显示方式。
setLooping(boolean looping)//设置是否循环播放。
setNextMediaPlayer(MediaPlayer next)//设置当前流媒体播放完毕,下一个播放的MediaPlayer。
setScreenOnWhilePlaying(boolean screenOn)//设置是否使用SurfaceHolder来显示。
setSurface(Surface surface)//设置Surface。
setVideoScalingMode(int mode)//设置视频缩放的模式。
setVolume(float leftVolume, float rightVolume)//设置播放器的音量。
setWakeMode(Context context, int mode)//为MediaPlayer设置低级电源管理行为。

播放控制函数

start()//开始或恢复播放。
stop()//停止播放。
pause()//暂停播放。
prepare()//准备播放(装载音频),调用此方法会使MediaPlayer进入Prepared状态。
prepareAsync()//准备播放异步音频。
release()//释放媒体资源
reset()//重置MediaPlayer进入未初始化状态。
seekTo(int msec)//指定的时间位置。

监听事件函数

setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)//注册一个回调函数,在网络视频流缓冲变化时调用。
setOnCompletionListener(MediaPlayer.OnCompletionListener listener)//为Media Player的播放完成事件绑定事件监听器。
setOnErrorListener(MediaPlayer.OnErrorListener listener)//为MediaPlayer的播放错误事件绑定事件监听器。
setOnPreparedListener(MediaPlayer.OnPreparedListener listener)//当MediaPlayer调用prepare()方法时触发该监听器。
setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener listener)//当MediaPlayer调用seek()方法时触发该监听器。
setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)//注册一个用于监听视频大小改变的监听器。

获取参数函数

getCurrentPosition()//获取当前播放的位置。
getDuration()//获取音频的时长。
getVideoHeight()//获取视频的高度。
getVideoWidth()//获取视频的宽度。
isLooping()//判断MediaPlayer是否正在循环播放。
isPlaying()//判断MediaPlayer是否正在播放。

MediaPlayer音视频播放示例

public class MediaPlayerActivity extends Activity implements SurfaceHolder.Callback, View.OnClickListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener {
    private MediaPlayer player;
    private SurfaceView surface;
    private SurfaceHolder surfaceHolder;
    private Button play, pause, stop;
    private SeekBar seekBar;
    private String videoPath;
    private int seekProgress;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_media_player);
        initParams();
        initViews();
    }

    private void initParams() {
        videoPath = getIntent().getStringExtra("videoPath");
    }


    private void initViews() {
        play = (Button) findViewById(R.id.btn_play);
        pause = (Button) findViewById(R.id.btn_pause);
        stop = (Button) findViewById(R.id.btn_stop);
        seekBar = (SeekBar) findViewById(R.id.skb_video);
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                seekProgress = progress * player.getDuration()
                        / seekBar.getMax();
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                seekTo(seekProgress);
            }
        });
        surface = (SurfaceView) findViewById(R.id.video_surface);
        surfaceHolder = surface.getHolder();
        surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
        surfaceHolder.setKeepScreenOn(true);
        surfaceHolder.addCallback(this);
        play.setOnClickListener(this);
        pause.setOnClickListener(this);
        stop.setOnClickListener(this);
    }

    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
    }

    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
        autoPlay();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {
        stop();
        release();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        stop();
        release();
    }

    /**
     * 自动播放
     */
    private void autoPlay() {
        //必须在surface创建后才能初始化MediaPlayer,否则不会显示图像
        player = new MediaPlayer();
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        //设置显示视频显示在SurfaceView上
        player.setDisplay(surfaceHolder);
        try {
            player.setDataSource(videoPath);
            player.setOnPreparedListener(this);
            player.setOnCompletionListener(this);
            player.setOnBufferingUpdateListener(this);
            player.prepare();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 开始播放
     */
    private void start() {
        if (player == null || player.isPlaying()) {
            return;
        }
        player.start();
    }

    /**
     * 暂停播放
     */
    private void pause() {
        if (player == null || player.isPlaying()) {
            return;
        }
        player.pause();
    }

    /**
     * 停止播放
     */
    private void stop() {
        if (player == null || player.isPlaying()) {
            return;
        }
        player.stop();
    }

    /**
     * 释放资源
     */
    private void release() {
        if (player == null) {
            return;
        }
        player.release();
    }

    /**
     * 重置播放器
     */
    private void reset() {
        if (player == null) {
            return;
        }
        player.reset();
    }

    /**
     * 指定位置播放
     *
     * @param pos
     */
    private void seekTo(int pos) {
        if (player == null) {
            return;
        }
        player.seekTo(pos);
        start();
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_play:
                start();
                break;
            case R.id.btn_pause:
                pause();
                break;
            case R.id.btn_stop:
                stop();
                break;
        }
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        start();
    }

    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        seekBar.setSecondaryProgress(percent);
        int currentProgress = seekBar.getMax() * player.getCurrentPosition() / player.getDuration();
        Log.e("currentProgress", "currentProgress----->" + currentProgress);
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        seekBar.setProgress(0);
    }
}

布局文件




    

    

        

        

            

播放音频简单示例

if (player == null) {
                player = new MediaPlayer();
                player.setDataSource(url);
                player.setVolume(0.7f, 0.7f);
                player.setAudioStreamType(AudioManager.STREAM_MUSIC);
                player.prepare();
                player.start();
                player.setOnCompletionListener(completionListener);
                player.setOnErrorListener(errorListener);
                return true;
            }

权限


    
    

用上面的示例只能播放部分片源,有些片源会播放不了,若不采用原生的MediaPlayer进行视频播放。这里推荐大家使用B站开源视频播放解决方案ijkplayer。地址:https://github.com/Bilibili/

你可能感兴趣的:(android)