侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 290 篇文章
  • 累计创建 57 个标签
  • 累计收到 98 条评论

ijkPlayer k0.8.8版本默认不支持https协议,编译支持https的libijkffmpeg.so 库

Z同学
2022-02-23 / 5 评论 / 4 点赞 / 918 阅读 / 3,286 字
温馨提示:
本文最后更新于 2022-02-24,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1.问题

当我们通过maven远程依赖ijkPlayersdk时会发现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库。

image-20220223120017009

ijkplayer 目录下,执行: ./init-android-openssl.sh 。从远程拉取openssl库。

开始拉取中:

image-20220223120126577

拉取完毕后,我们就可以看到在contrib 文件夹下新增加的openssl-xxx的库文件对象了。

image-20220223140458514

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

效果图如下:

image-20220223144509082

我们如果原先编译过compile-ffmpeg.sh文件的话。那么编译这个openssl就不会有啥问题的。而如果编译过程中出现了问题。那么可以参考我的这篇文章的解决:ijkPlayer 编译compile-ffmpeg.sh 文件时的问题汇总 (zinyan.com)

它们两个出现的问题的解决都差不多。解决方法都一样。

编译完成后的输出结果如下所示:

image-20220223145408456

下一步编译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协议。

image-20220223162652284

编译结束的时候输出效果如下: Finished 字段出现就代表我们已经编译完ffmpeg库了。

image-20220223162842910

3.4 编译ijkPlayer 库

在前面的opensslffmpeg编译完毕后,最后编译ijkplayer的时候就比较简单了。通常不会出现什么大的问题。

zinyan@LAPTOP-141OG4MA:~/ijkplayer/android$ ./compile-ijk.sh all

编译全部库,最后输出效果如下:

image-20220223163153554

libijkffmpeg.solibijksdl.so, libijkplayer.so 文件拷贝使用就可以了。

4. 导入项目

将编译后的so文件,直接导入项目中。

效果如下:

image-20220223171151302

由于我使用了ijkproductFlavors了。所以引入的时候有ijk做前缀。

主要就是,可以远程依赖java代码。然后指令集的通过我们本地导入的就可以了

image-20220223171407117

最终实现了https 链接的数据源播放效果。

后记

还有很多地方并没有弄明白,之后了解更深入后再补上吧。

如果有需要编译成功后的so库,可以通过添加公众号留言:ijkplayer 获取我编译好的so库。(ps:主要给我的公众号拉一下关注。)

编译的so支持的视频协议如下:ftp,hls,http,https,rtmp,rtmpt,mp4,mov

4

评论区