1.问题
当我们通过maven
远程依赖ijkPlayer
的sdk
时会发现https
请求的地址无法播放.
示例:
implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
我们如果提供https 链接的视频源进行播放会提示下面的错误:
2022-02-21 15:11:26.045 6696-6757/tv.danmaku.ijk.media.example E/IJKMEDIA: https://play-bd.zinyan.cn/pv1460154680872402944/C056E304041632_1.flv: Protocol not found
2022-02-21 15:11:26.268 6696-6696/tv.danmaku.ijk.media.example E/tv.danmaku.ijk.media.player.IjkMediaPlayer: Error (-10000,0)
错误信息-10000
主要错误就是 Protocol not found
(找不到协议)。
我们打印详细的ijkLog日志可以看到:
IjkMediaPlayer_prepareAsync
ijkmp_prepare_async()
I/IJKMEDIA: ===== versions =====
I/IJKMEDIA: ijkplayer : k0.8.8
FFmpeg : ff3.4--ijk0.8.7--20180103--001
I/IJKMEDIA: SDL_RunThread: [7683] ff_msg_loop
I/IJKMEDIA: libavutil : 55.78.100
D/IJKMEDIA: message_loop
D/IJKMEDIA: FFP_MSG_FLUSH:
I/IJKMEDIA: libavcodec : 57.107.100
libavformat : 57.83.100
I/IJKMEDIA: libswscale : 4.8.100
libswresample: 2.9.100
I/IJKMEDIA: ===== options =====
format-opts : ijkapplication = -1956508144
format-opts : ijkiomanager = -1955347456
I/IJKMEDIA: ===================
I/IJKMEDIA: SDL_RunThread: [7685] ff_read
I/IJKMEDIA: SDL_RunThread: [7684] ff_vout
D/IJKMEDIA: ijkmp_prepare_async()=0
W/IJKMEDIA: https protocol not found, recompile FFmpeg with openssl, gnutls or securetransport enabled.
最后有输出:https protocol not found, recompile FFmpeg with openssl, gnutls or securetransport enabled.
翻译后的内容为:找不到https协议,请在启用openssl、gnutls或securetransport的情况下重新编译FFmpeg。
所以我们需要开启openssl
之后,再进行编译一遍FFmpeg
库, 然后再将FFmpeg
库编译到libijkffmpeg.so
中。
2.导读
在文章:Ubuntu 使用git 拉取ijkPlayer sdk源码 并进行编译 (zinyan.com) 我已经介绍了整个ijkplayer SDK的编译。
我尝试从windows 子系统搭建开始,到最后的ijkplayer 源码拉取与编译,都有详细的介绍。
由于内容比较多,我分了多篇文章。可以通过ijkplayer (zinyan.com) 查询到全部的关于ijkplayer 方面的内容知识。
3.编译
基于ijkPlayer k0.8.8版本编译
3.1 拉取openssl
由于https
需要openssl
库的支持。所以我们要加载openssl
库。
在ijkplayer
目录下,执行: ./init-android-openssl.sh
。从远程拉取openssl
库。
开始拉取中:
拉取完毕后,我们就可以看到在contrib
文件夹下新增加的openssl-xxx
的库文件对象了。
3.2 编译openssl 库
我们在android/contrib
文件夹下,执行openssl
的编译。
zinyan@LAPTOP-141OG4MA:~/ijkplayer/android/contrib$ ./compile-openssl.sh clean
zinyan@LAPTOP-141OG4MA:~/ijkplayer/android/contrib$ ./compile-openssl.sh all
效果图如下:
我们如果原先编译过compile-ffmpeg.sh
文件的话。那么编译这个openssl
就不会有啥问题的。而如果编译过程中出现了问题。那么可以参考我的这篇文章的解决:ijkPlayer 编译compile-ffmpeg.sh 文件时的问题汇总 (zinyan.com)
它们两个出现的问题的解决都差不多。解决方法都一样。
编译完成后的输出结果如下所示:
下一步编译compile-ffmpeg.sh
3.3 编译 ffmpeg库
当我们编译了openssl
库之后,就需要编译ffmpeg
库了。
有些老一点的版本,可能还需要我们主动配置下面的配置(在ijkplayer/config/module.sh
文件中)添加下面的配置,
开启openssl
才行,但是现在k0.8.8
版本是不需要我们去配置的,因为ijkplayer
脚本已经帮我们集成配置好了。
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-openssl"
所以我们直接执行:下面配置,而不用主动配置export
了。
zinyan@LAPTOP-141OG4MA:~/ijkplayer/android/contrib$ ./compile-ffmpeg.sh clean //清理原有的
zinyan@LAPTOP-141OG4MA:~/ijkplayer/android/contrib$ ./compile-ffmpeg.sh all //在执行编译全部的
可以看到编译输出的日志中,标注了当前库支持的协议。其中就有我们需要的https
协议。
编译结束的时候输出效果如下: Finished
字段出现就代表我们已经编译完ffmpeg
库了。
3.4 编译ijkPlayer 库
在前面的openssl
和ffmpeg
编译完毕后,最后编译ijkplayer
的时候就比较简单了。通常不会出现什么大的问题。
zinyan@LAPTOP-141OG4MA:~/ijkplayer/android$ ./compile-ijk.sh all
编译全部库,最后输出效果如下:
将libijkffmpeg.so
,libijksdl.so
, libijkplayer.so
文件拷贝使用就可以了。
4. 导入项目
将编译后的so文件,直接导入项目中。
效果如下:
由于我使用了ijk
做productFlavors
了。所以引入的时候有ijk做前缀。
主要就是,可以远程依赖java
代码。然后指令集的通过我们本地导入的就可以了
最终实现了https
链接的数据源播放效果。
后记
还有很多地方并没有弄明白,之后了解更深入后再补上吧。
如果有需要编译成功后的so库,可以通过添加公众号留言:ijkplayer
获取我编译好的so库。(ps:主要给我的公众号拉一下关注。)
编译的so支持的视频协议如下:ftp,hls,http,https,rtmp,rtmpt,mp4,mov
- 最近添加了一个未使用编译器堆栈保护技术bug解决的so版本,可以通过文章:https://zinyan.com/?p=261 了解哦。
评论区