同步发表于 http://avenwu.net/ijkplayer/2015/05/07/hands_on_ijkplayer_preparation

谈到视频播放大家都知道ffmpeg,基于其的衍生版本也很多,比如本文的ijkplayer.

试试ijkplayer编译

去到B站得github主页,找到ijkplayer项目,clone源码

git clone git@github.com:Bilibili/ijkplayer.git

根据介绍文档一步步开始

./init-android.sh

执行初始化的shell脚本,脚本会自动下载ffmpeg的主干代码


IJK_FFMPEG_UPSTREAM=git://git.videolan.org/ffmpeg.git
IJK_FFMPEG_FORK=https://github.com/Bilibili/FFmpeg.git
IJK_FFMPEG_COMMIT=ijk-r0.2.2-dev
IJK_FFMPEG_LOCAL_REPO=extra/ffmpeg set -e
TOOLS=tools echo "== pull ffmpeg base =="
sh $TOOLS/pull-repo-base.sh $IJK_FFMPEG_UPSTREAM $IJK_FFMPEG_LOCAL_REPO function pull_fork()
{
echo "== pull ffmpeg fork $1 =="
sh $TOOLS/pull-repo-ref.sh $IJK_FFMPEG_FORK android/ffmpeg-$1 ${IJK_FFMPEG_LOCAL_REPO}
cd android/ffmpeg-$1
git checkout ${IJK_FFMPEG_COMMIT}
cd -
} pull_fork "armv7a"
pull_fork "armv5"
pull_fork "x86"
pull_fork "arm64-v8a" ./init-config.sh
./init-android-libyuv.sh

简单分析一息脚本做的事情,

首先定义了4个先关的变量,用于后文下载源码和目录的文件

1. IJK_FFMPEG_UPSTREAM=git://git.videolan.org/ffmpeg.git
ffmpeg的官方repo地址
2. IJK_FFMPEG_FORK=https://github.com/Bilibili/FFmpeg.git
B站托管与github的ffmpeg分支
3. IJK_FFMPEG_COMMIT=ijk-r0.2.2-dev
可以用来编译不同平台版本的代码分支

找到tools目录的pull-repo-ref.sh脚本,这个脚本用于获取B站托管的github上的FFmpeg分支,根据不同的目标平台放置不同工作目录,后面单独分析;

获取完代码后,检出之前定义的特定分支,也就是ijk-r0.2.2-dev

最后再调用另外两个脚本init-config.sh和init-android-libyuv.sh

tools/pull-repo-ref.sh

这里脚本接受了三个参数

REMOTE_REPO=https://github.com/Bilibili/FFmpeg.git B站自己托管站github的FFmpeg
LOCAL_WORKSPACE=android/ffmpeg-xxx 本地目标仓库存放位置,xxx为平台版本
REF_REPO=extra/ffmpeg 远程ffmpe官方仓库clone到本地的位置

接下来通过 git clone --reference来获取B站得FFmpeg,为什么这里的clone加了--reference参数?实际上根据用法介绍,--reference是为了减少从网络获取的文件,尽可能从本地的仓库中获取;

所以B站FFmpeg应该是基于官方的ffmpeg,这样的话,由于一开始的时候已经获取了官方ffmpeg代码,在获取B站的分支仓库时就可以将之前下好的官方仓库的本地库作为参考仓库;


REMOTE_REPO=$1
LOCAL_WORKSPACE=$2
REF_REPO=$3 if [ -z $1 -o -z $2 -o -z $3 ]; then
echo "invalid call pull-repo.sh '$1' '$2' '$3'"
elif [ ! -d $LOCAL_WORKSPACE ]; then
git clone --reference $REF_REPO $REMOTE_REPO $LOCAL_WORKSPACE
cd $LOCAL_WORKSPACE
git repack -a
else
cd $LOCAL_WORKSPACE
git pull --rebase
cd -
fi

./init-config.sh

这个脚本用来安全检查,如果config/module.sh不存在,那么默认将module-lite.sh拷贝作为module.sh,至于module.sh,在前面已经提到,主要是对标准ffmpeg的剪裁控制

