# IJKPlayer **Repository Path**: relin/IJKPlayer ## Basic Information - **Project Name**: IJKPlayer - **Description**: Android IJK集成播放器 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2022-01-25 - **Last Updated**: 2024-08-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### IJKPlayer IJK集成播放器,拥有亮度调整、音量调整、视频全屏播放。 #### 效果图标 ![视频亮度](https://github.com/RelinRan/IJKPlayer/blob/master/ic_brightness.png) ![视频音量](https://github.com/RelinRan/IJKPlayer/blob/master/ic_voice.png) ![视频进度](https://github.com/RelinRan/IJKPlayer/blob/master/ic_progress.png) #### Fix 1.更新编译为ff4.0--ijk0.8.8--20210426--001版本; 2.Android 11以上高版本报错问题 3.音量、光亮、进度调节逻辑修改 4.重新编译so,支持播放rtmp、rtsp协议 5.支持音频解析pcm、amr、nellymoser、flac、ogg、wav、matroska 6.去掉loading显示,显示实时网速缓冲 7.自定义亮度、音量控件跟随手势变化 8.增加手势滑动视频进度改变,同时中间显示滑动百分比显示 9.快速来回滑动,出现水平和垂直冲突显示 10.水平滑动修改视频进度增加网速缓冲显示 11.增加VideoHolder常用的一些控制方法 12.修改自定义View对应包名 13.VideoView新增setDisplay方法设置显示方式 #### [AAR] [aar文件](https://github.com/RelinRan/IJKPlayer/blob/master/aar) ``` android { .... repositories { flatDir { dirs 'libs' } } } dependencies { implementation(name: 'IJKPlayer', ext: 'aar') } ``` #### JitPack 项目/build.grade ``` allprojects { repositories { ... maven { url 'https://jitpack.io' } } } ``` 项目/app/build.grade ``` dependencies { implementation 'com.github.RelinRan:IJKPlayer:2024.7.22.1' } ``` #### 权限配置 ``` ``` #### AndroidManifest.xml 播放页面 ``` ``` Application ``` android:usesCleartextTraffic="true" ``` 文件操作 ``` ``` path.xml ``` ``` #### xml布局 ``` ``` #### 参数配置 ``` //初始化建议配置在Application IJK ijk = IJK.config(); //设置默认显示方式 ijk.display(Display.AUTO); //使用硬解码器解码 ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1); //自动旋转视频画面 ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1); //处理分辨率变化 ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 1); //设置最大缓冲区大小(默认是0,表示无限制) ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-buffer-size", 1024*1024*5); //设置最小缓冲帧数 ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", 60); //设置最大缓存时长 ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max_cached_duration", 5000); //设置启动时的探测时间(毫秒) ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzeduration", 400); //设置分析最大时长(毫秒) ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzemaxduration", 100); //强制刷新数据包 ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "flush_packets", 1L); //禁用数据包缓冲 ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0L); //设置帧率为30 ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "fps", 120); //设置超时时间 ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout", 10000); //启用无限缓冲模式 ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "infbuf", 0); //启用帧丢弃 ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 1); //跳过环路过滤器(Loop Filter),提高解码性能 ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "skip_loop_filter", 48); //禁用 HTTP 资源范围检测 ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "http-detect-range-support", 1); //启用精确的 seek(定位) ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1); //清除DNS缓存(为了提高域名解析的效率) ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1); //自动重新连接 ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "reconnect", 1); //调用prepareAsync()方法后是否自动开始播放 ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 1); ``` #### rtmp直播流,刚播放时,画面卡顿几秒,没有声音大概4、5秒后都恢复正常 不要配置probesize参数 ``` ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "opensles", 0); ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "nobuffer"); ``` #### 播放视频 ``` VideoView video = findViewById(R.id.ijk); //修改默认的显示方式 video.setDisplay(Display.AUTO); //是否是直播源 video.setLiveSource(true); //视频控制ViewHolder VideoHolder holder = video.getViewHolder(); //自定义全屏还是小屏幕显示,不设置就采用默认的逻辑; video.setOnVideoSwitchScreenListener(orientation -> { //TODO: 自定显示方式 }); //播放视频 String url = "https://stream7.iqilu.com/10339/upload_transcode/202002/09/20200209105011F0zPoYzHry.mp4"; //开始播放 String source = video.getDataSource(); if (TextUtils.isEmpty(source)) { video.setDataSource(url); video.start(); } else { video.reset(); video.setDataSource(url); video.prepareAsync(); } ``` #### 颜色配置 ``` #03DAC5 #80000000 #DDDDDD #03DAC5 #E8E8E9 #F0F0F1 #80000000 #03DAC5 #03DAC5 ``` #### 尺寸配置 ``` 14sp 65dp 65dp 8dp 4dp 13sp 20dp 15dp 1dp 20dp 20dp 3dp 2dp 2dp 4dp ```