成都创新互联网站制作重庆分公司

Ijkplayer的简单分析

1.      获取代码:

创新互联长期为超过千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为新市企业提供专业的成都网站设计、网站建设新市网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制开发。

git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android

cd ijkplayer-android

git checkout -B latest k0.8.8

 

2.      Before Build:

# install homebrew, git, yasm
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install git
brew install yasm
# add these lines to your ~/.bash_profile or ~/.profile
# export ANDROID_SDK=
# export ANDROID_NDK=
# on Cygwin (unmaintained)
# install git, make, yasm

3.      获取依赖的开源库

./init-android.sh

获取FFmpeg不同armabi 库,

获取libyuv和libtouchsound lib库:

Ijkplayer的简单分析

几个开源库介绍:

1.      jni4android是一个jni生成工具,可以根据提供的java类,自动生成对应jni层的*.c文件和*.h头文件。

 

2.      SoundTouch 是一个开源的音频库,主要有以下功能:

变速不变调(TSM,Time Scale Modification),改变音频的播放速度(快或者慢)同时不影响音频的声调(Pitch)。

变调不变速 Pitch Shifting ,改变音频声调的同时保持音频的播放速度不变

变调变速,同时改变音频的声调和速度

 

3.      libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,可在Windows、Linux、Mac、Android等操作系统,x86、x64、arm架构上进行编译运行,支持SSE、AVX、NEON等SIMD指令加速。

 

4.      编译Android FFmpeg库:

cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all

FFmpeg Git仓库:

不同armabi 对应的ffmpeg 库:

FFmpeg 编译脚本:

Ijkplayer的简单分析

 

编译libavfiter等目标文件:

5.      编译ijk:

cd ..
./compile-ijk.sh all

通过NDK编译 ijkplayer目录下的JNI文件夹

打包生成ijkffmpeg等so。

编译ijkplayer

6.      导入AS(3.2):

File->Open, 点击选择android->ijkplayer

 

AS配置注意问题:

1.      Gradle 版本切换。手动下载gradle版本如gradle-4.6-all.zip放入gradle文件下中。

2.      Jcenter下载超时问题,替换成aliyun。

 

二. ijk代码分析:

IjkPlayer除了提供ijkPlayer API,同时也提供了Android原生的MediaPlayer以及google自己的exoPlayer API。ijkPlayer在VideoView中通过Player工厂模式Create

Ijkplayer的简单分析

IjkDemo整体架构:

Ijkplayer的简单分析

Demo未使用sdl来绘制,android中使用可参考:

https://github.com/wanliyang1990/SDL2ForAndroid

 

ijkplayer播放时序图:

 Ijkplayer的简单分析

./android/ijkplayer_jni.c

IjkMediaPlayer_native_setup

 

ijkplayer_android.c

ijkmp_android_create

 

ffpipeline_android.c

ffpipeline_create_from_android

 

 

播放器基本框图:

Ijkplayer的简单分析

ffplay.c中主要的代码调用流程如下图所示:

Ijkplayer的简单分析Ijkplayer的简单分析

1.      数据读取

stream_open主要做了以下几件事情:

  • 创建存放video/audio解码前数据的videoq/audioq

  • 创建存放video/audio解码后数据的pictq/sampq

  • 创建读数据线程read_thread      

  • 创建视频渲染线程video_refresh_thread

2.      音视频解码:

  • 视频解码方式选择

  • 如果配置了ffp->mediacodec,会优先去尝试打开硬件×××,如果不支持硬件解码,则切换软解。

  • Video_thread/audio_thread。

3.      音视频渲染

初始化player,构建vout对象:ijksdl –>s4a

mp->ffplayer->vout = SDL_VoutAndroid_CreateForAndroidSurface();

 

调用SDL_VoutDisplayYUVOverlay进行绘制

SDL_VoutDisplayYUVOverlay(ffp->vout, vp->bmp);

 

 

 


名称栏目:Ijkplayer的简单分析
链接URL:http://cxhlcq.com/article/ijspsc.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部