如何复用ijkplayer库实现ffmpeg的功能

news2024/11/17 13:29:22

ijkplayer库介绍

现在ijkplayer播放器应用的非常广泛,很多播放器基本上都是基于ijkplayer二次迭代开发的,众所周知,ijkplayer是基于ffplay的,所以要使用ijkplayer,就必须使用三个so库。

jeffmony@JeffMonydeMacBook-Pro arm64-v8a % ls -hl
total 21240
-rwxr-xr-x  1 jeffmony  staff   9.6M  4 30 00:25 libijkffmpeg.so
-rwxr-xr-x  1 jeffmony  staff   348K  4 30 00:25 libijkplayer.so
-rwxr-xr-x  1 jeffmony  staff   474K  4 30 00:25 libijksdl.so

其中一个libijkffmpeg.so库非常大,有近9.6M,这个非常吓人了,当然你可以裁剪一些不用的库。

但是ijkplayer毕竟只是播放视频才用到的。但是ijkplayer底层是基于ffmpeg的ffplay播放框架,也就是说ffmpeg也集成到了libijkffmpeg.so中了。

这就有点意思了,那我们需要引用ffmpeg中的一些方法就不用额外的编译库了,直接使用libijkffmpeg.so中的文件就可以的。

  • 1.节省了空间大小,防止重复编译ffmpeg导致的包体积增大。

  • 2.native接口不用和ijkplayer的上层写在一起,可以单独写,完全不影响。

看一下这个提交: github.com/JeffMony/Pl…

  • 1.复用libijkffmpeg.so

  • 2.引入ffmpeg头文件

  • 3.编译生成新的so

利用ijkplayer中ffmpeg代码生成头文件

 

具体的build_ffmpeg.sh如下:

#!/bin/bash
export NDK_ROOT=/Users/jeffmony/tools/android-ndk-r14b # 修改自己本地的ndk路径
​
build() {
API=24
ARCH=$1
PLATFORM=$2
SYSROOT=$NDK_ROOT/platforms/android-$API/arch-$ARCH/
CROSS_PREFIX=$NDK_ROOT/toolchains/$PLATFORM-4.9/prebuilt/darwin-x86_64/bin/$PLATFORM-
PREFIX=$(pwd)/android/$ARCH #自己指定一个输出目录
rm -rf $(pwd)/android/$ARCH
​
echo "开始编译ffmpeg $ARCH so"
./configure \
--prefix=$PREFIX \
--disable-doc \
--enable-shared \
--disable-static \
--disable-x86asm \
--disable-asm \
--disable-symver \
--disable-devices \
--disable-avdevice \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--enable-small \
--enable-cross-compile \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--sysroot=$SYSROOT
}
​
# build armv7a
build arm arm-linux-androideabi
make clean
make -j4
make install
​
echo "完成ffmpeg $ARCH 编译..."
​
​
# build armv8a
build arm64 aarch64-linux-android
make clean
make -j4
make install
​
echo "完成ffmpeg $ARCH 编译..."

