ijkplayer

linux 下编译ijkplayer的so库

匿名 (未验证) 提交于 2019-12-02 21:56:30
BIliBIli开源播放器github地址: https://github.com/bilibili/ijkplayer 这个播放器是没有编译过的,没有so文件,只是个播放器壳,播放支持的格式内容取决于你下载他的ffmpeg编译时设定的配置。个人觉得播放器ijkplayer和内核ffmpeg分开放有助于解耦,方便播放器升级时候,不用重新下载ffmpeg。 ijkplayer 最新版本:k0.8.8 ffmpeg 基于内核:3.4 1,linux环境,安装好NDK,设置好环境代码,最好把它写到当前用户的.bashrc下。 export JAVA_HOME=/home/lee/Desktop/jre1.8.0_191/bin export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH //NDK export ANDROID_NDK=/home/leesoo/Desktop/android-ndk-r10e export PATH=$ANDROID_NDK:$PATH 2,初始 化android (比较久,下载半个小时) ./init-android .sh 看脚本就是git https://github

基于ijkplayer的视频播放器,仿Bilibili客户端,集成沉浸式全屏、弹幕、触屏控制、视频源切换等功能

感情迁移 提交于 2019-12-02 14:47:47
该视频播放器基于Bilibili的开源项目 ijkplayer 做的,是在github上的demo基础上搭建了个播放界面,如果你之前有研究过这个demo代码,那你看这个库就非常简单了。至于还不知道 ijkplayer 这个开源库的话可以先去了解下,这应该是目前github最火的开源视频播放器了吧,网上对这个的介绍也很多这里就不讲这个了。 我从Bilibili客户端扒了好多图标来用,希望不要造成不好的影响 ,我也算个B站粉 - -。下面先列一下目前集成的主要功能: 沉浸式全屏播放,隐藏状态栏和虚拟键如果有的话,用的时候有些需要注意的地方放后面说; 弹幕功能,包括发射弹幕和弹幕基本样式设置:大小、颜色和类型(顶部、底部和滚动弹幕),效果同Bilibili; 竖屏和横屏的切换,其实就是小屏和全屏的切换,提供了重力感应来切换竖横屏功能; 触屏控制,竖直方向左边控制亮度,右边控制声音,水平方向控制播放进度; 三指旋转缩放,当三个手指触屏时就可以进行视频界面的旋转缩放,效果同Bilibili; 视频源切换,可设置流畅、清晰、高清、超清和1080p等5种视频源; 视频宽高比例设置,包括16:9、4:3、视频内嵌填充界面和填充屏幕等4种; 记录上次播放进度的跳转功能; 其它的如截屏功能,电池电量显示,时间显示,播放常亮,跑马灯标题和锁屏处理; Screenshot 动图显示比较慢,就传两张gif。

ijkplayer播放器详解使用教程

我是研究僧i 提交于 2019-12-02 14:47:30
1.认识ijkplayer 最近公司准备开发一款视频播放及直播的应用,找了许多开源的框架,大部分都是基于ffmpeg开发的。最开始准备用Vitamio框架开发的,相关的文章也比较丰富,结果对于非个人移动应用均需购买Vitamio使用授权。不过B站开源的ijkplayer也不错,而且也不需要商业授权。 ijkplayer是一个基于FFmpeg的轻量级Android/iOS视频播放器。FFmpeg的是全球领先的多媒体框架,能够解码,编码, 转码,复用,解复用,流,过滤器和播放大部分的视频格式。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。 2.环境配置 项目中引入ijkplayer环境有两种方式。 2.1在Gradle中引入 # required allprojects { repositories { jcenter() } } dependencies { # required, enough for most devices. compile 'tv.danmaku.ijk.media:ijkplayer-java:0.6.1' compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.6.1' #

使用IJKPlayer播放视频实现了一些播放视频的基本操作

