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库
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;
/** 音轨