Win10+WSL环境编译bilibili/ijkplayer源码

先谈一下遇到的问题,最棘手的问题就是wsl环境下
ubuntu与win10的PATH环境变量是共享的,而在编译源码的时候用到NDK独立工具链(NDK standalone toolchain,大概是因为坑太多,目前已被google弃用,想了解的同学可点击此链接查看官方文档)在脚本中会去设置PATH环境变量,最后由于ubuntu的PATH环境变量共享了win10的值,导致编译失败。因为没遇到过此类问题因此耗费了一些时间,试了网上搜索的几种解决办法,最后通过修改注册表的方式解决了这个问题:

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss{GUID}\Flags Flags从更改7为5.
  • 管理员运行powershell重启wsl 命令如下
net stop LxssManager 
net start LxssManager

言归正传,下面详细介绍下编译流程,流程可以归结为以下几个步骤:

  • 配置android sdk及ndk路径
  • 下载bilibili/ijkplayer源码
  • 对FFmpeg进行配置
  • 执行init_android.sh
  • 编译FFmpeg
  • 编译ijkplayer
  • 使用ijkplayer库文件
    其中第三步和第四步顺序可以调换,下面针对每一步的操作及结果进行详细的解说。
  • 配置android sdk及ndk路径

NDK的版本要求在10~14之间,Android SDK的版本要求API 9~23(我实际用的是api 24也成功了)。
在/etc/bash.bashrc中添加如下代码

# export ANDROID_SDK=<your sdk path>
# export ANDROID_NDK=<your ndk path>
  • 下载bilibili/ijkplayer源码

从github网站克隆源码,由于公司网络环境不稳定可能会失败,建议通过pc连接手机热点下载(稳定,速度快,缺点是费流量)

git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
cd ijkplayer-android
git checkout -B latest k0.8.8

出现下图提示时表示已经下载完成了。


获取源码成功

获取到的源码如下:


ijkplayer源码文件
  • 执行init_android.sh脚本

该脚本的主要作用是获取ffmpeg、libyuv及soundtouch源码,并做一些初始化操作

