Coder Social home page Coder Social logo

yangchaojiang / yjplay Goto Github PK

View Code? Open in Web Editor NEW
1.7K 43.0 300.0 311.61 MB

一个支持自定义UI布局,流式API, 加密,直播 ,亮度,音量,快进等手势 ,广告视频预览,多种加载模式 ,多种分辨率切换 ,多种封面图, 自定义数据源,列表播放,倍数播放,边播变缓存<font color="red">不是使用AndroidVideoCache</font>,离线播放,神奇的播放器

License: Apache License 2.0

Java 1.48% Makefile 1.30% C++ 0.51% C 85.83% Shell 0.11% Perl 0.09% CSS 0.01% Objective-C 3.90% Assembly 6.74% Cuda 0.02% Roff 0.01% Awk 0.01% HTML 0.01% Ruby 0.01% Python 0.01% V 0.01%
exoplayer video-player fullscreen video listvideo textureview surfaceview

yjplay's Introduction

yjPlay

Download

gif 显示有点卡,帧数低,实际很流畅

基于exoPlayer 自定义播放器 JPlayer支持功能:

  • ExoUserPlayer 基本播放(默认关闭手势 亮度,音量,快进,等手势,支持自定义布局)
  • 自动适配适配TV。
  • 支持横屏和竖屏两种模式全屏。
  • 适配音频控制布局。
  • 支持广告视频预览(轻松实现,完美切换,可自定义)。
  • 支持多种分辨率视频切换(已支持自定义布局样式)。
  • 缓存下载加密视频功能(边播变缓存轻松实现不是使用AndroidVideoCache。
  • 支持列表集合 播放视频(列表到详情播放完美过度)
  • 支持网络类型 提示是否播放(可自定义屏蔽)。
  • 支持视频加载布局, 错误布局,重播布局,提示布局自定义,更灵活实现自己布局样式。
  • 支持视频加速慢速播放(已支持自定义布局样式)参考demo自定义。
  • 支持多种视频封面图(两种模式封面图)。
  • 支持支持自定义MediaSource
  • 支持精简版和完整版,选择使用更丰富。
  • 增加离线下载辅助类ExoWholeDownLoadManger,ExoWholeDownloadTracker,ExoDownLoadManger,DownloadService()-->戳我)
  • 支持播放锁屏功能和控制布局显示显示动画效果.
  • 支持返回按钮和全屏按钮图标自定义。
  • 支持自定义视频封面布局.(视频封面图布局样式完美多样化)。
  • 支持视频实时进度(头条底部进度)。
  • 支持流式API方式调用。
  • 支持多种文件类型,MP4,M4A,WebM,Matroska,Ogg,WAV,MP3,MPEG-TS,MPEG-PS,FLV,ADTS (AAC),Flac,M3U8,mkv 等。
  • 支持自定义多种 http,Rtmp,Https,Cronet等协议。

一.引用类库

 repositories {
        jcenter()
        mavenCentral();
    }

dependencies {
   //完整版
    compile 'com.ycjiang:VideoPlayModule:2.3.61'
   //精简版(没有smoothstreaming,dash,hls,只有常规点播功能)
    compile 'com.ycjiang:VideoPlayModule-Lite:2.3.61'

}

提示:无法正常引用请在 repositories{ }添加已下代码 mavenCentral(url: "https://dl.bintray.com/ycjiang/ycjiang")

二.控件属性

基本使用如下

      <chuangyuan.ycj.videolibrary.widget.VideoPlayerView
              android:id="@+id/exo_play_context_id"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="@android:color/transparent"
              />

