GitHub:wlplayer v1.0.1

Update

*.添加 x86 cpu架构

*.修复seek后导致音视频不同步问题

*.视频解码慢时,进行丢帧处理

我的视频课程(基础):《(NDK)FFmpeg打造Android万能音频播放器》

我的视频课程(进阶):《(NDK)FFmpeg打造Android视频播放器》

我的视频课程(编码直播推流):《Android视频编码和直播推流》

我的视频课程(C++ OpenGL):《Android C++ OpenGL教程》

 

百度网盘链接: https://pan.baidu.com/s/1mvIflaxujEoufLrnyNNxRQ 提取码: mkki

 

Android 基于:FFmpeg+OpenSL+OpenGL+Mediacodec 的视频播放SDK,可播放网络、本地和广播等流媒。

1、支持当前播放页直接切换播放源。

2、支持视频实时截图。

3、优先选用GPU解码,解码速度更快。

4、在手机支持1080P、2K、4K等的情况下都可播放。

5、封装常用播放状态回调,接入简单。

6、直接用mediacodec解码avpacket数据。

7、重点是可以学到很多东西:java与C++的相互调用、多线程的使用、opengl、opensl的使用等等。

8、附带一个播放视频和广播的demo。

以下是实例图片、API和接入流程

APP Demo(注:视频数据来自于熊猫TV,广播数据来自于中国广播网)

App Demo 下载地址

 
 


一、API v1.0.1

1、回调接口

//准备好播放后回调此接口WlOnPreparedListener//视频加载回调此接口WlOnLoadListener//视频时长和当前播放时长回调此接口WlOnInfoListener//视频出错回调此接口WlOnErrorListener//视频播放结束回调此接口WlOnCompleteListener//视频截屏回调此接口WlOnCutVideoImgListener//播放页切换播放源时回调此接口(stop(false)时),在此接口可重新设置新的播放源WlOnStopListener

2、方法

//设置播放源void setDataSource(String dataSource);//设置是否播放音频(广播)void setOnlyMusic(boolean onlyMusic)//设置视频渲染glsurfaceviewvoid setWlGlSurfaceView(WlGlSurfaceView wlGlSurfaceView)//准备播放(对应回调接口)void prepared()//准备好后,开始播放void start()//暂停void pause()//播放(相对于暂停)void resume()//停止 true:不回调停止接口,false:回调停止接口void stop(final boolean exit)//seek到任意时间(不是关键帧,可能会出现几秒钟花屏)void seek(final int secds)//得到总播放时长int getDuration() //得到视频宽度int getVideoWidth()//得到视频高度int getVideoHeight()//得到音轨数int getAudioChannels()//设置音频音轨(根据音轨数量设置索引)void setAudioChannels(int index)

二、接入流程

1、添加布局

2、创建播放器对象

private WlGlSurfaceView surfaceview;private WlPlayer wlPlayer;@Overridepublic void onCreate(Bundle savedInstanceState) {    wlPlayer = new WlPlayer();    wlPlayer.setOnlyMusic(false); // true:播放广播,false:播放视频    wlPlayer.setDataSource(pathurl); //设置播放源    wlPlayer.setWlGlSurfaceView(surfaceview); //播放广播可不加视频渲染布局}

3、准备播放

wlPlayer.prepared();

4、添加回调(注:都在子线程中)

//视频准备好播放时回调wlPlayer.setWlOnPreparedListener(new WlOnPreparedListener() {        @Override        public void onPrepared() {                wlPlayer.start();//开始播放                    }    });    //加载回调wlPlayer.setWlOnLoadListener(new WlOnLoadListener() {        @Override        public void onLoad(boolean load) {//true:加载中 false:加载完成                        Message message = Message.obtain();            message.what = 1;            message.obj = load;            handler.sendMessage(message);        }    });    //播放时间信息回调wlPlayer.setWlOnInfoListener(new WlOnInfoListener() {        @Override        public void onInfo(WlTimeBean wlTimeBean) {//当前播放时间和总的时间                    Message message = Message.obtain();            message.what = 2;            message.obj = wlTimeBean;            MyLog.d("nowTime is " +wlTimeBean.getCurrt_secds());            handler.sendMessage(message);        }    });    //错误回调wlPlayer.setWlOnErrorListener(new WlOnErrorListener() {        @Override        public void onError(int code, String msg) {            MyLog.d("code:" + code + ",msg:" + msg);            Message message = Message.obtain();            message.obj = msg;            message.what = 3;            handler.sendMessage(message);        }    });    //播放完成回调wlPlayer.setWlOnCompleteListener(new WlOnCompleteListener() {        @Override        public void onComplete() {            MyLog.d("complete .....................");            wlPlayer.stop(true);        }    });    //视频截屏回调wlPlayer.setWlOnCutVideoImgListener(new WlOnCutVideoImgListener() {        @Override        public void onCutVideoImg(Bitmap bitmap) {            Message message = Message.obtain();            message.what = 4;            message.obj = bitmap;            handler.sendMessage(message);        }    });    //停止播放回调(在wlPlayer.stop(false)等情况下才会回调这个方法,里面可处理切换播放源操作)wlPlayer.setWlOnStopListener(new WlOnStopListener() {        @Override        public void onStop() {            Message message = Message.obtain();            message.what = 3;            handler.sendMessage(message);        }    });

TODO

兼容性和性能优化

 

 

当前环境:FFmpeg-3.4, AS-3.0, NDK-14b,小米手机2A

CPU:arm 和 x86

2018-01-01 happy new year!

 

Create by:ywl5320

 

 

更多相关文章

  1. Android中VideoView播放当前工程中视频文件的方法
  2. Android视频录制小例子
  3. Android视频音乐播放SeekBar和播放时间同步
  4. 使用ijkplayer播放一个网络视频
  5. Android使用videoview播放res/raw下的视频并在结束后隐藏
  6. Android课程设计,生活记事本
  7. Android中定义接口的用法
  8. Android调用系统拍摄视频
  9. [Linphone Android] 带视频的呼叫

随机推荐

  1. Spring Cloud Ribbon:负载均衡的服务调用
  2. Java 8都出那么久了,Stream API了解下?
  3. Android(安卓)Framework层看硬件加速
  4. Spring Cloud Hystrix:服务容错保护
  5. 如何回答亲戚问一个月赚多少钱?
  6. 人体运维:人和机器没什么区别
  7. mall-tiny:基于SpringBoot+MyBatis的单应
  8. HTTP就是这么简单(修订版)
  9. Hystrix Dashboard:断路器执行监控
  10. 带你搭一个SpringBoot+SpringData JPA的D