当前位置: 首页 > news >正文

ijkplayer 编译增加支持更多的音视频格式

ijkplayer是B站开源的一款基于ffmpeg的移动端播放器。但为了减少播放器的体积,很多音视频的格式播放默认都是不支持的,需要自己下载ijkplayer源码进行编译。这里以mac环境下android为例,简述ijkplayer的编译过程,以及为了支持更多音视频编码格式所要做的工作。mac环境下编译要稍微简便点,不需要安装虚拟机和linux操作系统。

一 编译ijkplayer源码

1 下载ijkplayer源码

https://github.com/Bilibili/ijkplayer

2 确保android studio开发环境环境

export ANDROID_NDK=/Users/xxx/Documents/Programs/android-ndk-r10e
export ANDROID_SDK=/Users/xxx/Library/Android/sdk

主要是android sdk和ndk路径要在环境变量中配置,配置的ndk版本最好要低点。

3 执行shell脚本,下载ffmpeg源码

在ijkplayer源码根目录下找到init-android.sh。 终端定位到ijkplayer到源码根目录,执行
./init-android.sh
可以用文本编辑器打开这个shell脚本。
里面到主要内容就是下载ffmpeg源码。执行完成后在ijkplayer源码根目录下extra目录下会多一个ffmpeg目录,

同时在android/contrib会多出如下5个文件夹。

 

jk实际编译libijkffmpeg.so时就是使用到对应架构目录下的ffmpeg源文件。

4 编译配置

在config目录下,共有3个默认的配置编译文件。
module-default.sh:支持的音视频解码器较多(编译出的so文件也比较大)。
module-lite-hevc.sh:支持hevc
module-lite.sh:支持较少的音视频解码器(默认情况下)
一般为了减少so体积,通常选择module-lite.sh。
执行
rm module.sh
ln -s module-lite.sh module.sh
类似于创建了一个快捷键。

5 编译ffmpeg,生成libijkffmpeg.so

进入 android/contrib 目录
5-1 清除ffmpeg的编译文件
执行
./compile-ffmpeg.sh clean

执行此操作后android/contrib/build/ffmpeg-armv7a/output目录下文件以及android/contrib/ffmpeg-armv7a目录中的一些编译中间成果物如.o文件也会删除(此处以armv7a架构为例说明)。

5-2 编译生成libijkffmpeg.so
执行
./compile-ffmpeg.sh armv7a
这里只编译armv7a架构,如果要编译所有架构,那么就把armv7a改为all。
如果出错,看控制台错误分析。
编译成功后会在android/contrib/build/ffmpeg-armv7a/output目录下生成libijkffmpeg.so。

6 编译ijkplayer生成libijkplayer.so libijksdl.so

进入android目录,执行
./compile-ijk.sh
生成libijkplayer.so和libijksdl.so库,至此编译过程全部完成,过程中总共生成3个so库libijkffmpeg.so libijkplayer.so以及libijksdl.so。

二 编译支持更多的音视频格式播放

ijkplayer默认支持的音视频编码格式可能并不一定能满足项目的需求,这时就需要自己去编译ijkplayer来支持更多音视频编码格式的解码播放。一般只需4步即可:

1 修改编译配置文件

进入config目录
以module-lite.sh为例,使用文本编辑器打开。

export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=pcm_alaw"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=pcm_mulaw"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mpeg4"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mp2*"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=ac3"

 

根据自己需要增加支持的音频格式,在文件中增加相应配置,例如需要增加MPEG4视频格式和G711音频编码格式的解码播放,则相应地enable-decoder mpeg4和pcm_alaw。

而如何知道需要增加何种的音视频格式支持,可以用ffmpeg的ffplay,直接播放一下视频,播放时会有音视频编码格式等相关信息。也可以用其它播放器在电脑上播放时查看媒体信息获知。

2 执行编译配置

还是在config目录中,执行
rm module.sh
ln -s module-lite.sh module.sh