1.控件属性

  <chuangyuan.ycj.videolibrary.widget.VideoPlayerView
        android:id="@+id/exo_play_context_id"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:controller_layout_id="@layout/simple_exo_playback_control_view"
        app:player_layout_id="@layout/simple_exo_view"
        app:player_replay_layout_id="@layout/custom_play_replay"
        app:player_error_layout_id="@layout/custom_play_error"
        app:player_hint_layout_id="@layout/custom_play_btn_hint"
        app:player_load_layout_id="@layout/custom_exo_play_load"
        app:player_gesture_audio_layout_id="@layout/custom_gesture_audio"
        app:player_gesture_bright_layout_id="@layout/custom_gesture_brightness"
        app:player_gesture_progress_layout_id="@layout/custom_gesture_pro"
        app:player_preview_layout_id="@layout/exo_default_preview_layout"
        app:resize_mode="fit"
        app:show_timeout="3000"
        app:surface_type="texture_view"
        app:fastforward_increment="0"
        app:rewind_increment="0"
        app:user_watermark="@mipmap/watermark_big"
        app:player_list="true"
        app:use_controller="true"
        app:player_fullscreen_image_selector="@drawable/custom_full_selector"
        app:player_back_image="@drawable/ic_back_custom"
         />

2.属性说明 自定义视图的可用属性:

name type info
surface_type enum 视频渲染类型 texture_view 和surface_view 枚举类型 默认surface_view
resize_mode enum 视频缩放渲染显示方式一共5种
reference 1.fit 正常模式
reference 2.fixed_16_9 保持的是视频的比例16:9
reference 3.fixed_4_3 保持的是视频比例4:3
reference 4.fill 全屏模式,拉伸视频宽高
reference 4.match 矩阵模式
player_layout_id reference (播放器布局):目前默认布局 simple_exo_view.xml
controller_layout_id reference 控制器布局 默认有四种布局
reference 1.simple_exo_playback_control_view.xml 视频封面控制布局下面,(默认)
reference 2.simple_exo_playback_list_view.xml.xml 在列表播放使用控制布局
reference 3.simple_exo_playback_top_view.xml.xml 视频封面控制布局上面
reference 4.exo_playback_control_view.xml exo 提供默认风格
player_replay_layout_id reference 设置 自定义重播布局文件
player_error_layout_id reference 设置 自定义错误布局文件
player_hint_layout_id reference 设置 自定义非wifi提示布局文件
player_load_layout_id reference 设置 自定义视频加载布局文件
player_gesture_audio_layout_id reference 设置 自定义手势音频调节布局
player_gesture_bright_layout_id reference 设置 自定义手势亮度调节布局
player_gesture_progress_layout_id reference 设置 自定义手势进度调节布局
player_preview_layout_id reference 设置 自定义封面图布局(默认 exo_default_preview_layout.xml)
player_list boolean 设置 是否指定列表播放 默认 false true 列表播放
player_fullscreen_image_selector reference 设置 自定义全屏按钮selector
player_back_image reference 设置 自定义返回按钮图标
default_artwork reference 设置 封面占位图
show_timeout integer 设置 控制布局隐藏时间 默认值为3秒
fastforward_increment integer 设置 按钮设置快进增量,以毫秒为单位(exo控制布局使用)
rewind_increment integer 设置 按钮设置快退增量,以毫秒为单位(exo控制布局使用)
user_watermark reference 设置 水印图片 默认在右上角
  • 注意:

    1.列表播放只能选择texture_view 不能选择surface_view,详情页面播放推荐surface_view

    2.自定义全屏按钮selector

      <selector xmlns:android="http://schemas.android.com/apk/res/android">
           <item android:drawable="@drawable/ic_custom_full" android:state_checked="true" />
           <item android:drawable="@drawable/ic_custom_full_in" android:state_checked="false" />
      </selector>
    

    3.自定义封面图布局中,也包含封

3.快速自定义视频进度控件颜色

如何自定义视频进度控件--->戳我 在app的module的values 文件下-> colors.xml 文件里

  <!--视频加载缓存进度的面图控件。所以自定义封面图布局后,就不要再的控制布局使用封面图控件
                颜色-->
  <color name="timeBar_buffered_color">@color/light_green</color>
  <!--已经播放过视频的颜色-->
  <color name="timeBar_played_color">#c63020</color>
  <!--没有加载过进度的颜色-->
  <color name="timeBar_unplayed_color">@color/live_yellow</color>
  <!--视频进度圆点的颜色-->
  <color name="timeBar_scrubber_color">@color/colorAccent</color>
  

