关于上面提到的DKVideoPlayer简单使用,可以看上一篇文章:android视频播放器之DKVideoPlayer
这里主要是关于AliyunPlayer配置解码,及切换播放核心的工程类:
阿里云播放器:
首页引入依赖:
implementation 'com.aliyun.sdk.android:AliyunPlayer:5.5.5.1-full'
其次。是关于阿里云的中间件,代码如下:
新建 AliMediaPlayer.java :
public class AliMediaPlayer extends AbstractPlayer {
private Context mAppContext;
AliPlayer aliPlayer;
int videoState = 0;
long currentPosition = 0;
int percent = 0;//0-100 百分比
float netSpeed = 0f;//网速kbps
public AliMediaPlayer(Context context) {
mAppContext = context;
}
@Override
public void initPlayer() {
aliPlayer = AliPlayerFactory.createAliPlayer(mAppContext);
//设置为软解码
aliPlayer.enableHardwareDecoder(false);
//先获取配置
PlayerConfig config = aliPlayer.getConfig();
//设置网络超时时间,单位ms
config.mNetworkTimeout = 5000;
//设置超时重试次数。每次重试间隔为networkTimeout。networkRetryCount=0则表示不重试,重试策略app决定,默认值为2
config.mNetworkRetryCount = 2;
// 配置请求头 refer UA
//定义header
// String[] headers = new String[1];
// headers[0]="Host:xxx.com";//比如需要设置Host到header中。
// config.setCustomHeaders(headers);
// config.mUserAgent = "需要设置的UserAgent";
//最大延迟。注意:直播有效。当延时比较大时,播放器sdk内部会追帧等,保证播放器的延时在这个范围内。
config.mMaxDelayTime = 5000;
// 最大缓冲区时长。单位ms。播放器每次最多加载这么长时间的缓冲数据。
config.mMaxBufferDuration = 50000;
//高缓冲时长。单位ms。当网络不好导致加载数据时,如果加载的缓冲时长到达这个值,结束加载状态。
config.mHighBufferDuration = 3000;
// 起播缓冲区时长。单位ms。这个时间设置越短,起播越快。也可能会导致播放之后很快就会进入加载状态。
config.mStartBufferDuration = 500;
//设置配置给播放器
aliPlayer.setConfig(config);
aliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
@Override
public void onPrepared() {
mPlayerEventListener.onPrepared();
}
}); // 准备成功事件
aliPlayer.setOnCompletionListener(new IPlayer.OnCompletionListener() {
@Override
public void onCompletion() {
mPlayerEventListener.onCompletion();
}
}); // 播放完成事件
aliPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() {
@Override
public void onStateChanged(int i) {
if (i==2){//准备成功回调
// mPlayerEventListener.onPrepared();
}else if (i==3){//播放中回调
mPlayerEventListener.onInfo(3, 0);
}else if (i==6) {//播放完成
// mPlayerEventListener.onCompletion();
}
/*else if (i==7){//播放出错
mPlayerEventListener.onError();
}
* */
videoState = i;
}
});
//视频宽高变化
aliPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
@Override
public void onVideoSizeChanged(int width, int height) {
mPlayerEventListener.onVideoSizeChanged(width, height);
}
});
aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if (infoBean.getCode() == InfoCode.CurrentPosition) {
currentPosition = infoBean.getExtraValue();
}
}
});
aliPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() {
@Override
public void onLoadingBegin() {
mPlayerEventListener.onInfo(MEDIA_INFO_BUFFERING_START, getBufferedPercentage());
}
@Override
public void onLoadingProgress(int i, float v) { //i加载进度 v网速kbps
percent = i;
netSpeed = v;
}
@Override
public void onLoadingEnd() {
mPlayerEventListener.onInfo(MEDIA_INFO_BUFFERING_END, getBufferedPercentage());
}
});
aliPlayer.setOnErrorListener(new IPlayer.OnErrorListener() {
@Override
public void onError(ErrorInfo errorInfo) {
mPlayerEventListener.onError();
}
});
}
@Override
public void setDataSource(String s, Map<String, String> map) {
PlayerConfig config = aliPlayer.getConfig();
//定义header
String[] headers = new String[map.size()];
ArrayList<String> list = new ArrayList<>();
for(Map.Entry<String, String> entry : map.entrySet()){
list.add(entry.getKey()+":"+entry.getValue());
}
for (int i = 0; i < list.size(); i++) {
headers[i] = list.get(i);
}
config.setCustomHeaders(headers);
aliPlayer.setConfig(config);
UrlSource urlSource = new UrlSource();
urlSource.setUri(s);
aliPlayer.setDataSource(urlSource);
}
@Override
public void setDataSource(AssetFileDescriptor assetFileDescriptor) {
}
@Override
public void start() {
aliPlayer.start();
}
@Override
public void pause() {
aliPlayer.pause();
}
@Override
public void stop() {
aliPlayer.stop();
}
@Override
public void prepareAsync() {
aliPlayer.prepare();
aliPlayer.start();
}
@Override
public void reset() {
aliPlayer.reset();
}
@Override
public boolean isPlaying() {
return videoState == 3;
}
@Override
public void seekTo(long l) {
aliPlayer.seekTo(l);
}
@Override
public void release() {
aliPlayer.release();
}
@Override
public long getCurrentPosition() {
return currentPosition;
}
@Override
public long getDuration() {
return aliPlayer.getDuration();
}
@Override
public int getBufferedPercentage() {
return percent;
}
@Override
public void setSurface(Surface surface) {
aliPlayer.setSurface(surface);
}
@Override
public void setDisplay(SurfaceHolder surfaceHolder) {
aliPlayer.setDisplay(surfaceHolder);
}
@Override
public void setVolume(float v, float v1) {
aliPlayer.setVolume(v);
}
@Override
public void setLooping(boolean b) {
aliPlayer.setLoop(b);
}
@Override
public void setOptions() {
aliPlayer.setAutoPlay(true);
}
@Override
public void setSpeed(float v) {
aliPlayer.setSpeed(v);
}
@Override
public float getSpeed() {
return aliPlayer.getSpeed();
}
@Override
public long getTcpSpeed() {
return (long) netSpeed;
}
}
以及阿里云工程类 AliMediaPlayerFactory.java :
public class AliMediaPlayerFactory extends PlayerFactory<AliMediaPlayer> {
public static AliMediaPlayerFactory create() {
return new AliMediaPlayerFactory();
}
@Override
public AliMediaPlayer createPlayer(Context context) {
return new AliMediaPlayer(context);
}
}
最后就是关于DKVideoPlayer动态配置播放核心的代码:
新建 MyPlayerManager.kt :
class MyPlayerManager {
companion object{
//0为EXO,1为aliPlayer,2为androidMedia 3为ijkPlayer
open fun checktFactory(kernel: String,videoView: AvVideoView) :AvVideoView{
val factory = getCurrentPlayerFactory()
val config = VideoViewManager.getConfig()
val mPlayerFactoryField: Field = config.javaClass.getDeclaredField("mPlayerFactory")
mPlayerFactoryField.isAccessible = true
when(kernel){
"0" -> if (factory !is ExoMediaPlayerFactory){
var playerFactory = ExoMediaPlayerFactory.create()
mPlayerFactoryField.set(config, playerFactory);
videoView.setPlayerFactory(playerFactory)
}
"1" -> if (factory !is AliMediaPlayerFactory){
var playerFactory = AliMediaPlayerFactory.create()
mPlayerFactoryField.set(config, playerFactory);
videoView.setPlayerFactory(playerFactory)
}
"2" -> if (factory !is AndroidMediaPlayerFactory){
var playerFactory = AndroidMediaPlayerFactory.create()
mPlayerFactoryField.set(config, playerFactory);
videoView.setPlayerFactory(playerFactory)
}
"3" -> if (factory !is IjkPlayerFactory){
var playerFactory = IjkPlayerFactory.create()
mPlayerFactoryField.set(config, playerFactory);
videoView.setPlayerFactory(playerFactory)
}
}
return videoView
}
open fun getCurrentPlayerFactory(): Any? {
val config: VideoViewConfig = VideoViewManager.getConfig()
var playerFactory: Any? = null
try {
val mPlayerFactoryField: Field = config.javaClass.getDeclaredField("mPlayerFactory")
mPlayerFactoryField.setAccessible(true)
playerFactory = mPlayerFactoryField.get(config)
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
return playerFactory
}
}
}
最后就是使用:
videoView = MyPlayerManager.checktFactory(0, videoView)
至此,关于DKVideoPlayer切换播放核心以及阿里云解码全部添加完成。

1134

被折叠的 条评论
为什么被折叠?