て烟熏妆下的殇ゞ 提交于 2019-12-02 14:44:23
使用IJKPlayer播放视频实现了一些播放视频的基本操作 Iijkplayer目前是很流行的音视频框架,集成我这里就不多说了,网上很多,大概就是编译ijkplayer的源码得到里边的so文件,添加到自己项目的libs文件夹中,gradlle依赖下资源。我这里是在IjkVideoView基础上开发的, 自己实现了播放、暂停、旋转全屏播放、音量和亮度调节、进度条、拖动进度条播放功能 ,可以满足普通的播放视频的需求; Demo下载 友情提示我播放的是本地视频需要自己在sd卡目录下放一个视频文件,6.0以上是需要动态申请读写sd卡权限的,我代码里边没有加入,我在手机设置里自己手动开启的。 看下动态效果图: 先看下布局layout,IjkVideoView的高度必须要是>0否则不会创建view就不会创建MediaPalyer对象了。我建议不居中的IjkVideoView高度和宽度填充处理,之后IjkVideoView再根据视频的宽高按比例设置达到自适应的效果。如果想在video上实现滑动控制音量和亮度,我建议再加一层布局就可以自定义它实现手势滑动功能; <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android

Android 音视频深入 十九 使用ijkplayer做个视频播放器(更新:增加了小框,2018-3-12)

喜欢而已 提交于 2019-12-02 14:43:56
项目地址 https://github.com/979451341/Myijkplayer 前段时候我觉得FFmpeg做个视频播放器好难,虽然播放上没问题,但暂停还有通过拖动进度条来设置播放进度,这些都即便做得到,可以那个延缓。。。。。 现在学习一下目前移动端最知名的视频播放器的框架ijkplayer,这个框架他是基于FFmpeg、SDL、还有安卓原生API MediaCodec之类的。他是没有播放界面的,这个需要我们去做,所以这个里我就做个基于ijkplayer的视频播放器,随便浅显的说一下ijkplayer的源码,关于ijkplayer的源码以后会专门出一篇博客说一下。 1.首先了解一下ijkplayer咋用 我这里引入ijkplayer是通过添加依赖 implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8' implementation 'tv.danmaku

最简单的让IjkPlayer自动旋转带有rotation视频的方法