4.修改网络对话框提示文字内容

  app.strings.xml
  <string name="exo_play_reminder">您当前网络不是wifi,是否继续观看视频</string>
  <string name="exo_play_wifi_hint_no">提示</string>

5.开启竖屏全屏模式。

 ```
 VideoPlayerView.setVerticalFullScreen(true)
 ```
 或者
 ````
   exoPlayerManager = new VideoPlayerManager.Builder(VideoPlayerManager.TYPE_PLAY_GESTURE, videoPlayerView)
                 .setVerticalFullScreen(true)
 ````

6.在功能清单声明 AndroidManifest.xml

在activity节点 加上“android:configChanges="orientation|keyboardHidden|screenSize"”
 如下实例:
        <activity android:name="chuangyuan.ycj.yjplay.MainListActivity"
         android:configChanges="orientation|keyboardHidden|screenSize"
         android:screenOrientation="portrait">

3.JAVA 代码

1 播放控制类

1.ExoUserPlayer

2 VideoPlayerView 控件 可用方法

name type info
setTitle("标题") void 设置视频标题
setExoPlayWatermarkImg(R.mipmap.watermark_big) void 设置添加水印图片
setPreviewImage(Bitmap) void 设置封面图
setPreviewImage(R.res.image) void 设置封面图
setPreviewImage(R.res.image) void 设置封面图
getPreviewImage() ImageView 设置封面图控件
setPreviewImage(R.res.image) void 设置封面图
setVerticalFullScreen(true) void 开启竖屏全屏

更多方法参考demo用法。

3 播放代码

              //实例化
     ExoUserPlayer exoPlayerManager = new VideoPlayerManager.Builder(VideoPlayerManager.TYPE_PLAY_MANUAL, videoPlayerView)
                      .setDataSource(new DataSource(this))
                      //加载rtmp 协议视频
                      .setPlayUri("rtmp://live.hkstv.hk.lxdns.com/live/hks")
                      //加载m3u8
                      .setPlayUri("http://dlhls.cdn.zhanqi.tv/zqlive/35180_KUDhx.m3u8")
                      //加载ts.文件
                      .setPlayUri("http://185.73.239.15:25461/live/1/1/924.ts")
                      //播放本地视频
                      .setPlayUri("/storage/emulated/0/DCIM/Camera/VID_20170717_011150.mp4")
                      //播放列表视频
                      .setPlayUri(listss);
                      //设置开始播放进度
                      .setPosition(1000)
                      //示例本地路径 或者 /storage/emulated/0/DCIM/Camera/VID_20180215_131926.mp4
                      .setPlayUri(Environment.getExternalStorageDirectory().getAbsolutePath()+"/VID_20170925_154925.mp4")
                      //开启线路设置
                      .setShowVideoSwitch(true)
                      .setPlaySwitchUri(0,test,name)
                      .setPlaySwitchUri(0, 0, getString(R.string.uri_test_11), Arrays.asList(test), Arrays.asList(name))
                      //设置播放视频倍数  快进播放和慢放播放
                      .setPlaybackParameters(0.5f, 0.5f)
                      //是否屏蔽进度控件拖拽快进视频(例如广告视频,(不允许用户))
                      .setSeekBarSeek(false)
                      //设置视循环播放
                      .setLooping(10)
                      //视频进度回调
                       .addOnWindowListener(new VideoWindowListener() {
                                         @Override
                                         public void onCurrentIndex(int currentIndex, int windowCount) {
                                             Toast.makeText(getApplication(), currentIndex + "windowCount:" + windowCount,                                                    Toast.LENGTH_SHORT).show();
                                         }
                                     })
                      .addOnWindowListener(new VideoWindowListener() {
                          @Override
                          public void onCurrentIndex(int currentIndex, int windowCount) {
                              Toast.makeText(getApplication(), currentIndex + "windowCount:" + windowCount, Toast.LENGTH_SHORT)                                             .show();
                          }
                      })
                      .addVideoInfoListener(new VideoInfoListener() {
                          ·····
                      })
                      //创建
                       .create()
                         //播放视频
                      .startPlayer();

