今日科技快讯

2月24日,中兴手机宣布将在明天也就是2月25日,正式发布旗下首款5G旗舰手机,而此次他们是联合中国联通一起。 据悉,中兴将发布的5G手机是天机Axon 10 Pro,预计2019年上半年即可率先在欧洲和中国市场上市。目前,中国联通已经完成了5G网络第三个测试阶段,距离正式商用又近了一步。

作者简介

大家周一好,新的一周继续努力吧!

本篇来自 Overried 的投稿文章。文章分享了Android中 JNI开发中如何编译使用bilibili/ijkPlayer,希望对大家有所帮助。

Overried 的博客地址:

https://www.jianshu.com/u/75711cf32043

视频库播放库哪家强

视频播放库

bilibili/ijkplayer google/ExoPlayer VLC-Android
支持ffmpeg拓展 支持 不支持 嵌入ffmpeg 的 libavcodec库
可拓展性 低,需要二次开发
体积大小 5M-45M 无体积 13M
播放的视频格式 只要ffmpeg支持都支持 支持手机支持播放的 大多数易见视频
start 2.1W 1.2W GitLab 296个
issue 2116 Open/2318 Close 201 Open/4389 Close 169 Open/544 Close
是否持续维护 维护中 维护中 维护中

分析 ijkPlayer 构建流程

找到ijkplayer 的 github 主页

看了一下这目录结构,en .... ,果然没看懂,是不是越是庞大的项目,越是喜欢整这些让人摸不着头脑的目录结构要存放代码文件。(其实官方是为了模块化代码结构),那这个要从哪里入手。

先看简介 readme.md ,整理出下面一个流程图

构建 ijkplayer

按照 readme.md 的流程来

搭建 linux 环境

傻瓜式安装

  • 下载Ubuntu

  • 下载VMWare

搭建 JDK(linux) + Android SDK(linux + NDK(linux)
  • JDK
sudo apt-get install openjdk-8-kdk//配置环境变量:sudo gedit  /etc/profile export  JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
  • Android SDK(linux)

1)手动下载

2)进入目录 /androidSDK/sdk-tools-linux/tools/bin ,
执行 ./sdkmanager --list 命令看下有哪些目录可以下载:

接着拉必要的目录,执行以下命令

./sdkmanager "add-ons;addon-google_apis-google-24" "add-ons;addon-google_apis-google-24"  "platform-tools" "platforms;android-28" "tools"

3)配置环境变量

sudo gedit  /etc/profile export ANDROID_SDK=/home/jiong/androidSDK/android-sdk-linuxexport PATH=${PATH}:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools

下载 android-ndk-r14b-linux-x86_64.zip

sudo gedit  /etc/profile export ANDROID_NDK=/home/jiong/androidNDK/android-ndk-r14bexport PATH=$ANDROID_NDK:$PATH
手动下载 ijkpalyer ,并放到 ubuntu的任意一个目录下。
拉取 ijkpalyer JNI 和 ffmpeg 代码
cd ijkplayer-android./init-android.sh
拉取 openssl 代码
./init-android-openssl.sh
编译openssl代码
cd android/contrib./compile-openssl.sh clean./compile-openssl.sh all7、选择配置ffmpeg信息

选择配置ffmpeg信息
cd ../../cd configrm module.shln -s module-lite.sh module.sh//如果需要支持更多的视频格式用下面的配置// ln -s module-default.sh module.sh 
编译 ffmpeg 代码
cd ../cd android/contrib./compile-ffmpeg.sh clean./compile-ffmpeg.sh all

编译 ijkplayer jni 代码(依赖ffmpeg库)
cd .../compile-ijk.sh all

迁移 ijkplayer 到 android studio

拷贝 编译好的这个 /ijkplayer-android/android 目录,用android studio 导入这个工程(源码4.1G 有点大 )

看下主要库的大小-- 一共4.8M左右
跑起来:

但是结果发现 .avi .dv .asf的视频都不支持

修改 ffmpeg 的参数

//这里的配置换成下面的配置参数,这里是 linux 软引用表示 module.sh 文件名,代表了module-default.sh 文件//ln -s module-lite.sh module.shln -s module-default.sh module.sh 

编译ffmpeg脚本do-compile-ffmpeg.sh 文件里面有这么一句代码:

export COMMON_FF_CFG_FLAGS=.$FF_BUILD_ROOT/../../config/module.sh

我们来看一下两者的脚本有哪些不同:左边脚本支持的编码全开(默认),右边脚本,全部先关闭,再开几个支持的。

重新编译出 ffmpeg

使用全部开启的编译脚本,编译出 so 。46M ,果然够大