霸气de小男生 提交于 2019-12-02 14:43:19
问题 在项目里面我们使用了ijkplayer0.8.8版本去播放网络视频,发现有一些视频播放时被拉伸了。如下图: 把视频抓下来查明原因,发现是视频metadata里面带了rotation信息,而视频的宽高被调换了。 解决方法 官方的解决方法是给一个ROTATION_CHANGE的回调给上层,然后上层去把View做旋转。这样实在是太麻烦。我但是很奇怪的是ijkplayer本身是基于ffplay做的,而ffplay本身是支持这一类视频的旋转播放的。看了一下ijkplayer的代码,在ff_play.c里面发现如下代码: if (ffp->autorotate) { double theta = get_rotation(is->video_st); if ( fabs (theta - 90 ) < 1.0 ) { INSERT_FILT( "transpose" , "clock" ); } else if ( fabs (theta - 180 ) < 1.0 ) { INSERT_FILT( "hflip" , NULL); INSERT_FILT( "vflip" , NULL); } else if ( fabs (theta - 270 ) < 1.0 ) { INSERT_FILT( "transpose" , "cclock" ); } else if ( fabs

ijkplayer剖析

我与影子孤独终老i 提交于 2019-11-30 21:30:48
ijkplayer 是一款比较出众的开源 Android/IOS 跨平台播放器,基于 ffplay,API 易于集成,可定制编译控制体积。 本文基于 0.8.8 版本的 ijkplayer ,对其源码进行剖析,涉及到不同平台下的封装接口或处理方式时,均以 Android 为例。 ijkplayer android 集成了三种播放器实现: AndroidMediaPlayer :即安卓系统自带的播放器 MediaPlayer ,基于 MediaCodec、AudioTrack 等安卓系统 API. IjkExoMediaPlayer :即谷歌新推出的 ExoPlayer ,同样是基于 MediaCodec、AudioTrack 等安卓系统 API,但相比 MediaPlayer 具有支持 DASH、高级 HLS、自定义扩展等优点。 IjkMediaPlayer :基于 FFmpeg 的 ffplay ,集成了 MediaCodec 硬解码器、Opengl 渲染方式等。 一般而言, ijkplayer 就是指 IjkMediaPlayer ,本文分析的对象就是 IjkMediaPlayer. 目录结构 123456789 ijkplayer(项目文件夹) ├──tools - 初始化项目工程脚本 ├──config - 编译ffmpeg使用的配置文件 ├──extra -

ijkplayer系列12:video_refresh_thread

江枫思渺然 提交于 2019-11-30 04:26:35
video_refresh_thread 该线程负责图像的渲染,先来看下整体流程: 从上面的流程图可以得知,最终根据格式的差异分成了三个分支,我们先来看下func_display_overlay_l()的源码,然后再继续深入三个分支中。 static int func_display_overlay_l(SDL_Vout *vout, SDL_VoutOverlay *overlay) { SDL_Vout_Opaque *opaque = vout->opaque; ANativeWindow *native_window = opaque->native_window; if (!native_window) { if (!opaque->null_native_window_warned) { opaque->null_native_window_warned = 1; ALOGW("func_display_overlay_l: NULL native_window"); } return -1; } else { opaque->null_native_window_warned = 1; } if (!overlay) { ALOGE("func_display_overlay_l: NULL overlay"); return -1; } if (overlay->w

ijkplayer系列13:video_refresh_thread

限于喜欢 提交于 2019-11-30 04:26:12
ffp_video_thread 这个线程用来处理视频解码。解码的调用流程如下: 以上可以看出,解码流程主动分为以下三部分: 初始化解码器。 开启解码器,如果配置了硬解则会尝试去创建硬解码器,没有配置硬解或者尝试创建硬解码器失败则创建软解码器。 启动解码线程,可以发现硬解和软解最终进入的方法是不同的,后面我们会针对两者分别解析。 我们先来看下decoder_init(): static void decoder_init(Decoder *d, AVCodecContext *avctx, PacketQueue *queue, SDL_cond *empty_queue_cond) { memset(d, 0, sizeof(Decoder)); d->avctx = avctx; // 保存数据来源的队列引用,这个队列存储了从流中读取的未解码的帧数据 d->queue = queue; d->empty_queue_cond = empty_queue_cond; d->start_pts = AV_NOPTS_VALUE; // 将当前时间点(系统启动至今的毫秒数)作为第一帧解码的时间点 d->first_frame_decoded_time = SDL_GetTickHR(); d->first_frame_decoded = 0; SDL_ProfilerReset(&d

Android优化之其他优化(1)

别来无恙 提交于 2019-11-29 23:28:14
其他优化 1 .静态变量优化 尽量不使用静态变量保存核心数据。这是为什么呢? 这是因为android的进程并不是安全的,包括application对象以及静态变量在内的进程级别变量并不会一直呆着内存里面,因为它很有会被kill掉。 当被kill掉之后,实际上app不会重新开始启动。Android系统会创建一个新的Application对象,然后启动上次用户离开时的activity以造成这个app从来没有被kill掉的假象。而这时候静态变量等数据由于进程已经被杀死而被初始化,所以就有了不推荐在静态变量(包括Application中保存全局数据静态数据)的观点。 2 注解替代枚举 使用注解限定传入类型 比如,尤其是写第三方开源库,对于有些暴露给开发者的方法,需要限定传入类型是有必要的。 举个例子: 刚开始的代码 /** * 设置播放器类型,必须设置 * 注意:感谢某人建议,这里限定了传入值类型 * 输入值:111 或者 222 * @param playerType IjkPlayer or MediaPlayer. */ public void setPlayerType(int playerType) { mPlayerType = playerType; } 优化后的代码,有效避免第一种方式开发者传入值错误 /** * 设置播放器类型,必须设置 * 注意:感谢某人建议