文末名片免费领取音视频开发学习资料,内容包括(C/C++,Linux 服务器开发,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

生成的目录中./android/arm/include 就是头文件

复用ijkplayer中的ffmpeg库

如果项目中使用到了ijkplayer库,也恰好需要使用ffmpeg库的功能,这时候不需要额外引入ffmpeg库了,可以直接使用ijkplayer提供的ffmpeg库,那就需要我们在编译的时候简单改造一下,使得libijkffmpeg.so可以被开发者复用。

 

 主要的操作步骤如下:

  • 新建一个cpp文件夹,将include文件夹拷贝到cpp下面

  • 新建CMakeLists.txt和jeffmony.cpp,jeffmony.cpp就是自定义的native方法

  • 修改build.gradle编译

build.gradle修改如下:

 

CMakeLists.txt修改如下:

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
​
# Sets the minimum version of CMake required to build the native library.
​
cmake_minimum_required(VERSION 3.4.1)
​
## libijkffmpeg.so
add_library(ffmpeg SHARED IMPORTED)
set_target_properties(ffmpeg PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libijkffmpeg.so)
​
include_directories(./include)
​
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
​
add_library( # Sets the name of the library.
        jeffmony
​
        # Sets the library as a shared library.
        SHARED
​
        # Provides a relative path to your source file(s).
        jeffmony.cpp)
​
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
​
find_library( # Sets the name of the path variable.
        log-lib
​
        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)
​
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
​
target_link_libraries( # Specifies the target library.
        jeffmony
        ffmpeg
        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

编译运行,生成了一个libjeffmony.so库。

具体的项目代码见:github.com/JeffMony/Pl…

ln -s $FF_PREFIX/include $FF_PREFIX/shared/include
ln -s $FF_PREFIX/libijkffmpeg.so $FF_PREFIX/shared/lib/libijkffmpeg.so
cp $FF_PREFIX/lib/pkgconfig/*.pc $FF_PREFIX/shared/lib/pkgconfig
for f in $FF_PREFIX/lib/pkgconfig/*.pc; do
    # in case empty dir
    if [ ! -f $f ]; then
        continue
    fi
    cp $f $FF_PREFIX/shared/lib/pkgconfig
    f=$FF_PREFIX/shared/lib/pkgconfig/`basename $f`
    # OSX sed doesn't have in-place(-i)
    mysedi $f 's/\/output/\/output\/shared/g'
    mysedi $f 's/-lavcodec/-lijkffmpeg/g'
    mysedi $f 's/-lavfilter/-lijkffmpeg/g'
    mysedi $f 's/-lavformat/-lijkffmpeg/g'
    mysedi $f 's/-lavutil/-lijkffmpeg/g'
    mysedi $f 's/-lswresample/-lijkffmpeg/g'
    mysedi $f 's/-lswscale/-lijkffmpeg/g'
done

可以保证libijkffmpeg的链接顺序是正确的。

音视频开发中使用ffmpeg的地方非常多, 播放场景/音视频编辑场景, 其中使用到ffmpeg核心模块是共通的, 本文的介绍就是告诉大家, 我们可以将不同的功能模块封在同一个ffmpeg库中, 帮我们节省空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL Server 和 MySQL Workbench安装

对于开发人员来说,只需要安装 MySQL Server 和 MySQL Workbench 这两个软件,就能满足开发的需要了。 ⚫ MySQL Server:专门用来提供数据存储和服务的软件。 ⚫ MySQL Workbench:可视化的 MySQL 管理工具,通过它&#…

会议信息管理系统SSM记录(四)

目录: (1)部门管理:查询-添加-删除 (2)部门管理:修改 (1)部门管理:查询-添加-删除 在DepartmentController中添加方法: 这里getAllDeps方法上篇…

Charles模拟弱网

Charles模拟弱网,适用PC端和移动端(IOS/Android) 1.打开Proxy->Throttle Settings,以charles 4.2版本为例 2.出现Throttling的界面 3.预设那里有Charles常用的网络设置模拟的数据,根据需要自己选择即可…

【js学习】闭包理解

闭包原理 js使用的是词法作用域,词法作用域的意味着函数执行使用的是定义函数时生效的变量作用域。即函数执行时,里面的参数访问跟执行函数时的作用域无关。如下代码2所示最后输出的是local scope。 闭包定义:js函数对象的内部状态不仅要包…

神经网络的基本工作原理——机器学习

目录 ​编辑 一、实验内容 二、实验过程 1、算法思想 2、算法原理 3、算法分析 三、源程序代码 四、运行结果及分析 五、实验总结 一、实验内容 掌握神经元细胞的数学模型;理解并掌握神经网络的训练过程;理解并掌握神经网络中的矩阵运算&#xff…

Neo4j入门实战

1.介绍 2.实战 Neo4j的sql语句 1.创建多个节点 CREATE (:student {name:小张,age:20}),(:student {name:彭莎丽,age:18})2.匹配节点将节点删除 这样删除是将student中的条件节点删除——>会变成空白节点 match (m:student {name:"Fairy同学"}) remove m:stu…

Docker数据管理

目录 一、数据卷 二、数据卷容器 三、容器互联 管理 Docker容器中数据主要有两种方式: 数据卷(Data Volumes)数据卷容器(DataVolumes Containers) 一、数据卷 数据卷是一个供容器使用的特殊目录,位于容…

设计模式之美——基于接口编程

抽象类在被继承时体现的是 is-a 关系,接口在被实现时体现的是 can-do 关系 例如,Plane can fly. Bird can fly,应该把 fly 定义成一个接口。 – 参考 《码出自效Java 开发手册》 函数的命名不能暴露任何实现细节。比如, uploadT…

集合类ArrayList的扩容机制详解

ArrayList类的内部对构造方法进行了重载,提供了无参构造和有参构造两种构造方法。在ArrayList类的内部维护了一个elementData数组用来存放添加的对象。(关于transient关键字:该关键字修饰的属性,不会进行串行化、序列化)。 目录 无参构造扩容…

胡编乱造的自我介绍

写在前面:这篇文章的内容纯属胡编乱造 切勿信以为真。 一、 姓:(Black) 布莱克 名:(Sirius) 天狼星 中间名:(Orion) 奥莱恩 结束! 二、于 2022年3月 入读清华大学信息技术系硕士 ! 结…

harbor 安装

harbor 安装一.离线安装helm1.下载安装包,上传到服务器2.解压4.验证二.安装harbor1.导入 Harbor源2.下载 Harbor Helm目录3.解压缩4.修改 Harbor Values文件5.部署 Harbor6.访问 Harbor7.验证8.修改daemon.json9.登录Harbor、并push镜像验证10.登录Harbor页面验证是…

基站交直流配电多回路无线智能电量采集监控装置

【摘要】介绍了安科瑞两款多回路无线智能电量采集监控装置,可应用于基站的交直流配电监控、低压出线开关柜集中监控、末端配电箱等集成电力参数监测、电能计量、环境温湿度监测以及无线传输的各类应用场景。 【关键词】无线监控;多回路监控;铁…

OpenFeign源码2-Bean注册过程和调用过程

0. 环境 nacos版本:1.4.1Spring Cloud : Hoxton.SR9(没用2020.0.2版本后面说明)Spring Boot :2.4.4Spring Cloud alibaba: 2.2.5.RELEASESpring Cloud openFeign 2.2.2.RELEASE 测试代码:github.com/hsfxuebao/s… 20…

深入理解java虚拟机:虚拟机类加载机制(1)

文章目录1. 类加载的时机2. 类加载的过程2.1 加载2.2 验证2.3 准备2.4 解析2.5 初始化1. 类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了: 加载(Loading)验证(Verif…

计算机网络-应用层(文件传输协议(FTP协议),电子邮件系统(SMTP协议,MIME,POP3,IMAP协议))

文章目录1. 文件传输协议2. 电子邮件系统1. 文件传输协议 文件传输协议: 文件传送协议FTP:提供不同种类主机系统(硬、软件体系等都可以不同)之间的文件传输能力。简单文件传送协议TFTP:使用于UDP环境,代码…

MyBatis-Plus入门案例

MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提供效率。 开发方式 基于MyBatis使用MyBatisPlus基于Spring使用MyBatisPlus基于SpringBoot使用MyBatisPlus SpringBoot它能快速构建Spring开发环境用以整合其…

设计模式之美——看似面向对象,实则面向过程

常见的编程范式或者说编程风格有三种,面向过程编程、面向对象编程、函数式编程,而面向对象编程又是这其中最主流的编程范式。现如今,大部分编程语言都是面向对象编程语言,大部分软件都是基于面向对象编程这种编程范式来开发的。 …

《Redis设计与实现》笔记

第二章:简单动态字符串 1.Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串( simple dynamic string,SDS)的抽象类型,并将SDS用作 Redis的默认字符串表示。 Redis里面,C字符串只会作为字符串…

操作系统第三章习题及答案(汤子瀛第四版)

第三章 1.高级调度与低级调度的主要任务是什么?为什么要引入中级调度? 答:高级调度的主要任务是根据某种算法,把外存上处于后备队列中的那些作业调入内存。低级调度是保存处理机的现场信息,按某种算法先取…

【UE4】打包失败 Failed to build UATTempProj.proj

我抄我自己之 https://zhuanlan.zhihu.com/p/586117443 前两天编 UE4.27 源码内存和CPU直接全是100%爆满,甚至还报错:c1060, the compiler is out of heap,设置虚拟内存也不不好使,发现16GB内存不配编 UE,火速换了64G之…