重新跑一下, avi 、asf 、dv都能播放了

如果每次都要在 linux 编译出  so ,再移到  android studio 上跑非常麻烦,如何把ijkpalyer 的jni 源码放到 android studio一键编译。看下面:

在linux 下观察 jni 文件夹有哪些文件,其中有两个是链接文件(右下角有个箭头),并且三个文件夹都是空文件,没有放置源码在里面。

android-ndk-prof 源码在以下文件夹(右键属性,可以看到真实文件的路径)

/ijkplayer-android/android-ndk-profiler-dummy/jni

ffmpeg 的 so 库文件,以及include 文件夹在以下文件夹(看complie-ffmpeg.sh 的脚本语言打包的输出路径)

/ijkplayer-android/android/contrib/build/ffmpeg-armv7a/output

ijkmedia源码在以下文件夹(右键属性,可以看到真实文件的路径)

/ijkplayer-android/ijkmedia

全部拷贝过去,ffmpeg 拷贝 so库以及头文件 过去即可,毕竟ffmpeg 一般不需要二次开发,有bug 等更新就可以,不然每次编译 十几分钟,太长。android-ndk-profiler-dummy 和ijkmedia模块就把源码拷贝过来。 结果位置见下图:

接下来需要修改 /jni/Android.mk,不然编译不过去:

旧代码

LOCAL_PATH := $(call my-dir)

MY_APP_JNI_ROOT := $(realpath $(LOCAL_PATH))MY_APP_PRJ_ROOT := $(realpath $(MY_APP_JNI_ROOT)/..)MY_APP_ANDROID_ROOT := $(realpath $(MY_APP_PRJ_ROOT)/../../../..)

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)MY_APP_FFMPEG_OUTPUT_PATH := $(realpath $(MY_APP_ANDROID_ROOT)/contrib/build/ffmpeg-armv7a/output)MY_APP_FFMPEG_INCLUDE_PATH := $(realpath $(MY_APP_FFMPEG_OUTPUT_PATH)/include)endififeq ($(TARGET_ARCH_ABI),armeabi)MY_APP_FFMPEG_OUTPUT_PATH := $(realpath $(MY_APP_ANDROID_ROOT)/contrib/build/ffmpeg-armv5/output)MY_APP_FFMPEG_INCLUDE_PATH := $(realpath $(MY_APP_FFMPEG_OUTPUT_PATH)/include)endififeq ($(TARGET_ARCH_ABI),arm64-v8a)MY_APP_FFMPEG_OUTPUT_PATH := $(realpath $(MY_APP_ANDROID_ROOT)/contrib/build/ffmpeg-arm64/output)MY_APP_FFMPEG_INCLUDE_PATH := $(realpath $(MY_APP_FFMPEG_OUTPUT_PATH)/include)endififeq ($(TARGET_ARCH_ABI),x86)MY_APP_FFMPEG_OUTPUT_PATH := $(realpath $(MY_APP_ANDROID_ROOT)/contrib/build/ffmpeg-x86/output)MY_APP_FFMPEG_INCLUDE_PATH := $(realpath $(MY_APP_FFMPEG_OUTPUT_PATH)/include)endififeq ($(TARGET_ARCH_ABI),x86_64)MY_APP_FFMPEG_OUTPUT_PATH := $(realpath $(MY_APP_ANDROID_ROOT)/contrib/build/ffmpeg-x86_64/output)MY_APP_FFMPEG_INCLUDE_PATH := $(realpath $(MY_APP_FFMPEG_OUTPUT_PATH)/include)endif

include $(call all-subdir-makefiles)

由于 jni 需要使用相对路径 ,去掉$(realpath),这里只保留armeabi-v7a改成:

LOCAL_PATH := $(call my-dir)MY_APP_ANDROID_ROOT := $(LOCAL_PATH)

MY_APP_FFMPEG_OUTPUT_PATH :=  $(MY_APP_ANDROID_ROOT)/ffmpeg/libMY_APP_FFMPEG_INCLUDE_PATH :=  $(MY_APP_ANDROID_ROOT)/ffmpeg/include

include $(call all-subdir-makefiles) //找到所有目录下第一层子目录的 android.mk 进行编译

ijkmedia 模块下面的第一层文件夹 凡是有 Android.mk 的,并且里面使用 $(realpath $(LOCAL_PATH)) 的,都要把 $(realpath)去掉。

好了在 android studio 编译起来:

跑起来,大功告成:

