编译ijkplayer srt项目,一堆坑

文章内容包括

  1. ubuntu下,安装一些软件
  2. ijkplayer + openssl + srt NDK交叉编译
  3. Virtualbox虚拟机的共享文件夹配置
  4. 编译好的so库,可以播放str 包括str带stremaid的直播地址

一、编译前准备

  • 编译所需的环境:Ubuntu 20.04.4 + NDK(r14b和r20b) + cmake(3.18.1)+ git
  1. 安装git python ninja ssl所需
安装:sudo apt install git python ninja-build
安装ssl所需:sudo apt-get install tclsh pkg-config libssl-dev build-essential
  1. 找个目录,在目录下更新或者安装gas-preprocessor
git clone https://hub.nuaa.cf/libav/gas-preprocessor
cd gas-preprocessor
sudo cp gas-preprocessor.pl /usr/local/bin
sudo chmod 777 /usr/local/bin/gas-preprocessor.pl
  1. 找个目录,在目录下安装Cmake 3.18.1
1. 卸载系统的cmake:sudo apt autoremove cmake
2. 下载cmake 3.18.1:wget https://hub.nuaa.cf/Kitware/CMake/releases/download/v3.18.1/cmake-3.18.1-Linux-x86_64.tar.gz
3. 解压:tar zxvf cmake-3.18.1-Linux-x86_64.tar.gz
4. 配置(自己的cmake目录):sudo ln -sf /home/lven/tool/cmake-3.18.1-Linux-x86_64/bin/*  /usr/bin/
查看:cmake --version
  1. 下载NDK 14 和 20两个版本,并解压就好
1. 下载NDK(r20b):wget https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip
2. 下载NDK(r14b):wget https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip

二、下载ijkplayer支持 srt 编译项目(最终是要编译出 libijkffmpeg.so)

  1. 克隆ijkplayer srt项目:git clone https://hub.nuaa.cf/befovy/ijkplayer.git ijkplayer-srt
  • 进入ijkplayer-srt 目录
  1. 找到下面文件:
init-android.sh
# init目录下
./init/init-android-openssl.sh 
./init/init-android-libsrt.sh
./init/init-libyuv.sh
./init/init-android-soundtouch.sh

由于github.com经常访问不到,将上面文件里面,所有的https://github.com 替换成 https://hub.nuaa.cf
github访问正常的就不用替换镜像地址了

  1. 修改init-android.sh
## 修改ffmpeg下载连接
IJK_FFMPEG_UPSTREAM=https://hub.nuaa.cf/Bilibili/FFmpeg.git
IJK_FFMPEG_FORK=https://hub.nuaa.cf/Bilibili/FFmpeg.git
IJK_FFMPEG_COMMIT=ff4.0--ijk0.8.8--20210426--001

#./init/init-android-boringssl.sh
./init/init-android-openssl.sh 
./init/init-android-libsrt.sh

## 留下armv7a,根据项目所需,其它的注释或者删掉
pull_fork "armv7a"
  1. 修改init目录下:init-android-openssl.sh
IJK_OPENSSL_UPSTREAM=https://hub.nuaa.cf/openssl/openssl.git
IJK_OPENSSL_FORK=https://hub.nuaa.cf/openssl/openssl.git
IJK_OPENSSL_COMMIT=OpenSSL_1_1_1o  #tag: OpenSSL_1_0_2r

## 留下armv7a,根据项目所需,其它的注释或者删掉
pull_fork "armv7a"

三、开始编译ijkplayer srt项目

1. 执行:sudo ./init-android.sh ,下载需要编译的库,下载都保存在extra目录下,及复制了一份到android/contrib/目录下
2. 到 android/contrib/目录下: cd android/contrib/ 
1. 编译 openssl

openssl 编译参考文档:https://hub.nuaa.cf/openssl/openssl/blob/master/NOTES-ANDROID.md

  • 更新环境(做一次就行)
sudo apt-get update
sudo apt-get upgrade
  • 打开compile-openssl.sh,添加NDK版本,保留所需的Cpu架构,去掉不要的。
## 最前面添加,注意自己的NDK路径
export ANDROID_NDK=/home/lven/tool/android-ndk-r20b
## 保留所需的CPU架构
FF_ACT_ARCHS_32="armv7a"
FF_ACT_ARCHS_64="armv7a"
  • 在tools目录下修改:do-detect-env.sh
 11*|12*|13*|14*|15*|16*|20*)
  • 在tools目录下修改:do-compile-openssl.sh
FF_ANDROID_PLATFORM=android-16
## armv7a下载修改,如要编译其它的看openssl官网介绍对应修改
FF_PLATFORM_CFG_FLAGS="android-arm"
## 注释这两句,没用
#FF_CFG_FLAGS="$FF_CFG_FLAGS --openssldir=$FF_PREFIX"
#FF_CFG_FLAGS="$FF_CFG_FLAGS --cross-compile-prefix=${FF_CROSS_PREFIX}-"

## 找到原有的PATH删掉,修改成
TARGET1=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin
TARGET2=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin
export PATH=$TARGET1:$TARGET2:$PATH

## 将原有的make  ./Configure 删掉,替换编译
DESTDIR=/tmp/openssl_android_build/$FF_PLATFORM_CFG_FLAGS 
rm -rf DESTDIR
./Configure $FF_CFG_FLAGS -D__ANDROID_API__=16  && \
    make  && \
    make install  DESTDIR=$DESTDIR || exit 128
## 添加文件拷贝命令
cp -R $DESTDIR/usr/local/* $FF_PREFIX/
  • 执行 sudo ./compile-openssl.sh
2.编译libsrt
  • 修改compile-libsrt.sh
## 最前面添加
export ANDROID_NDK=/home/lven/tool/android-ndk-r20b
ANDROID_HOME=/usr/bin

FF_ACT_ARCHS_32="armv7a"
FF_ACT_ARCHS_64="armv7a"
## NDK20 最小支持16,记得修改相应位置
API_LEVEL=16
## 修改 
${ANDROID_HOME}/cmake \ 
 -DCMAKE_MAKE_PROGRAM=${ANDROID_HOME}/ninja \
  • 执行 sudo ./compile-libsrt.sh
3.编译ffmpeg
  • 替换libsrt.c文件
1. 去ffmpeg官网下载 4.x.x最新版本:http://ffmpeg.org/releases 
2. 在最新下载的ffmpeg libavformat目录下找到libsrt.c文件,复制到 ffmpeg-armv7a libavformat目录下替换
  • 打开 compile-ffmpeg.sh 修改
export ANDROID_NDK=/home/lven/tool/android-ndk-r20b
FF_ACT_ARCHS_32="armv7a"
FF_ACT_ARCHS_64="armv7a"
  • 打开 do-compile-ffmpeg.sh 修改
FF_ANDROID_PLATFORM=16
  • 执行 sudo ./compile-ffmpeg.sh
4.编译官方ijkplayer(最终是要编译出:libijkffmpeg.so libijkplayer.so libijksdl.so)
IJK_FFMPEG_UPSTREAM=https://hub.nuaa.cf/Bilibili/FFmpeg.git
IJK_FFMPEG_FORK=https://hub.nuaa.cf/Bilibili/FFmpeg.git
## 只保留v7a
pull_fork "armv7a"
  • 修改 ./init-android-libyuv.sh ./init-android-soundtouch.sh(目的是下载快些)
### ./init-android-soundtouch.sh
K_SOUNDTOUCH_UPSTREAM=https://hub.nuaa.cf/Bilibili/soundtouch.git
IJK_SOUNDTOUCH_FORK=https://hub.nuaa.cf/Bilibili/soundtouch.git
### ./init-android-libyuv.sh
IJK_LIBYUV_UPSTREAM=https://hub.nuaa.cf/Bilibili/libyuv.git
IJK_LIBYUV_FORK=https://hub.nuaa.cf/Bilibili/libyuv.git
  • 执行 sudo ./init-android.sh

  • 到官网ijkpayer项目/ijkplayer/android/contrib目录下,创建目录 build/ffmpeg-armv7a/output,并修改权限

sudo mkdir -p build/ffmpeg-armv7a/output
sudo chmod 777 build/ -R
  • 将原先的ijkplayer-srt项目:/ijkplayer-srt/android/contrib/build/output-armv7a/目录下的所有文件,复制到 ijkpayer官网项目/ijkplayer/android/contrib/build/ffmpeg-armv7a/output/目录下。复制需要权限。
## 修改output-armv7a权限
sudo chmod 777 output-armv7a/ -R
  • 打开ijkplayer项目的目录:ijkplayer/android/ijkplayer/ijkplayer-armv7a,修改build.gradle
minSdkVersion 16
  • 打开ijkplayer项目的目录:ijkplayer/android/ijkplayer/ijkplayer-armv7a/src/main,修改AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="tv.danmaku.ijk.media.player_armv7a" >

    <uses-sdk
        android:minSdkVersion="16" />

</manifest>
  • 打开目录:ijkplayer/android/ijkplayer/ijkplayer-armv7a/src/main/jni,修改Application.mk
APP_PLATFORM := android-16
  • 回到目录:ijkplayer/android,修改compile-ijk.sh
export ANDROID_NDK=/home/lven/tool/android-ndk-r14b
ACT_ABI_32="armv7a"
ACT_ABI_64=
  • 执行 sudo ./compile-ijk.sh

  • so生成目录:ijkplayer/android/ijkplayer/ijkplayer-armv7a/src/main/libs 下的文件就是android所需

  • 编译出来的库少了 libc++_shared.so,去下面目录找加进去就行,如果是NDK项目,在build.gralde配置也行
    libc++_shared.so所在目录:C:\Users\LvenLiu\AppData\Local\Android\Sdk\ndk\21.0.6113669\toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\lib\arm-linux-androideabi

三、其它

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

推荐阅读更多精彩内容