Android播放器——VitamioPlayer

  • vitamio是一个开源的播放器,在Android端和ios端都有相应的库,支持硬解码,api与Android原生播放器的api类似

  • Vitamio 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在 Android 与 iOS 上跨平台支持 MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播(官方介绍)。官网地址为:https://www.vitamio.org/

  • 本文主要介绍使用vitamio进行视频播放,包括切换声道、切换音轨、软硬解码的使用。

demo part1下载地址:http://download.youkuaiyun.com/detail/sapce_fish/9618279
demo part2下载地址:http://download.youkuaiyun.com/detail/sapce_fish/9618281

1.新建Android项目后引入vitamio库

vitamio库

2.编写播放回调接口

package com.space.vitamio;
public interface IMediaCallback
{
    
    
    /**
     * 开始播放
     */
    public void onMediaStart();
    /**
     * 播放异常
     */
    public void onMediaError();
    /**
     * 播放完成
     */
    public void onMediaFinished();
}

3.编写播放器父类(方便以后扩展其他播放器)

package com.space.vitamio;
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.util.DisplayMetrics;
import android.webkit.JavascriptInterface;
public abstract class PlayerInterface
{
   
   
    public static final String CHANNEL_LEFT = "Left";// 左声道
    public static final String CHANNEL_RIGHT = "Right";// 右声道
    public static final String CHANNEL_STEREO = "Stereo";// 立体声
    protected Activity mAct;
    /** 播放器事件的回调 */
    protected IMediaCallback mMediaCallback;
    /** 声音管理器 */
    protected AudioManager audioManager;
    /** 屏幕宽度 */
    protected int mScreenWidth;
    /** 屏幕高度 */
    protected int mScreenHeight;
    public PlayerInterface(Activity act, IMediaCallback callback)
    {
        this.mAct = act;
        this.mMediaCallback = callback;
        audioManager = (AudioManager) mAct.getSystemService(Context.AUDIO_SERVICE);
        // 获取屏幕宽高
        DisplayMetrics dpm = new DisplayMetrics();
      act.getWindowManager().getDefaultDisplay().getMetrics(dpm);
        mScreenWidth = dpm.widthPixels;
        mScreenHeight = dpm.heightPixels;
    }
    /**
     * 以全屏方式初始化播放器,设置播放地址,并开始播放
     *
     * @param url
     *            视频播放地址
     */
    public abstract void initMediaPlayer(final String url);
    /**
     * 以小视频方式初始化播放器,设置视频位置和大小,设置播放地址,并开始播放
     *
     * @param url
     *            视频播放地址
     * @param left
     *            
     * @param top
     *            视频top坐标
     * @param width
     *            视频宽度
     * @param height
     *            视频高度
     */
    public abstract void initMediaPlayer(final String url, final int left, final int top, final int width,
                                         final int height);
    public abstract void initMediaPlayer(String url, int left, int top, int width, int height, boolean preferHWDecoder);
    /**
     * 停止播放
     */
    public abstract void stop();
    /**
     * 暂停播放
     */
    public abstract void pause();
    /**
     * 从快进、快退、暂停等状态中恢复播放
     */
    public abstract void resume();
    /**
     * 切换音频声道
     */
    public abstract void switchAudioChannel();
    /** 切换音轨 */
    public abstract void switchTrack();
    /**
     * 获取当前声道,返回值可能是“Left”、“Right”、“Stereo”
     */
    public abstract String getCurrentAudioChannel();
    /**
     * 获取当前音轨
     * @return
     */
    public abstract int getCurrentTrack();
    /**
     * 设置或者取消静音
     *
     * @param muteFlag
     *            静音标志,0表示有声(默认),1表示静音
     */
    public abstract void setMuteFlag(int muteFlag);
    /**
     * 获取当前播放的秒数,注意单位是毫秒!
     *
     * @return
     */
    public abstract long getCurrentPlayTime();
    /**
     * 获取视频的总秒数,注意单位是毫秒!
     *
     * @return
     */
    public abstract long getMediaDuration();
    /**
     * 判断是否正在播放视频
     *
     * @return
     */
    public abstract boolean isPlaying();
    public abstract void playByTime(long seconds);
    /**
     * 开始播放的回调
     */
    protected void jsOnStart()
    {
        if (mAct != null)
        {
            mAct.runOnUiThread(new Runnable()
            {
                @Override
                public void run()
                {
                    if (mMediaCallback != null)
                    {
                        mMediaCallback.onMediaStart();
                    }
                }
            });
        }
    }
    /**
     * 播放错误的回调
     */
    protected void jsOnError()
    {
        if (mAct != null)
        {
            mAct.runOnUiThread(new Runnable()
            {
                @Override
                public void run()
                {
                    if (mMediaCallback != null)
                    {
                        mMediaCallback.onMediaError();
                    }
                }
            });
        }
    }
    /**
     * 播放完成的回调
     */
    protected void jsOnFinished()
    {
        if (mAct != null)
        {
            mAct.runOnUiThread(new Runnable()
            {
                @Override
                public void run()
                {
                    if (mMediaCallback != null)
                    {
                        mMediaCallback.onMediaFinished();
                    }
                }
            });
        }
    }
}

4.编写vitamio播放器类

package com.space.vitamio;

import android.app.Activity;
import android.graphics.PixelFormat;
import android.media.AudioManager;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.widget.FrameLayout;

import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.MediaPlayer.OnBufferingUpdateListener;
import io.vov.vitamio.MediaPlayer.OnCompletionListener;
import io.vov.vitamio.MediaPlayer.OnErrorListener;
import io.vov.vitamio.MediaPlayer.OnInfoListener;
import io.vov.vitamio.MediaPlayer.OnPreparedListener;
import io.vov.vitamio.MediaPlayer.OnVideoSizeChangedListener;
import io.vov.vitamio.Vitamio;

/**
 *
 * @author space
 */
public class VitamioPlayer extends PlayerInterface
{
   
   
    /** 播放器状态未知 */
    private static final int PLAYER_STATUS_UNKNOW = 0;
    /** 播放器正在初始化 */
    private static final int PLAYER_STATUS_INITING = 1;
    /** 播放器准备好了 */
    private static final int PLAYER_STATUS_PREPARED = 2;
    /** 播放器正在播放... */
    private static final int PLAYER_STATUS_PLAYING = 3;

    /** 当前资源的播放地址 */
    private String mResourceUrl;
    /** 从mPosition处开始播放*/
    private long mPosition = -1;

    /** 视频左边边距 */
    private int mLeft;
    /** 视频上边边距 */
    private int mTop;
    /** 视频的宽度 */
    private int mWidth;
    /** 视频的高度 */
    private int mHeight;

    /** 播放控制类 */
    private MediaPlayer mPlayer;

    /** 主布局 */
    private FrameLayout mMainLayout;
    /** loading圈圈的布局 */
    private View mLoadingLayout;
    /** 播放视频的画布 */
    private SurfaceView mSurfaceView;
    /** 播放视频的surfaceHolder */
    private SurfaceHolder mSurfaceHolder;
    /** 当前是否被调用了停止播放事件 */
    private boolean mIsRequestStoped = false;

    /** 播放器的状态 */
    private int mPlayerStatus;
    /** 当前声道 */
    private String mCurrentChannel = CHANNEL_STEREO;
    /** 是否使用硬解码 */
    private boolean mIsHWDecode;

    /** 音轨
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值