hexj@DESKTOP-CPNS9JV:/mnt/d/ubuntu/ijkplayer-android$ ./init-android.sh
git version 2.25.1
== pull ffmpeg base ==
Cloning into 'extra/ffmpeg'...
remote: Enumerating objects: 539054, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 539054 (delta 0), reused 4 (delta 0), pack-reused 539050
Receiving objects: 100% (539054/539054), 203.51 MiB | 1.31 MiB/s, done.
Resolving deltas: 100% (418345/418345), done.
Updating files: 100% (6352/6352), done.
== pull ffmpeg fork armv5 ==
Cloning into 'android/contrib/ffmpeg-armv5'...
Updating files: 100% (6352/6352), done.
Enumerating objects: 539054, done.
Counting objects: 100% (539054/539054), done.
Delta compression using up to 8 threads
Compressing objects: 100% (119451/119451), done.
Writing objects: 100% (539054/539054), done.
Total 539054 (delta 418345), reused 539054 (delta 418345)
Updating files: 100% (1940/1940), done.
Switched to a new branch 'ijkplayer'
/mnt/d/ubuntu/ijkplayer-android
== pull ffmpeg fork armv7a ==
Cloning into 'android/contrib/ffmpeg-armv7a'...
Updating files: 100% (6352/6352), done.
Enumerating objects: 539054, done.
Counting objects: 100% (539054/539054), done.
Delta compression using up to 8 threads
Compressing objects: 100% (119451/119451), done.
Writing objects: 100% (539054/539054), done.
Total 539054 (delta 418345), reused 539054 (delta 418345)
Updating files: 100% (1940/1940), done.
Switched to a new branch 'ijkplayer'
/mnt/d/ubuntu/ijkplayer-android
== pull ffmpeg fork arm64 ==
Cloning into 'android/contrib/ffmpeg-arm64'...
Updating files: 100% (6352/6352), done.
Enumerating objects: 539054, done.
Counting objects: 100% (539054/539054), done.
Delta compression using up to 8 threads
Compressing objects: 100% (119451/119451), done.
Writing objects: 100% (539054/539054), done.
Total 539054 (delta 418345), reused 539054 (delta 418345)
Updating files: 100% (1940/1940), done.
Switched to a new branch 'ijkplayer'
/mnt/d/ubuntu/ijkplayer-android
== pull ffmpeg fork x86 ==
Cloning into 'android/contrib/ffmpeg-x86'...
Updating files: 100% (6352/6352), done.
Enumerating objects: 539054, done.
Counting objects: 100% (539054/539054), done.
Delta compression using up to 8 threads
Compressing objects: 100% (119451/119451), done.
Writing objects: 100% (539054/539054), done.
Total 539054 (delta 418345), reused 539054 (delta 418345)
Updating files: 100% (1940/1940), done.
Switched to a new branch 'ijkplayer'
/mnt/d/ubuntu/ijkplayer-android
== pull ffmpeg fork x86_64 ==
Cloning into 'android/contrib/ffmpeg-x86_64'...
Updating files: 100% (6352/6352), done.
Enumerating objects: 539054, done.
Counting objects: 100% (539054/539054), done.
Delta compression using up to 8 threads
Compressing objects: 100% (119451/119451), done.
Writing objects: 100% (539054/539054), done.
Total 539054 (delta 418345), reused 539054 (delta 418345)
Updating files: 100% (1940/1940), done.
Switched to a new branch 'ijkplayer'
/mnt/d/ubuntu/ijkplayer-android
== pull libyuv base ==
Cloning into 'extra/libyuv'...
remote: Enumerating objects: 12767, done.
remote: Total 12767 (delta 0), reused 0 (delta 0), pack-reused 12767
Receiving objects: 100% (12767/12767), 2.60 MiB | 95.00 KiB/s, done.
Resolving deltas: 100% (10540/10540), done.
== pull libyuv fork ==
Cloning into 'ijkmedia/ijkyuv'...
Enumerating objects: 12767, done.
Counting objects: 100% (12767/12767), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2210/2210), done.
Writing objects: 100% (12767/12767), done.
Total 12767 (delta 10540), reused 12767 (delta 10540)
Branch 'ijk-r0.2.1-dev' set up to track remote branch 'ijk-r0.2.1-dev' from 'origin'.
Switched to a new branch 'ijk-r0.2.1-dev'
/mnt/d/ubuntu/ijkplayer-android
== pull soundtouch base ==
Cloning into 'extra/soundtouch'...
remote: Enumerating objects: 208, done.
remote: Total 208 (delta 0), reused 0 (delta 0), pack-reused 208
Receiving objects: 100% (208/208), 256.98 KiB | 143.00 KiB/s, done.
Resolving deltas: 100% (91/91), done.
== pull soundtouch fork ==
Cloning into 'ijkmedia/ijksoundtouch'...
Enumerating objects: 208, done.
Counting objects: 100% (208/208), done.
Delta compression using up to 8 threads
Compressing objects: 100% (105/105), done.
Writing objects: 100% (208/208), done.
Total 208 (delta 91), reused 208 (delta 91)
Branch 'ijk-r0.1.2-dev' set up to track remote branch 'ijk-r0.1.2-dev' from 'origin'.
Switched to a new branch 'ijk-r0.1.2-dev'
/mnt/d/ubuntu/ijkplayer-android
  • 对FFmpeg进行配置

获取完ffmpeg源码之后不要着急进行编译,需要先对FFmpeg进行配置,进入config目录,可以看到此目录包含如下文件:


config文件

module-default.sh、module-lite-hevc.sh、module-lite.sh分别代表三种配置。简单解释一下这三种配置:
default支持的视频格式较多,但是编出来的so文件会较大;lite支持较少的格式,但是so文件也较小;lite-hevc支持格式较少,同时支持h265。
可以选择其中一个复制并另存为module.sh,默认为default,如果想改用module-lite配置代码如下:

cd config
rm module.sh
ln -s module-lite.sh module.sh
  • 编译FFmpeg

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

./compile-ffmpeg.sh后面为参数表示cpu架构,可以为armv5、 armv7a、 arm64、 x86、 x86_64等,all表示所有,我只编了armv7a。 当出现下图提示时表示FFmpeg编译成功:

FFmpeg编译成功

编译成功后会在android/contrib/build/ffmpeg-armv7a/output目录下生成libijkplayer.so文件
image.png

  • 编译ijkplayer

cd ..
./compile-ijk.sh armv7a

编译成功后会在android/ijkplayer/ijkplayer-armv7a/src/main/libs/armeabi-v7a目录下同时生成libijkplayer.so、libijksdl.so两个so文件。


编译ijkplayer成功

至此,ijkplayer的编译工作已经完成了!下面就是如何使用编译出的so文件。

  • 使用ijkplayer库文件

这一步可以在win10底下完成。通过android studio 导入android目录下的ijkplayer工程,修改gradle文件确保能够构建成功,然后编译并运行ijkplayer-example模块,安装成功后,选择一个视频文件,可以发现视频可以正常播放,没有卡顿并且音视频完全同步,简直666!

ijkplayer demo播放截图
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容