GSYVideoPlayer 是一个比较火的开源框架。其支持Android 系统中的MediaPlayer内核,ExoPlayer 内核, ijkPlayer 内核。 在我使用的过程中发现不支持h265格式的avi 文件播放,所以我实现了一个VLC内核。

1.继承AbstractMediaPlayer,VLCMediaPlayer.java

public class VLCMediaPlayer extends AbstractMediaPlayer {private final LibVLC mLibVLC ;private final MediaPlayer mInternalMediaPlayer;private String mDataSource;private final VLCMediaPlayerListenerHolder mInternalListenerAdapter;private final Object mInitLock = new Object();private static MediaInfo sMediaInfo;private Media mCurrentMedia = null;//默认设为1,等开始播放后才能获取到正确的视频宽高private int videoWidth=1,videoHeight=1;public VLCMediaPlayer() {synchronized (mInitLock) {ArrayList<String> options = new ArrayList<String>();options.add("--avcodec-codec=h265,h264");options.add("--rtsp-tcp");options.add("--aout=opensles");options.add("--audio-time-stretch");options.add("-vvv");mLibVLC = new LibVLC(SYunApplication.getInstance(),options);mInternalMediaPlayer = new MediaPlayer(mLibVLC);}mInternalListenerAdapter= new VLCMediaPlayerListenerHolder(this);attachInternalListeners();}private void attachInternalListeners() {mInternalMediaPlayer.setEventListener(mInternalListenerAdapter);}@Overridepublic void setDisplay(SurfaceHolder sh) {Timber.e("call setDisplay ");}
@Overridepublic void setDataSource(Context context, Uri uri) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {mCurrentMedia = new Media(mLibVLC, uri);mInternalMediaPlayer.setMedia(mCurrentMedia);}@Overridepublic void setDataSource(Context context, Uri uri, Map<String, String> headers) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {mCurrentMedia = new Media(mLibVLC, uri);mInternalMediaPlayer.setMedia(mCurrentMedia);}@Overridepublic void setDataSource(FileDescriptor fd) throws IOException, IllegalArgumentException, IllegalStateException {mCurrentMedia = new Media(mLibVLC, fd);mInternalMediaPlayer.setMedia(mCurrentMedia);}@Overridepublic void setDataSource(String path) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {mDataSource=path;Timber.e(path);if(path.startsWith("http")||path.startsWith("rtsp")){mCurrentMedia = new Media(mLibVLC, Uri.parse(mDataSource));}else {mCurrentMedia = new Media(mLibVLC, path);}mInternalMediaPlayer.setMedia(mCurrentMedia);}@Overridepublic String getDataSource() {return mDataSource;}@Overridepublic void prepareAsync() throws IllegalStateException {mCurrentMedia.addOption(":video-paused");mInternalMediaPlayer.play();}@Overridepublic void start() throws IllegalStateException {Timber.e("start");mInternalMediaPlayer.play();}@Overridepublic void stop() throws IllegalStateException {mInternalMediaPlayer.stop();}@Overridepublic void pause() throws IllegalStateException {mInternalMediaPlayer.pause();}@Overridepublic void setScreenOnWhilePlaying(boolean screenOn) {
//        holder.setKeepScreenOn(true);}@Overridepublic int getVideoWidth() {return videoWidth;}@Overridepublic int getVideoHeight() {return videoHeight;}@Overridepublic boolean isPlaying() {return mInternalMediaPlayer.isPlaying();}@Overridepublic void seekTo(long msec) throws IllegalStateException {mInternalMediaPlayer.setTime(msec);}@Overridepublic long getCurrentPosition() {return  mInternalMediaPlayer.getTime();}@Overridepublic long getDuration() {return mInternalMediaPlayer.getLength();}@Overridepublic void release() {if(mInternalMediaPlayer != null){mInternalMediaPlayer.release();mLibVLC.release();}}@Overridepublic void reset() {}
@Overridepublic void setVolume(float leftVolume, float rightVolume) {mInternalMediaPlayer.setVolume( (int)((leftVolume + rightVolume) * 100/2));}@Overridepublic int getAudioSessionId() {return mInternalMediaPlayer.getAudioTrack();}@Overridepublic MediaInfo getMediaInfo() {if (sMediaInfo == null) {MediaInfo module = new MediaInfo();module.mVideoDecoder = "android";module.mVideoDecoderImpl = "HW";module.mAudioDecoder = "android";module.mAudioDecoderImpl = "HW";sMediaInfo = module;}return sMediaInfo;}@Overridepublic void setLogEnabled(boolean enable) {}@Overridepublic boolean isPlayable() {return true;}@Overridepublic void setAudioStreamType(int streamtype) {}@Overridepublic void setKeepInBackground(boolean keepInBackground) {}/*** SAR表示Sample Aspect Ratio,含义是采样宽高比。* DAR(Display Aspect Ratio)表示显示宽高比,也就是我们经常说的16:9,4:3。* @return SAR*/@Overridepublic int getVideoSarNum() {IMedia.VideoTrack vtrack = mInternalMediaPlayer.getCurrentVideoTrack();int sarNum=vtrack!=null?vtrack.sarNum:1;getVideoSize(vtrack);return sarNum;}@Overridepublic int getVideoSarDen() {IMedia.VideoTrack vtrack = mInternalMediaPlayer.getCurrentVideoTrack();int sarDen=vtrack!=null?vtrack.sarDen:1;return sarDen;}
@Overridepublic void setWakeMode(Context context, int mode) {}@Overridepublic void setLooping(boolean looping) {}@Overridepublic boolean isLooping() {return false;}@Overridepublic ITrackInfo[] getTrackInfo() {return new ITrackInfo[0];}@Overridepublic void setSurface(Surface surface) {if(surface!=null){mInternalMediaPlayer.getVLCVout().setVideoSurface(surface,null);mInternalMediaPlayer.getVLCVout().attachViews(new IVLCVout.OnNewVideoLayoutListener() {@Overridepublic void onNewVideoLayout(IVLCVout vlcVout, int width, int height, int visibleWidth, int visibleHeight, int sarNum, int sarDen) {Timber.e(" width=%1$d, height=%2$d,visibleWidth=%3$d,visibleHeight=%4$d",width,height,visibleWidth,visibleHeight);}});setWindowSize();}}/*** 设置窗口大小为全屏,未正式播放拿不到视频帧的宽高,也只能设置成全屏*/private void setWindowSize() {Timber.e("setWindowSize ");if (GSYVideoType.getShowType() == SCREEN_MATCH_FULL) {int screenWidth = ScreenUtil.getScreenWidth(SYunApplication.getInstance());int screenHeight = ScreenUtil.getScreenHeight(SYunApplication.getInstance());mInternalMediaPlayer.getVLCVout().setWindowSize(screenWidth, screenHeight);mInternalMediaPlayer.setScale(0);//视频显示比例String aspectRatio = String.format("%1$s:%2$s", screenWidth, screenHeight);Timber.e("setWindowSize ,aspectRatio=%s", aspectRatio);mInternalMediaPlayer.setAspectRatio(aspectRatio);} else {int screenHeight = ScreenUtil.getScreenHeight(SYunApplication.getInstance());mInternalMediaPlayer.getVLCVout().setWindowSize(videoWidth * screenHeight / videoHeight, screenHeight);mInternalMediaPlayer.setScale(0);//视频显示比例String aspectRatio = String.format("%1$s:%2$s", videoWidth, videoHeight);Timber.e("getVideoSize ,aspectRatio=%s", aspectRatio);mInternalMediaPlayer.setAspectRatio(aspectRatio);}}public MediaPlayer getmInternalMediaPlayer() {return mInternalMediaPlayer;}private static class VLCMediaPlayerListenerHolder implements MediaPlayer.EventListener{public final WeakReference<VLCMediaPlayer> mWeakMediaPlayer;public VLCMediaPlayerListenerHolder(VLCMediaPlayer mp) {mWeakMediaPlayer = new WeakReference<VLCMediaPlayer>(mp);}@Overridepublic void onEvent(MediaPlayer.Event event) {try{VLCMediaPlayer self = mWeakMediaPlayer.get();switch(event.type) {case MediaPlayer.Event.Opening:if (self == null)return;self.pause();self.notifyOnPrepared();break;case MediaPlayer.Event.Playing:Timber.e("Playing");break;case MediaPlayer.Event.Paused:Timber.e("Paused");break;case MediaPlayer.Event.EncounteredError:Timber.e("EncounteredError");if (self == null)return;self.notifyOnError(MediaPlayer.Event.EncounteredError,-1);case  MediaPlayer.Event.Vout:Timber.e("Vout");break;case MediaPlayer.Event.EndReached:if (self == null)return;self.notifyOnCompletion();break;default:
//                        Timber.e("default"+event.type);break;}if(mWeakMediaPlayer.get().getmInternalMediaPlayer().getPlayerState()==Media.State.Ended){if (self == null)return;self.notifyOnCompletion();}}catch (Exception e){}}}
/*** 读取视频宽高,切换窗口大小时可以触发,获取到视频宽高* @param track 流信息*/private void getVideoSize(IMedia.VideoTrack track) {if (track!=null) {if(track.width>0&&track.height>0){videoWidth = track.width;videoHeight = track.height;Timber.e("getVideoSize w=%1$d,h=%2$d", videoWidth, videoHeight);setWindowSize();}}}}

2.继承BasePlayerManager实现VLCPlayerManager.java

import android.content.Context;
import android.os.Message;
import android.text.TextUtils;
import android.view.Surface;import com.shuyu.gsyvideoplayer.cache.ICacheManager;
import com.shuyu.gsyvideoplayer.model.GSYModel;
import com.shuyu.gsyvideoplayer.model.VideoOptionModel;
import com.shuyu.gsyvideoplayer.player.BasePlayerManager;import java.io.IOException;
import java.util.List;import tv.danmaku.ijk.media.player.IMediaPlayer;public class VLCPlayerManager extends BasePlayerManager {private VLCMediaPlayer mediaPlayer;private Surface surface;@Overridepublic IMediaPlayer getMediaPlayer() {return mediaPlayer;}@Overridepublic void initVideoPlayer(Context context, Message msg, List<VideoOptionModel> optionModelList, ICacheManager cacheManager) {mediaPlayer=new VLCMediaPlayer();GSYModel gsyModel = (GSYModel) msg.obj;String url = gsyModel.getUrl();if(!TextUtils.isEmpty(url)){try {mediaPlayer.setDataSource(url);} catch (IOException e) {e.printStackTrace();}}}@Overridepublic void showDisplay(Message msg) {if (msg.obj == null && mediaPlayer != null) {mediaPlayer.setSurface(null);} else {Surface holder = (Surface) msg.obj;surface = holder;if (mediaPlayer != null && holder.isValid()) {mediaPlayer.setSurface(holder);}}}@Overridepublic void setNeedMute(boolean needMute) {if (mediaPlayer != null) {if (needMute) {mediaPlayer.setVolume(0, 0);} else {mediaPlayer.setVolume(1, 1);}}}@Overridepublic void setVolume(float left, float right) {if (mediaPlayer != null) {mediaPlayer.setVolume(left, right);}}@Overridepublic void releaseSurface() {if (surface != null) {//surface.release();surface = null;}}@Overridepublic void release() {if (mediaPlayer != null) {mediaPlayer.release();mediaPlayer = null;}}@Overridepublic int getBufferedPercentage() {return -1;}@Overridepublic long getNetSpeed() {return 0;}@Overridepublic void setSpeedPlaying(float speed, boolean soundTouch) {}@Overridepublic boolean isSurfaceSupportLockCanvas() {return false;}@Overridepublic void setSpeed(float speed, boolean soundTouch) {}@Overridepublic void start() {if (mediaPlayer != null) {mediaPlayer.start();}}@Overridepublic void stop() {if (mediaPlayer != null) {mediaPlayer.stop();}}@Overridepublic void pause() {if (mediaPlayer != null) {mediaPlayer.pause();}}@Overridepublic int getVideoWidth() {if (mediaPlayer != null) {return mediaPlayer.getVideoWidth();}return 0;}@Overridepublic int getVideoHeight() {if (mediaPlayer != null) {return mediaPlayer.getVideoHeight();}return 0;}@Overridepublic boolean isPlaying() {if (mediaPlayer != null) {return mediaPlayer.isPlaying();}return false;}@Overridepublic void seekTo(long time) {if (mediaPlayer != null) {mediaPlayer.seekTo(time);}}@Overridepublic long getCurrentPosition() {if (mediaPlayer != null) {return mediaPlayer.getCurrentPosition();}return 0;}@Overridepublic long getDuration() {if (mediaPlayer != null) {return mediaPlayer.getDuration();}return 0;}@Overridepublic int getVideoSarNum() {if (mediaPlayer != null) {return mediaPlayer.getVideoSarNum();}return 1;}@Overridepublic int getVideoSarDen() {if (mediaPlayer != null) {return mediaPlayer.getVideoSarDen();}return 1;}
}

3.使用方法:

1.添加依赖

//gsyVideoPlayer播放器implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-java:v8.1.7-release-jitpack'//更多ijk的编码支持implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.1.7-release-jitpack'
//VLCimplementation 'de.mrmaffen:vlc-android-sdk:3.0.0'

2.调用

PlayerFactory.setPlayManager(VLCPlayerManager.class);mVideoPlayer.setUp(url,true,"");//设置旋转orientationUtils = new OrientationUtils(this, mVideoPlayer);//设置全屏按键功能,这是使用的是选择屏幕,而不是全屏mVideoPlayer.getFullscreenButton().setOnClickListener(v->{orientationUtils.resolveByClick();});//是否可以滑动调整mVideoPlayer.setIsTouchWiget(true);//设置返回按键功能mVideoPlayer.startPlayLogic();

在GSYVideoPlayer中实现VLC 内核相关推荐

  1. Qt编写视频播放器(vlc内核)

    在研究qt+vlc的过程中,就想直接做个播放器用于独立的项目,vlc还支持硬件加速,不过部分电脑硬件不支持除外.用vlc的内核写播放器就是快,直接调用api就行,逻辑处理和ui展示基本上分分钟的事情, ...

  2. python内核_python-在多处理模块中使用所有内核的100%

    python-在多处理模块中使用所有内核的100% 我有两段代码用于学习Python 3.1中的多处理. 我的目标是使用所有可用处理器中的100%.但是,此处的代码段在所有处理器上仅达到30%-50% ...

  3. Ubuntu中编译linux内核后使用make menuconfig报错的解决办法

    第一次在Ubuntu中编译完内核使用make menuconfig时出现如下错误 topeet@ubuntu:~/iMX6UL/linux-2.6-imx-rel_imx_4.1.15_1.2.0_g ...

  4. Driver中使用的内核机制

    Driver中使用的内核机制 1. 互斥与同步 自旋锁 三种主要自旋锁函数 spin_lock spin_lock_irq/spin_lock_irqsave spin_lock_bh 使用spin_ ...

  5. Android中使用x5内核加载网页的实现

    前言 联系方式 背景 SDK下载 SDK集成 使用 代码实现 前言 由于是使用的腾讯浏览服务,所以这里大部分介绍的是官网的一些东西,不过自己会做一些复杂使用部分的实现,不至于像官网上介绍的笼统. 联系 ...

  6. js调用vlc_web网页中使用vlc插件播放相机rtsp流视频

    可参考: vlc功能还是很强大的,有很多的现成的二次开发接口,不需配置太多即可轻松做客户端播放器或web网页播放器. 下面代码是web网页中使用vlc插件播放相机rtsp流视频: 注意: 需提前在打开 ...

  7. HTML中使用vlc插件

    HTML中使用vlc插件 前两天时间在做一个web项目这个项目需要播放rtsp流视频第一次要在网页上播rtsp流,于是网上找资料,但是网上资料找教程全不管用于是摸索两天才发现插件用错了,特发一文帮大家 ...

  8. 手把手教你如何在WPF中应用VLC播放器

    WPF中应用VLC播放器 *1. 在WPF的"引用:中点击右键,选择管理NuGet程序包,输入vlc,安装VLC.DOtNet.Wpf包 *2.在VLC官网下载VLC播放器,注意你的项目是3 ...

  9. WPF中应用VLC播放器

    WPF中应用VLC播放器 文章目录 WPF中应用VLC播放器 1. 安装VLC.DOtNet.Wpf包 2.程序中使用 3.源代码 4.VLC GitHub源代码 1. 安装VLC.DOtNet.Wp ...

最新文章

  1. go语言任意代码执行漏洞 cve-2018-6574
  2. .net c# 序列化和反序列
  3. iOS 修改navigationController返回按钮颜色和文字
  4. 硬盘温度70度正常吗_打破传统固态硬盘的速度壁垒!XPG S50 PCIE 4.0评测
  5. hdu 1087 Super Jumping! Jumping! Jumping! 动态规划
  6. C语言学习之求两个整数的最大值
  7. 微软最新GDI漏洞MS08-052安全解决方案
  8. 作者:袁明轩(1980-),男,华为诺亚方舟实验室研究员。
  9. swift:自定义UICollectionViewFlowLayout
  10. Spark kyro Serialization配置运行案例
  11. OpenCL快速入门教程
  12. I2C 时序、速率计算及intel I2C驱动
  13. matlab 双均线,双均线策略
  14. NOIP初赛知识点总结
  15. [转]大规模服务设计部署经验谈
  16. win7右键计算机没有注册类,win7系统提示没有注册类别的解决方法
  17. sql怎么与oracle连接,sql怎么连接oracle数据库
  18. 巨强大的免费LOGO在线制作工具
  19. 解决用 posman 调用 openai API 正常,用java代码调用超时问题
  20. 文献阅读:Raise a Child in Large Language Model: Towards Effective and Generalizable Fine-tuning

热门文章

  1. HmacSHA1 STM32F4xx C语言实现
  2. Tomcat 面试题
  3. 超级淘的安全性,科普一下超级淘到底有多安全
  4. 平显火控设备自动测试系统的设计
  5. X线DR医学图像 --- DR医用滤线栅及摩尔纹详解 (一) 滤线栅的原理
  6. 怎样做小游戏挖金子(VC,源码2)
  7. [知识总结]HTML5布局之flex布局总结
  8. 嵌入式linux学习笔记--linux下基于imx6ullpro 的 CP2102 /CH340 驱动 以及简单的测试
  9. raphael.js arrow颜色修改
  10. linux桌面环境gnome、kde、xfce、lxde 使用比较