if [ ! -f 'config/module.sh' ]; then
cp config/module-lite.sh config/module.sh

./init-android-libyuv.sh

这个脚本和前面提到的类似,只不过是用来下载依赖包的

IJK_LIBYUV_UPSTREAM=https://github.com/Bilibili/libyuv.git
IJK_LIBYUV_FORK=https://github.com/Bilibili/libyuv.git
IJK_LIBYUV_COMMIT=ijk-r0.2.1-dev
IJK_LIBYUV_LOCAL_REPO=extra/libyuv set -e
TOOLS=tools echo "== pull libyuv base =="
sh $TOOLS/pull-repo-base.sh $IJK_LIBYUV_UPSTREAM $IJK_LIBYUV_LOCAL_REPO echo "== pull libyuv fork =="
sh $TOOLS/pull-repo-ref.sh $IJK_LIBYUV_FORK ijkmedia/ijkyuv ${IJK_LIBYUV_LOCAL_REPO}
cd ijkmedia/ijkyuv
git checkout ${IJK_LIBYUV_COMMIT}
cd -

开始编译

初始化完毕后就可以依次执行下面的脚本开始编译了

cd android
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh
./compile-ijk.sh

这里可能会遇到一些问题,根据自身环境不同不一定一样;笔者在编译时,第一次直接在master上编,结果提示有一个.h找不到,根据文档指南切回k0.2.3后重新来就OK了,虽然上面也说了可以在maste直接编,但实际上是不行的;

最后编译成功的话会看到几个so的输出

注意默认情况下这里之变异了armv7的几个so库,其他平台的需要跟上参数编译

compile-ijk.sh armv5|armv7a|x86|arm64-v8a
或者
compile-ijk.sh all

但是,事情不是这么简单,但加上all之后,armv7仍然成功,但是x86编译就跪了

同时armv5也跪了,原因都是找不libijkffmpeg.so

冲armv7得输出日志可以看到,这个文件是build下从各自版本的编译文件拷贝而来;

定位到build文件夹,里面只有armv7的相关文件,所以根本拷贝就不会成功,自然就挂了;


aven-mac-pro:android aven$ ./compile-ijk.sh all
Android NDK: ERROR:/Users/aven/work/video/ijkplayer/android/ijkmediaplayer-armv5/jni/ffmpeg/Android.mk:ijkffmpeg: LOCAL_SRC_FILES points to a missing file
Android NDK: Check that /libijkffmpeg.so exists or that its path is correct
/Users/aven/Android/android-ndk-r10c/build/core/prebuilt-library.mk:45: *** Android NDK: Aborting . Stop.
/Users/aven/work/video/ijkplayer/android
[armeabi-v7a] Prebuilt : libijkffmpeg.so <= /Users/aven/work/video/ijkplayer/android/build/ffmpeg-armv7a/output/
[armeabi-v7a] Install : libijkffmpeg.so => libs/armeabi-v7a/libijkffmpeg.so
[armeabi-v7a] Compile thumb : ijkplayer <= ff_cmdutils.c
[armeabi-v7a] Compile thumb : ijkplayer <= ff_ffplay.c
[armeabi-v7a] Compile thumb : ijkplayer <= ijkmeta.c
[armeabi-v7a] Compile thumb : ijkplayer <= ijkplayer.c
[armeabi-v7a] Compile thumb : ijkplayer <= ffpipeline_ffplay.c
[armeabi-v7a] Compile thumb : ijkplayer <= ffpipenode_ffplay_vdec.c
[armeabi-v7a] Compile thumb : ijkplayer <= ffpipenode_ffplay_vout.c
[armeabi-v7a] Compile thumb : ijkplayer <= ffmpeg_api_jni.c
[armeabi-v7a] Compile thumb : ijkplayer <= ijkplayer_android.c
[armeabi-v7a] Compile thumb : ijkplayer <= ijkplayer_jni.c
[armeabi-v7a] Compile thumb : ijkplayer <= ffpipeline_android.c
[armeabi-v7a] Compile thumb : ijkplayer <= ffpipenode_android_mediacodec_vdec.c
[armeabi-v7a] Compile thumb : ijkplayer <= ffpipenode_android_mediacodec_vout.c
[armeabi-v7a] Compile thumb : ijksdl <= ijksdl_vout_overlay_ffmpeg.c
[armeabi-v7a] Compile thumb : ijksdl <= image_convert.c
[armeabi-v7a] Compile thumb : ijksdl <= android_nativewindow.c
[armeabi-v7a] Compile thumb : ijksdl <= ijksdl_vout_android_nativewindow.c
[armeabi-v7a] SharedLibrary : libijksdl.so
[armeabi-v7a] SharedLibrary : libijkplayer.so
[armeabi-v7a] Install : libijkplayer.so => libs/armeabi-v7a/libijkplayer.so
[armeabi-v7a] Install : libijksdl.so => libs/armeabi-v7a/libijksdl.so
[armeabi-v7a] Install : libijkutil.so => libs/armeabi-v7a/libijkutil.so
/Users/aven/work/video/ijkplayer/android
Android NDK: ERROR:/Users/aven/work/video/ijkplayer/android/ijkmediaplayer-x86/jni/ffmpeg/Android.mk:ijkffmpeg: LOCAL_SRC_FILES points to a missing file
Android NDK: Check that /libijkffmpeg.so exists or that its path is correct
/Users/aven/Android/android-ndk-r10c/build/core/prebuilt-library.mk:45: *** Android NDK: Aborting . Stop.
/Users/aven/work/video/ijkplayer/android到libijkffmpeg.so