3 编译ffmpeg,生成libijkffmpeg.so

进入android/contrib目录
先执行,如下命令,清除ffmpeg的编译文件
./compile-ffmpeg.sh clean
再执行
./compile-ffmpeg.sh armv7a
有前面可知,在android/contrib/build/ffmpeg-armv7a/output目录下会生成libijkffmpeg.so。这里只编译armv7a架构,如果要编译所有架构则将armv7a改成all,要编译其它架构则自己修改成对应的架构。

4 替换libffmpeg.so

libijkplayer.so及libijksdl.so这2个库可以不用重新编译。前者的功能主要是播放控制,以及调用ffmpeg库进行解码等,后者主要作用是视频渲染等。使用时不管是aar依赖还是gradle依赖,只要将libffmpeg.so库替换成自己编译生成的这个libffmpeg.so库就可以了。

相关文章:

ijkplayer 编译增加支持更多的音视频格式

ijkplayer是B站开源的一款基于ffmpeg的移动端播放器。但为了减少播放器的体积,很多音视频的格式播放默认都是不支持的,需要自己下载ijkplayer源码进行编译。这里以mac环境下android为例,简述ijkplayer的编译过程,以及为了支持更多…...

TOP命令显示完整命令行信息

TOP 在Linux系统中,可以使用top命令来查看系统的实时性能数据,包括CPU使用率、内存使用率、进程信息等。以下是top命令的常用选项: -d seconds:指定top命令的刷新时间,单位为秒。 -u username:只显示指定…...

Spring6从入门到精通 第一章 带你玩转Spring

这里写目录标题 一 Spring框架产生的原因二 Spring6配置的关键环节 一 Spring框架产生的原因 传统的JavaWeb存在着耦合度较高的问题,而且实现完整的的MVC三层架构,开发成本过大,因此出现了Spring这个轻量级的开发框架,相当于建筑里…...

Apache POI 实现用Java操作Excel完成读写操作

简介 Apache POI是一个用于操作Microsoft Office格式文件(包括xls、docx、xlsx、pptx等)的Java API库。POI全称为Poor Obfuscation Implementation,是Apache Software Foundation的一个开源项目。它提供了一组Java API,使得Java程…...

改善供应商关系的八种方法

与供应商保持良好关系的重要性有很多原因。最重要的是,它使每个人的日常工作更加愉快。它还可以为你获得更好的交易,有助于协作并增强商誉。 但是,每个供应商都是不同的,建立牢固的关系可能很棘手。本文将解释企业如何建立并操持…...

网络安全-CDN绕过寻找真实IP

网络安全-CDN绕过寻找真实IP CDN就是CDN加速,就是根据你的目标让你访问的更快 CDN CDN,即内容分发网络,主要解决因传输距离和不同运营商节点造成的网络速度性能低下的问题。说得简单点,就是一组在不同运营商之间的对接节点上的…...

牛客网 HJ28 素数伴侣【二分图匹配,匈牙利算法】困难

描述 若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的 N ( N 为偶数)个正整数中挑选出若干对组成“素数伴侣”&am…...

带你畅玩ChatGPT

ChatGPT出来很久了,最近不少朋友还是不太会使用ChatGPT体验与机器人进行聊天,我正好发现有种非常简单的方式帮助大家体验ChatGPT,且响应速度非常快,写代码能力也不错,现在推荐给大家,希望对大家有所帮助。 目录 一、下载专用浏览器 1.1 下载链接 1.2 安装浏览器 二、…...

ChatGPT探索系列之六:思考ChatGPT的未来发展趋势和挑战

文章目录 前言一、未来发展趋势1. ChatGPT重塑数据分析之道2. ChatGPT颠覆企业运用人工智能和机器学习的途径3. ChatGPT颠覆自动化商业流程4. ChatGPT引领企业决策迈向新纪元 二、ChatGPT掀开未来充满机遇和挑战的新篇章总结 前言 ChatGPT发展到目前,其实网上已经有…...

