zoukankan      html  css  js  c++  java
  • Android音视频之MediaPlayer音视频播放

    前言:

          昨天总结了视频录制,今天来学习一下视频的播放,Android的视频播放主要采用MediaPlayer类。

    MediaPlayer介绍

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

    MediaPlayer函数

     1.)实例化方式

    使用直接new的方式:

      MediaPlayer mp = new MediaPlayer();

    使用create的方式

    MediaPlayer mp = MediaPlayer.create(this, R.raw.test);
      2.)设置播放源
    setDataSource(String path)//指定装载path路径所代表的文件。
    setDataSource(Context context, Uri uri, Map<String, String headers)//指定装载uri所代表的文件。
    setDataSource(Context context, Uri uri)//指定装载uri所代表的文件。
    setDataSource(FileDescriptor fd, long offset, long length)//指定装载fd所代表的文件中从offset开始长度为length的文件内容。
    setDataSource(FileDescriptor fd)//指定装载fd所代表的文件。
     3.)配置播放参数
    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设置低级电源管理行为。
     4.)播放控制函数
    start()//开始或恢复播放。
    stop()//停止播放。
    pause()//暂停播放。
    prepare()//准备播放(装载音频),调用此方法会使MediaPlayer进入Prepared状态。
    prepareAsync()//准备播放异步音频。
    release()//释放媒体资源
    reset()//重置MediaPlayer进入未初始化状态。
    seekTo(int msec)//指定的时间位置。
    5.)监听事件函数
    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)//注册一个用于监听视频大小改变的监听器。
    6.)获取参数函数
    getCurrentPosition()//获取当前播放的位置。
    getDuration()//获取音频的时长。
    getVideoHeight()//获取视频的高度。
    getVideoWidth()//获取视频的宽度。
    isLooping()//判断MediaPlayer是否正在循环播放。
    isPlaying()//判断MediaPlayer是否正在播放。

    MediaPlayer音视频播放示例

     1.)添加权限
        <uses-permission android:name="android.permission.CAMERA" />
        <uses-permission android:name="android.permission.RECORD_AUDIO" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     2.)视频播放简单示例
    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);
        }
    }
    3.)布局文件
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <SurfaceView
            android:id="@+id/video_surface"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_gravity="center"
            android:layout_weight="1" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal|bottom"
            android:orientation="vertical">
    
            <SeekBar
                android:id="@+id/skb_video"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_margin="10dp"
                android:max="100"
                android:focusable="true"
                android:maxHeight="4.0dip"
                android:minHeight="4.0dip"
                android:paddingLeft="16.0dip"
                android:paddingRight="16.0dip"
                android:thumb="@drawable/seekbar_thumb"
                android:progressDrawable="@drawable/po_seekbar" />
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal|bottom"
                android:layout_margin="10dp"
                android:gravity="center"
                android:orientation="horizontal">
    
                <Button
                    android:id="@+id/btn_play"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="播放" />
    
                <Button
                    android:id="@+id/btn_pause"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="暂停" />
    
                <Button
                    android:id="@+id/btn_stop"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="停止" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
     4.)播放音频简单示例
             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;
                }
    5.)知识扩展

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

          

  • 相关阅读:
    树状数组
    Windows系统重装
    桶排序
    PCL+VS2010环境配置
    刷题
    杭电ACM——自我强化步骤
    杭电ACM题单
    centos7 ifconifg没有ip
    centos7切换图像界面和dos界面
    oracle with as 的用法
  • 原文地址:https://www.cnblogs.com/whoislcj/p/5587276.html
Copyright © 2011-2022 走看看