一步步带你编译哔哩哔哩ijkPlayer相关推荐

  1. 一条命令实现树莓派摄像头直播推流哔哩哔哩

    1 背景介绍 昨天,有师弟问我怎么实时采集视频并推流到直播平台,我告诉他这个很简单,于是给他推荐了一块创客神器小电脑--树莓派,讲了半个小时Raspbian Linux入门操作,然后让他先自己尝试摸索 ...

  2. 哔哩哔哩 Web 首页重构——回首2021

    本期作者 刘磊 高能链开放平台资深前端开发工程师 01 前言 在 2021 年时我们通过数据分析发现:在电脑端有越来越多用户的电脑屏幕切换成了大屏,现有 B 站的网页设计风格已经难以在宽屏设备上高效率 ...

  3. 小程序实战--仿bilibil(哔哩哔哩)小程序

    项目预览图 小程序?大改变? 之前就被朋友安利使用小程序,最近接近了小程序,发现了它竟然带来了一场"大革命". 简单说,它就是一个可以实现之前只能是原生态APP可以实现的效果和功能 ...

  4. 哔哩哔哩超大规模视频查重算法与工程优化实践

    本期作者 刘璟 哔哩哔哩高级算法工程师 齐竟雄 哔哩哔哩高级算法工程师 唐哲 哔哩哔哩高级算法工程师 李傲 哔哩哔哩资深算法工程师 一.需求背景 当前站内存在一定比例的UP主投稿重复.低编辑度的低创视 ...

  5. python爬取哔哩哔哩视频_荐爬取哔哩哔哩中的cosplay小视频

    爬取哔哩哔哩小视频 前言:想必大家都对小视频感兴趣吧,今天的爬虫的内容为将哔哩哔哩中的视频下载到本地,今天爬取的网站为 URL : https://vc.bilibili.com/p/eden/all ...

  6. 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 小白:师兄师兄,最近我在看SLAM的优化算法,有种方法叫" ...

  7. Java:一步步带你深入了解神秘的Java反射机制

    Java:一步步带你深入了解神秘的Java反射机制· 前言 在 Java中,反射机制(Reflection)非常重要,但对于很多开发者来说,这并不容易理解,甚至觉得有点神秘 今天,我将献上一份 Jav ...

  8. 哔哩哔哩面试经验分享

    一场突如其来的疫情席卷了上海,招聘季的金三银四也不复往年荣光.疫情,战争,坠机--2022年越来越魔幻了.今年的职场,旁人我不知道,身边的朋友都是求稳,同事也鲜有跳槽的.作为一名面试官,今年收到的简历 ...

  9. 电脑上下载哔哩哔哩的视频?

    电脑上下载哔哩哔哩的视频? 下面我们就一步步来演示如何使用. 第一步:下载安装python3.7(最新) 第二步:按住键盘上的"win+R"键,在打开的运行窗口中输入"c ...

最新文章

  1. 《ORACLE PL/SQL编程详细》,游标 ,函数,触发器。。
  2. 不要小看小小的 emoji 表情
  3. C++中const引用和非const引用的使用注意
  4. 这样才能使本地Mysql服务允许被外部主机连接(两步)
  5. LeetCode刷题实战(13):Roman to Integer
  6. stdout字符串过滤输出
  7. 雅虎中国,奇虎全面杀入威客领域
  8. MySQL8 Zip的下载和安装
  9. angularjs自动加载和手动加载
  10. 运营商管道的精细化运营之路
  11. 关于putty中的psftp、ftp上传下载的基本操作
  12. apache(Web服务器)
  13. 【LeetCode】算法初涉
  14. 如何旋转PDF文件页面,一分钟教你学会
  15. html标签的message,Message 消息提示
  16. 喵懂区块链23期|9012年了,侧链还是一只又死又活的薛定谔猫?
  17. Qt QLineEdit单行输入框用法详解
  18. 解决苹果无线鼠标、键盘或触控板无法被 Mac 识别的方法
  19. CNN Architecture
  20. 统计学名词解释 —— 2. 什么是「总体」和「样本」

热门文章

  1. qq发送消息连接服务器超时,QQ连接服务器超时,请重试,错误码0x00000001解决方法...
  2. 关于TPLINK路由器桥接(扩展信号范围)
  3. html名人名言页面,2018名人名言集锦
  4. matlab多缝衍射公式,多缝干涉仿真
  5. mysql var函数_请问关于sql里的var函数是干什么的?
  6. 如何在Visio中画精准的圆弧
  7. 看完《双子杀手》读后感
  8. 0x0000050蓝屏srvsys_分享蓝屏0x00000050提示srv.sys的解决方法
  9. 带你打造一套APM系统
  10. 阿里巴巴Java开发手册v1.2.0网页版