这个时候只能一步一步回溯,首先查看compile-ffmpeg.sh


UNI_BUILD_ROOT=`pwd`
FF_TARGET=$1
set -e
set +x FF_ALL_ARCHS="armv5 armv7a x86 arm64-v8a"
FF_ACT_ARCHS="armv5 armv7a x86" echo_archs() {
echo "===================="
echo "[*] check archs"
echo "===================="
echo "FF_ALL_ARCHS = $FF_ALL_ARCHS"
echo "FF_ACT_ARCHS = $FF_ACT_ARCHS"
echo ""
} case "$FF_TARGET" in
"")
echo_archs
sh tools/do-compile-ffmpeg.sh armv7a
;;
armv5|armv7a|x86|arm64-v8a)
echo_archs
sh tools/do-compile-ffmpeg.sh $FF_TARGET
;;
all)
echo_archs
for ARCH in $FF_ACT_ARCHS
do
sh tools/do-compile-ffmpeg.sh $ARCH
done
;;
clean)
echo_archs
for ARCH in $FF_ALL_ARCHS
do
cd ffmpeg-$ARCH && git clean -xdf && cd -
done
rm -rf ./build/ffmpeg-*
;;
check)
echo_archs
;;
*)
echo "Usage:"
echo " compile-ffmpeg.sh armv5|armv7a|x86|arm64-v8a"
echo " compile-ffmpeg.sh all"
echo " compile-ffmpeg.sh clean"
echo " compile-ffmpeg.sh check"
exit 1
;;
esac echo "\n--------------------"
echo "[*] Finished"
echo "--------------------"
echo "# to continue to build ijkplayer, run script below,"
echo "sh compile-ijk.sh "

眼尖的话应该看到了,这里也是需要跟参数来决定编译的版本,问题引刃而解。

再次编译成功.