1.实例化播放控制类 //播放控制器创建 ExoUserPlayer exoPlayerManager = new VideoPlayerManager.Builder(VideoPlayerManager.TYPE_PLAY_USER, videoPlayerView).create();

2.自定义你的数据源,后面详细介绍如何自定义数据源类

     ExoUserPlayer exoPlayerManager = new VideoPlayerManager.Builder(VideoPlayerManager.TYPE_PLAY_MANUAL, videoPlayerView)
                                                    .setDataSource(new DataSource(this))
                                                    .create();
     ExoUserPlayer exoPlayerManager =  new VideoPlayerManager.Builder(VideoPlayerManager.TYPE_PLAY_MANUAL, videoPlayerView)
                                                      .setDataSource(mediaSourceBuilder)
                                                      .create();
     定义多媒体
     MediaSourceBuilder   mediaSourceBuilder=new MediaSourceBuilder(this,new DataSource(getApplication()));
    集成smoothstreaming,dash,hls
     WholeMediaSource   mediaSourceBuilder=new MediaSourceBuilder(this,new DataSource(getApplication()));  
     ManualPlayer   exoPlayerManager =new VideoPlayerManager.Builder(VideoPlayerManager.TYPE_PLAY_MANUAL, videoPlayerView)
                                                        .setDataSource(mediaSourceBuilder)
                                                        .create();

4 VideoPlayerManager.Builder 播放管理类可用方法

name type info
setPosition(1000) void 设置开始播放进度
setPosition(windowIndex,1000) void 设置设置当前窗口位置,开始播放进度
setPlayUri("http:...m3u8"); void 设置视频路径
setPlayUri(Uri.parse("uri")) void 设置开始播放进度
setShowVideoSwitch(true) void 设置开启多线路设置,默认关闭
setLoadModel(LoadModelType.PERCENR) void 设置视频加载提示显示模式(默认LoadModelType.SPEED (网速模式))
setPlaybackParameters(2f,1f) void 设置播放视频倍数 快放和慢放播放 小于1 慢放 大于1 快放
startPlayer() void 开始播放视频

更多方法参考demo用法。

注意

