1. 获取代码:
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、小程序定制开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了昌邑免费建站欢迎大家使用!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库:
几个开源库介绍:
1. jni4android是一个jni生成工具,可以根据提供的java类,自动生成对应jni层的*.c文件和*.h头文件。
2. 是一个开源的音频库,主要有以下功能:
变速不变调(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 编译脚本:
编译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
IjkDemo整体架构:
Demo未使用sdl来绘制,android中使用可参考:
https://github.com/wanliyang1990/SDL2ForAndroid
ijkplayer播放时序图:
./android/ijkplayer_jni.c
IjkMediaPlayer_native_setup
ijkplayer_android.c
ijkmp_android_create
ffpipeline_android.c
ffpipeline_create_from_android
播放器基本框图:
ffplay.c中主要的代码调用流程如下图所示:
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);
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
本文名称:Ijkplayer的简单分析-创新互联
文章转载:http://scpingwu.com/article/diooej.html