TryHackMe-Year of the Fox(Linux渗透测试)

Year of the Fox 你能熬过狡猾的狐狸吗? 端口扫描 循例nmap 有个域名,加入hosts SMB枚举 smbmap enum4linux -a,枚举到两个账户 Web枚举 进80发现需要登录 上hydra RCE to Getshell 进来可以查看一些文件 bp发现这里存在过滤 burpfuzz一…...

ChatGPT 如何获取API Key

什么是OpenAI API Key? OpenAI是ChatGPT的“开发商”,提供API使得开发者可以在自己的应用程序上调用OpenAI的相关服务(除了ChatGPT,OpenAI还有其他产品)。如果想调用OpenAI的产品服务在自己的应用程序上,我们就需要申…...

明面抵制,暗中布局 对于AI,马斯克的言行为何如此“割裂”?

最近,马斯克创建了一家叫做“X”的空壳公司,目标是将其打造成涵盖各方面的多功能应用集合平台,推特、SpaceX、特斯拉、Neuralink等公司业务都已打包加入其中。如今,“X”公司再添新丁——X.AI,即马斯克新成立的人工智能…...

【微服务中间件学习】redis基础及项目使用

背景 最近跟着大佬学习,发现之前都是一知半解,还是得系统学一下。 重温redis,有一下整理Redis是一种基于内存的高性能键值存储系统,它支持多种数据结构和持久化方式,并提供了许多高级功能,如发布/订阅、事…...

ORA-04021:等待锁定对象时发生超时

现场人员反馈问题,drop表报错,如下图 是个rac环境,处理过程 1、2个节点上查看锁表,没任何输出 SYSorcl2> select name from v$db_object_cache where ownerUSR_DATAI and type in(PROCEDURE,FUNCTION) and locks > 0 and …...

【华为OD机试真题 C++】1066 - 新工号中数字的最短长度 | 机试题+算法思路+考点+代码解析

文章目录 一、题目🔸题目描述🔸输入输出🔸样例1🔸样例2🔸样例3 二、代码参考 作者:KJ.JK 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f…...

【数字 IC / FPGA】 有关建立/保持时间计算的思考

引言 最近准备一些数字IC的机试,刷到了一些有关静态时序分析的题目。有一些比较经典的题目,在这里整理分享一下。 有什么疑问可以在评论区交流~互相进步 双D触发器典型电路 假设时钟周期为Tcycle,Tsetup,Thold分别为触发器建立保持时间,为…...

【Fluent】Run can not be started until validation issues are resolved.

一、问题背景 因为在fluent中用Discard Data, Replace Mesh选项替换了网格,但是没有抛弃算例设置等参数。 当时我以为网格是完全一样的,便忽略了产生冲突/错误的可能。 之后在calculate的时候,报错:Run can not be started unt…...

【进阶C语言】有关动态内存管理的经典笔试题(详细图文讲解)

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于C语言进阶系列,本专栏主要内容为数据的存储、指针的进阶、字符串和内存函数…...

1.Java系列之基础面试题总结

1. 构造器是否可重写 首先,构造器是不能被继承的,因为每个类的类名都不相同,而构造器名称与类名相同,所以根本谈不上继承。 又由于构造器不能继承,所以就不能被重写。但是,在同一个类中,构造器…...

Android:usb转232串口通信

准备工作 首先得adb进入盒子root模式,将/dev/ttys1这个文件改为777,使得所有用户可操作 adb root adb remount adb shell 进入设备的root模式,执行 chmod 777 /dev/ttys1 执行完成后退出 exit 再执行 adb shell chmod 666 /dev/ttyS1 如…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

<6>-MySQL表的增删查改

目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表&#xf…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

如何为服务器生成TLS证书

TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

网站指纹识别

网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

基于 TAPD 进行项目管理

起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...