1.exoPlayerManager.setPlayUri(Environment.getExternalStorageDirectory().getAbsolutePath()+"/test.h264"); 本地视频 2.设置多线路播放

           开启多线路设置,默认关闭
           exoPlayerManager.setShowVideoSwitch(true);
           支持List列表
           String [] test={"http://120.25.246.21/vrMobile/travelVideo/zhejiang_xuanchuanpian.mp4",
           "http://120.25.246.21/vrMobile/travelVideo/zhejiang_xuanchuanpian.mp4",
           http://120.25.246.21/vrMobile/travelVideo/zhejiang_xuanchuanpian.mp4"};
           String[] name={"超清","高清","标清"};
           exoPlayerManager.setPlaySwitchUri(0,test,name);
           多分辨路和广告视频设置
           exoPlayerManager.setPlaySwitchUri(0, 0, getString(R.string.uri_test_11), Arrays.asList(test), Arrays.asList(name));
       

3.广告视频预览(轻松实现)

      /**需要添加参数就行**/
        第一个参数代表是广告视频位置索引
        exoPlayerManager.setPlayUri(0, "http://mp4.vjshi.com/2013-07-25/2013072519392517096.mp4", "http://mp4.vjshi.com/2013-11-11/1384169050648_274.mp4");       
         如果自己在播放视频时特出处理。实现该接口回调
        视频切换回调处理,进行布局处理,控制布局显示
        exoPlayerManager.setOnWindowListener(new VideoWindowListener() {
        @Override
        public void onCurrentIndex(int currentIndex, int windowCount) {
                     if (currentIndex == 0) {
                         //屏蔽控制布局
                         exoPlayerManager.hideControllerView();
                         //如果屏蔽控制布局 但是需要显示全屏按钮。手动显示,播放正常时自动还原。无需里出
                         videoPlayerView.getExoFullscreen().setVisibility(View.VISIBLE);
                     } else {
                         //恢复控制布局
                         exoPlayerManager.showControllerView();
                     }
                 }
         });
       //跳过广告视频操作
       exoPlayerManager.next();

4.设置点击播放按钮需要处理业务

  exoPlayerManager.setOnPlayClickListener(new View.OnClickListener() {
                          @Override
                          public void onClick(View v) {
                              Toast.makeText(MainCustomActivity.this,"定义点击播放事件",Toast.LENGTH_LONG).show();
                               //处理业务操作 完成后 
                              exoPlayerManager.startPlayer();//开始播放
                }
     });

5.设置监听回调VideoInfoListener

     exoPlayerManager.addVideoInfoListener(new VideoInfoListener() {
                   @Override
                   public void onPlayStart() {
                         //开始播放
                   }

                   @Override
                   public void onLoadingChanged() {
                             //加载变化
                   }

                   @Override
                   public void onPlayerError(ExoPlaybackException e) {
                             //加载错误
                  }

                   @Override
                   public void onPlayEnd() {
                          //播放结束
                   }
                   @Override
                   public void onRepeatModeChanged(int repeatMode) {
                       //模式变化
                   }
               });

6.覆写Activity和Fragment周期方法

            Override
            public void onResume() {
                super.onResume();
                exoPlayerManager.onResume();
            }

            @Override
            public void onPause() {
                super.onPause();
                exoPlayerManager.onPause();
            }


            @Override
            protected void onDestroy() {
                exoPlayerManager.onDestroy();
                super.onDestroy();
            }

            @Override
            public void onConfigurationChanged(Configuration newConfig) {
                exoPlayerManager.onConfigurationChanged(newConfig);//横竖屏切换
                super.onConfigurationChanged(newConfig);
            }
            
            @Override
            public void onBackPressed() {
            //使用播放返回键监听
             if(exoPlayerManager.onBackPressed()){
                 finish();
             }
            }

四.数据源工厂类

1.默认数据源

      缓存 : CacheDataSourceFactory
      http : DefaultDataSourceFactory,DefaultHttpDataSourceFactory
      Priority : PriorityDataSourceFactory

2 ExoPlayer自定义数据源引用(根据自己需求选用)

  compile 'com.google.android.exoplayer:extension-okhttp:2.9.5'
  compile 'com.google.android.exoplayer:extension-rtmp:2.9.5'
  compile 'com.google.android.exoplayer:extension-gvr:2.9.5'
  compile 'com.google.android.exoplayer:extension-cast:2.9.5'
  compile 'com.google.android.exoplayer:extension-mediasession:2.9.5'
  compile 'com.google.android.exoplayer:extension-ima:2.9.5'
  compile 'com.google.android.exoplayer:extension-leanback:2.9.5'

混淆声明

-dontwarn chuangyuan.ycj.**

-keep class chuangyuan.ycj.** { *;}

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

yjplay's People

Contributors

yangchaojiang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

yjplay's Issues

怎么播放 RTMP 流

exoPlayerManager = new ManualPlayer(this, R.id.exo_play_context_id, new DataSource());
exoPlayerManager.setPlayUri("rtmp://192.168.1.201:1935/live/StreamLK");

public class DataSource implements DataSourceListener {
@OverRide
public com.google.android.exoplayer2.upstream.DataSource.Factory getDataSourceFactory() {
return new RtmpDataSourceFactory();
}
}

这样行不通。。

w无法播放优酷m3u8地址

测试地址作者可以去优酷网址上抓下地址,机型换成ipad即可获取视频的m3u8地址,作者可以测试下

ps:

@Override
    public MediaSource initMediaSource(Uri uri) {
        int streamType = Util.inferContentType(uri);
        switch (streamType) {
            case C.TYPE_SS:
                return new SsMediaSource(uri, new DefaultDataSourceFactory(context, null,
                        getDataSource()),
                        new DefaultSsChunkSource.Factory(getDataSource()),
                        mainHandler, sourceEventListener);
            case C.TYPE_DASH:
                return new DashMediaSource(uri, new DefaultDataSourceFactory(context, null, getDataSource()),
                        new DefaultDashChunkSource.Factory(getDataSource()), mainHandler, sourceEventListener);
            case C.TYPE_HLS:
                return new HlsMediaSource(uri, getDataSource(), 5, mainHandler, sourceEventListener);
            case C.TYPE_OTHER:
                return new ExtractorMediaSource(uri, getDataSource(), new DefaultExtractorsFactory(), mainHandler, null,uri.getPath());
            default:
                throw new IllegalStateException("Unsupported type: " + streamType);
        }

我断点看了下,没有走Hls那个case,走的是的Other,所以播放不了,不知道作者这个问题作者怎么解决呢

列表模式播放空指针 java.lang.NullPointerException

ava.lang.RuntimeException:Unable to pause activity : java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.android.exoplayer2.Player.setPlayWhenReady(boolean)' on a null object reference

Caused by:

5 java.lang.NullPointerException:Attempt to invoke interface method 'void com.google.android.exoplayer2.Player.setPlayWhenReady(boolean)' on a null object reference
6 com.google.android.exoplayer2.ui.PlaybackControlView$1.dispatchSetPlayWhenReady(PlaybackControlView.java:237)
7 com.google.android.exoplayer2.ui.PlaybackControlView.showNo(PlaybackControlView.java:1073)
8 chuangyuan.ycj.videolibrary.widget.VideoPlayerView$ComponentListener.reset(VideoPlayerView.java:948)
9 chuangyuan.ycj.videolibrary.video.ManualPlayer.reset(ManualPlayer.java:166)
10 chuangyuan.ycj.videolibrary.video.ManualPlayer.onListPause(ManualPlayer.java:139)
11 chuangyuan.ycj.videolibrary.video.VideoPlayerManager.onPause(VideoPlayerManager.java:62)

Error when play with switch uri enable

There is an error when play list uri and enable next uri when have an error.
Player will goto next item when I reselect current item of list uri.

I checked log and see that:
when swith uri ExoPlayerMediaSourceBuilder call release and there an Exception make ExoUserPlayer jump to onPlayerError and function nextUri of me called.

I don't know that is issue of ExoPlayer or your library but When I remove content of release function in ExoPlayerMediaSourceBuilder issue no occur.

无法播放本地视频,另Activity全屏后点后退,会出现系统状态条

无法播放本地视频,提示错误
java.net.MalformedURLException: Protocol not found: /storage/emulated/0/Movies/AVRecSample/2017-09-25-14-12-12.mp4

调用方法为
exoPlayerManager.setPlayUri("/storage/emulated/0/Movies/AVRecSample/2017-09-25-14-12-12.mp4");

改为
exoPlayerManager.setPlayUri("file:///storage/emulated/0/Movies/AVRecSample/2017-09-25-14-12-12.mp4");
仍然提示
Unexpected ClassCastException: libcore.net.url.FileURLConnection cannot be cast to java.net.HttpURLConnection

貌似是不认识本地路径。

我的
网络正常
这个视频文件是存在的
应用也有运行时读写权限
网络视频地址是可以正常播放的

image

另:
设置默认全屏之后,点击放大,再点击后退键返回初始状态的时候全屏失效了。
截图另补

debug 可以正常播放,release播放崩溃

用的是你的工程完整版,debug 可以正常播放,release播放崩溃,错误提示:java.lang.IllegalStateException: 你的MediaSource 为空 当前视频类型,或者实现类型2

不错的库,发现几点问题和建议

1、现在的全屏后视频显示比例不对(看下图里的字幕显示可以看出来,横屏的时候正常)
screenshot_2017-07-10-23-54-41-859_chuangyuan xiangjiang yjplay
2、现在的全屏方式在android 6.0 上,标题栏 并不会被隐藏,会一直显示:
screenshot_2017-07-11-00-07-21-235_chuangyuan xiangjiang yjplay
3、对于hls流,进度条似乎显示的是每个分片的播放进度,而不是视频进度
4、建议加入网络变化通知,用流量的时候能有个提醒

谢谢

不能同时设置广告视频和多线路视频播放吗

先设置广告视频,然后设置多线路视频,广告视频会被后面的覆盖,请问有办法同时设置吗。还是说只能等广告视频播放完了,在去设置多线路视频切换过来,这样就不能无缝切换了。

如下描述(友盟错误反馈)

java.lang.NullPointerException: Attempt to invoke virtual method 'long com.google.android.exoplayer2.u.h()' on a null object reference
at chuangyuan.ycj.videolibrary.e.b$a.onScroll(GestureVideoPlayer.java)
at android.view.GestureDetector.onTouchEvent(GestureDetector.java:622)
at chuangyuan.ycj.videolibrary.e.b.onTouch(GestureVideoPlayer.java)

Update percent loading

Hi,
Thanks for good library about media player, i used it for some my project.
I have a idea that you can update percent loading, that allow user know when player load and may be play.

[Support] Make preview video from full video

I want to make a small video to play from a full video.
Example:
Full video with length 100 mins
I want to preview from 2 minutes to 7 minutes
Is there a way to represent it on your library?

缓存视频到本地

怎么将视频缓存到本地,再次打开播放的时候不用重新网络加载呢?(或者保存在本地)

jcenter config

大佬,下次提交,可以把你 VideoPlayModule 里 build.gradle jcenter config 单独拿出去 😑

一个严重问题

低配手机在切换全屏和取消全屏的时候,首先会卡顿,声音正常播放画面定格不动。我最近也在改造exo。也遇到了同样的问题

关于多广告视频的问题

我觉得exoPlayerManager.setPlayUri(0,url1,url2)这个方法的第二个参数是否可改成List 这样就可以支持多个广告视频了

列表播放自定义手势布局空指针

Process: chuangyuan.xiangjiang.yjplay, PID: 5759
java.lang.NullPointerException
at chuangyuan.ycj.videolibrary.widget.VideoPlayerView$6.setTimePosition(VideoPlayerView.java:475)
at chuangyuan.ycj.videolibrary.video.GestureVideoPlayer.showProgressDialog(GestureVideoPlayer.java:194)
at chuangyuan.ycj.videolibrary.video.GestureVideoPlayer.access$300(GestureVideoPlayer.java:38)
at chuangyuan.ycj.videolibrary.video.GestureVideoPlayer$PlayerGestureListener.onScroll(GestureVideoPlayer.java:336)
at android.view.GestureDetector.onTouchEvent(GestureDetector.java:567)
at chuangyuan.ycj.videolibrary.video.GestureVideoPlayer.onTouch(GestureVideoPlayer.java:131)
at android.view.View.dispatchTouchEvent(View.java:7701)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
at android.app.Activity.dispatchTouchEvent(Activity.java:2458)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
at android.view.View.dispatchPointerEvent(View.java:7886)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3978)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3857)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3423)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3473)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3442)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3549)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3450)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3606)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3423)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3473)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3442)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3450)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3423)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5626)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5606)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5577)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5706)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5679)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5725)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android

楼主,如何禁掉声音

现在需要个需求,播放视频不播放声音,包括使用增加音量键,请问可以做到吗。谢谢楼主

UI依赖建议

//compile project(':VideoUi')
compile 'com.ycjiang:VideoUi:1.0.4'
目前是这样依赖的,能不能以Module的方式依赖啊,这样可以更加方便的进行UI修改

你的解码怎么做的

是用了软解码,还是先硬解码失败后在用软解码的,如何选择软硬解码

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.