小试ijkplayer编译的更多相关文章

  1. Swift基础--ijkplayer编译

    这篇与Swift基本上没有什么关系,只是之后会用到,这次编译是使用Mac编译IOS版本号的.以下是编译流程,最后是整个项目的下载地址.由于下载太慢了. 1.下载源代码 git clone https: ...

  2. Ubuntu下编译Bilibili/ijkplayer

    在做Android客户端视频播放器的过程中熟悉ijkplayer.他在视频支持协议上要比Android原生的mediaplayer做的要好.因此,自己也基于Bilibili/ijkplayer的重新编 ...

  3. ijkplayer之.so文件编译过程

    本文转载:ijkplayer编译so库真没那么难: 1.如何使用ijkplayer 官方:https://github.com/Bilibili/ijkplayer build.gradle添加下述依 ...

  4. ijkplayer导入AS时,出现more than one library with package name错误

    最近刚接触ijkplayer ,在ubuntu 中将ijkplayer编译后,导入Windows中AS时,出现以下错误,目前初步定为为包重名,但具体原因未定为到,麻烦有遇到这方面的朋友,给指导下,

  5. android studio 3.0 集成ijkplayer

    一.ijkplayer编译过程略,有兴趣的朋友可以再研究,以下以编译好的版本讲解. 将ijkplayer相关的so及aar文件复制到app下的libs目录,为支持多版本的手机使用,将所有的so文件都复 ...

  6. Eclipse集成ijkplayer并实现本地和网络视频播放等

    概述 Eclipse 集成ijkplayer demo,播放本地视频.和rtmp流. 详细 代码下载:http://www.demodashi.com/demo/10630.html 原文地址:Ecl ...

  7. IJKPlayer如何支持https

    给ijkplayer安装支持https 首先使用如下终端命令安装yasm 第一: 1. curl http://www.tortall.NET/projects/yasm/releases/yasm- ...

  8. ubuntu-15.04 下编译 ijkplayer 安卓版

    我的环境: 1.win7 主系统 2.VirtualBox 5.1.2 虚拟机 3.ubuntu-15.04-desktop-amd64.iso 镜像文件 4.android-ndk-r10e-lin ...

  9. 开源播放器 ijkplayer (五) :Linux/Ubuntu 下编译ijkplayer

    一.安装Git与yasm sudo apt-get install git sudo apt-get install yasm 二.下载和配置 SDK.NDK SDK一般开发时肯定都有的,NDK一般是 ...

随机推荐

  1. Titanium系列--利用Titanium开发android App实战总结

    1. Titanium中,通过ImageView Controller 显示图片,图片地址要放在app/assets下,然后自己建一个文件夹,把图片放在这里.如下图,然后alloy代码:<Ima ...

  2. javascript改变样式(cssFloat,styleFloat)

    昨天遇到一用js改变元素浮动的,当时直接写了 obj.style.float="left";结果没起作用:查了资料后才发现不能这样写,现在整理下几种样式写法 1,直接写css属性的 ...

  3. Zynga 开源其服务器性能监控分析工具 zPerfmon

    流年不利的社交游戏服务商Zynga近日在官方博客宣布开源zPerfmon——该工具负责监控Zynga数以千计的社交游戏服务器.zPerfmon的源代码目前已经上传至Github. 包括Facebook ...

  4. 用c#开发微信 (14) 微统计 - 阅读分享统计系统 4 部署测试 (最终效果图)

    微信平台自带的统计功能太简单,有时我们需要统计有哪些微信个人用户阅读.分享了微信公众号的手机网页,以及微信个人用户访问手机网页的来源:朋友圈分享访问.好友分享消息访问等.本系统实现了手机网页阅读.分享 ...

  5. Dynamic CRM 2013学习笔记(二十九)报表设计:reporting service 报表开发常见问题

    在报表开发过程中,经常会遇到各种各样的问题,比如The report cannot be displayed. (rsProcessingAborted),一点有意义的提示都没有:再就是分页问题,经常 ...

  6. HTTP权威指南阅读笔记三:HTTP报文

    报文的组成部分 报文由三部分组成:对报文进行描述的起始行(start line).包含属性的首部(header),以及可选的.包含数据的主体(body)部分. 请求报文格式 <method> ...

  7. [ACM_动态规划] POJ 1050 To the Max ( 动态规划 二维 最大连续和 最大子矩阵)

    Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...

  8. [51单片机] TFT2.4彩屏1 [文字显示 画矩形]

    >_<:因为要驱动彩屏,所以这里采用STC90C516RD+单片机[51的89C52也行,就是可能内存在接下来的实验中可能会内存不够],晶振尽量采用高一点的,这里采用24MHz的. > ...

  9. django with mysql (part-4)

    step01: write the ( views.py ) again .. vim views.py step02: configure your (urls.py) step03: check ...

  10. bundle与package区别与联系

    转:http://blog.csdn.net/lmbda/article/details/17895619 bundle是Apple提供的软件安装的便捷方法. bundle为用户和开发者提供了一个简单 ...